特定の単語から始まり、次の同様のブロック(次のような「セクションヘッダー」)まで行ブロックを削除します。

特定の単語から始まり、次の同様のブロック(次のような「セクションヘッダー」)まで行ブロックを削除します。

次の情報を含むファイルがあります。

     gene            3025..3855
                     /gene="Sp34_10000100"
                     /ID="Sp34_10000100"
     CDS             join(3025..3106,3722..3855)
                     /gene="Sp34_10000100"
                     /codon_start=1
                     /ID="Sp34_10000100.t1.cds1,Sp34_10000100.t1.cds2"
     mRNA            3025..3855
                     /ID="Sp34_10000100.t1"
                     /gene="Sp34_10000100"
     gene            12640..13470
                     /gene="Sp34_10000200"
                     /ID="Sp34_10000200"
     CDS             join(12640..12721,13337..13470)
                     /gene="Sp34_10000200"
                     /codon_start=1
                     /ID="Sp34_10000200.t1.cds1,Sp34_10000200.t1.cds2"
     mRNA            12640..13470
                     /ID="Sp34_10000200.t1"
                     /gene="Sp34_10000200"
     gene            15959..20678
                     /gene="Sp34_10000300"
                     /ID="Sp34_10000300"
     CDS             join(15959..16080,16268..16367,18913..19116,20469..20524,20582..20678)
                     /gene="Sp34_10000300"
                     /codon_start=1
                     /ID="Sp34_10000300.t1.cds1,Sp34_10000300.t1.cds2,Sp34_10000300.t1.cds3,Sp34_10000300.t1.cds4,Sp34_10000300.t1.cds5"
     mRNA            15959..20678
                     /ID="Sp34_10000300.t1"
                     /gene="Sp34_10000300"
     gene            22255..23085
                     /gene="Sp34_10000400"
                     /ID="Sp34_10000400"

すべて削除したい遺伝子部分的にはCDSそしてメッセンジャーRNA情報がそこにあるはずです。出力は次のようになります。

     CDS             join(3025..3106,3722..3855)
                     /gene="Sp34_10000100"
                     /codon_start=1
                     /ID="Sp34_10000100.t1.cds1,Sp34_10000100.t1.cds2"
     mRNA            3025..3855
                     /ID="Sp34_10000100.t1"
                     /gene="Sp34_10000100"
     CDS             join(12640..12721,13337..13470)
                     /gene="Sp34_10000200"
                     /codon_start=1
                     /ID="Sp34_10000200.t1.cds1,Sp34_10000200.t1.cds2"
     mRNA            12640..13470
                     /ID="Sp34_10000200.t1"
                     /gene="Sp34_10000200"
     CDS             join(15959..16080,16268..16367,18913..19116,20469..20524,20582..20678)
                     /gene="Sp34_10000300"
                     /codon_start=1
                     /ID="Sp34_10000300.t1.cds1,Sp34_10000300.t1.cds2,Sp34_10000300.t1.cds3,Sp34_10000300.t1.cds4,Sp34_10000300.t1.cds5"
     mRNA            15959..20678
                     /ID="Sp34_10000300.t1"
                     /gene="Sp34_10000300"

これを行う方法の提案を教えてください。

ベストアンサー1

awkは一般的に読みやすく理解しやすくなります。

これは基本的に書く簡単なプログラムです。最初の単語が「gene」である行を見ると、「wewrite」を「0」(=オフ、書き込みなし)に切り替え、次の場合に再びオンにします。彼が見た最初の言葉は「遺伝子」です。最初の単語が「CDS」または「mRNA」の行を参照してください。

awk '
  BEGIN                               { weprint=1 }

  ( $1 == "gene" )                    { weprint=0 }
  ( $1 == "CDS" ) || ( $1 == "mRNA" ) { weprint=1 }
  ( weprint == 1)                     { print $0 ;}

  '  file_to_read

BEGINは行を読み取る前に完了します。

もう 1 つは( test ) { action if test successful }各入力行を解析します (... タスクに が含まれていない場合、残りはnext無視して代わりに次の入力行を取得します)。

これにより、「遺伝子」部分ではなく「CDS」および「mRNA」部分のみが印刷されます。

これは「ゴルフボール」であってもよい。たとえば、成功した「テスト」のための基本的なタスクは$ 0を印刷することであるため、( weprint == 1)最後の行のようなものを実行できますが、私の考えでは理解するのはあまり明確ではありません...)

おすすめ記事