あるファイルから別のファイルに複数の行をコピーする

あるファイルから別のファイルに複数の行をコピーする

表示されているタンパク質配列の最後までの行間にあるすべての行を、あるファイルから別のファイルにコピーするために 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に で一致させることはできますが、純粋なでは一致させることはできません。代わりに、タンパク質配列は常に大文字で で終わることがわかっているので、次のように一致させることができます。pcregrepgrep"

  1. sed

    sed -n '/\/protein_id=/,/^\s*[[:upper:]]\+"\s*$/{p}' two_seq.txt
    

    このsedパターンは、「と/foo/,/bar/{p}の間のすべての行を印刷する」という意味です。 は通常の出力を抑制し、要求された行のみが印刷されます。 は一致演算子の一部であるため、 をエスケープする必要があることに注意してください ( ) 。 2 番目のパターンはもう少し複雑で、行の先頭で 0 個以上のスペース ( )、次に 1 個以上の大文字とそれに続く二重引用符 ( )、そして行末まで 0 個以上の空白文字 ( ) を検索します。foobar-n//protein_id=\//^\s*[[:upper:]]"\s*$

  2. パール

    perl -ne 'print if m#/protein_id=# ... m#[A-Z]+"\s*$#' file.flat 
    

    ここでも同じ考え方で、...演算子が範囲を指定し、2 つのパターン間の線が印刷されます。

  3. awk

    awk '/\/protein_id=/{a=1}; a==1{print} /^\s*[[:upper:]]+"\s*$/{a=0}' file.flat 
    

    ここでは、行が最初のパターンに一致する場合は変数aを に設定し、最後のパターンに一致する場合は に設定しています。次に、 の場合は を出力するように指示します。が2 番目のパターンに対して に設定される前に が呼び出されるため、2 番目のパターンを含む行も含まれることになります。10awka1printa0

関連情報