表示されているタンパク質配列の最後までの行間にあるすべての行を、あるファイルから別のファイルにコピーするために grep を使用したいと思います/protein_id=
。たとえば、次の入力から:
CDS 448..1269
/gene="nptII"
/note="neomycin phosphotransferase II"
/codon_start=1
/product="kanamycin resistance protein"
/protein_id="AAQ05967.1"
/db_xref="GI:33320494"
/translation="MAITLSATSLPISARIRAGSPAAWVERLFGYDWAQQTIGCSDAA
VFRLSAQGRPVLFVKTDLSGALNELQDEAARLSWLATTGVPCAAVLDVVTEAGRDWLL
LGEVPGQDLLSSHLAPAEKVSIMADAMRRLHTLDPATCPFDHQAKHRIERARTRMEAG
LVDQDDLDEEHQGLAPAELFARLKARMPDGEDLVVTHGDACLPNIMVENGRFSGFIDC
GRLGVADRYQDIALATRDIAEELGGEWADRFLVLYGIAAPDSQRIAFYRLLDEFF"
regulatory 1443..2148
次のような出力が欲しいです:
/protein_id="AAQ05967.1"
/db_xref="GI:33320494"
/translation="MAITLSATSLPISARIRAGSPAAWVERLFGYDWAQQTIGCSDAA
VFRLSAQGRPVLFVKTDLSGALNELQDEAARLSWLATTGVPCAAVLDVVTEAGRDWLL
LGEVPGQDLLSSHLAPAEKVSIMADAMRRLHTLDPATCPFDHQAKHRIERARTRMEAG
LVDQDDLDEEHQGLAPAELFARLKARMPDGEDLVVTHGDACLPNIMVENGRFSGFIDC
GRLGVADRYQDIALATRDIAEELGGEWADRFLVLYGIAAPDSQRIAFYRLLDEFF"
入力は、 で始まる行regulatory
が他のものに置き換えられる可能性がある点で変化する可能性があることに注意してください。 変わらないのは、シーケンスが大文字で指定され、 で終わることです"
。 grep で可能ですか?
答え1
pcregrep
は、Perl 5 互換の正規表現を使用する grep ユーティリティです。Perl スタイルの正規表現には、標準の POSIX の正規表現にはない多くの便利な機能があります。これは基本的に grep と同じですが、正規表現の構文が異なります。
sudo apt-get install pcregrep
pcregrep -M .*'/protein_id=.*(\n|.)*\"' path/to/input-file
/protein_id
は開始検索用語であり、"
は終了検索用語です。
以下は、開始検索語と終了検索語の間にあるすべての行に対して複数行検索を実行するコマンドの一般的な例です。
pcregrep -M .*'START-SEARCH-TERM.*(\n|.)*END-SEARCH-TERM' path/to/SOURCE-FILE >> path/to/DESTINATION-FILE
どこ:
- SOURCE-FILEはデータを含むファイルです
- DESTINATION-FILEは結果がコピーされるファイルです
- START-SEARCH-TERMは検索開始語です
- END-SEARCH-TERMは終了検索語です
-M, --multiline
パターンが複数の行に一致することを許可します。
答え2
いいえ、複数行にまたがって一致させることはできません。 @karel が示すようgrep
に で一致させることはできますが、純粋なでは一致させることはできません。代わりに、タンパク質配列は常に大文字で で終わることがわかっているので、次のように一致させることができます。pcregrep
grep
"
sed
sed -n '/\/protein_id=/,/^\s*[[:upper:]]\+"\s*$/{p}' two_seq.txt
この
sed
パターンは、「と/foo/,/bar/{p}
の間のすべての行を印刷する」という意味です。 は通常の出力を抑制し、要求された行のみが印刷されます。 は一致演算子の一部であるため、 をエスケープする必要があることに注意してください ( ) 。 2 番目のパターンはもう少し複雑で、行の先頭で 0 個以上のスペース ( )、次に 1 個以上の大文字とそれに続く二重引用符 ( )、そして行末まで 0 個以上の空白文字 ( ) を検索します。foo
bar
-n
/
/protein_id=
\/
/
^\s*
[[:upper:]]"
\s*$
パール
perl -ne 'print if m#/protein_id=# ... m#[A-Z]+"\s*$#' file.flat
ここでも同じ考え方で、
...
演算子が範囲を指定し、2 つのパターン間の線が印刷されます。awk
awk '/\/protein_id=/{a=1}; a==1{print} /^\s*[[:upper:]]+"\s*$/{a=0}' file.flat
ここでは、行が最初のパターンに一致する場合は変数
a
を に設定し、最後のパターンに一致する場合は に設定しています。次に、 の場合は を出力するように指示します。が2 番目のパターンに対して に設定される前に が呼び出されるため、2 番目のパターンを含む行も含まれることになります。1
0
awk
a
1
print
a
0