2017-08-02 9 views
1

転写物のエントリを持つファイルがあり、次の行が関連するエキソンです。時には、これは時々「n」のエクソンがあり、1つのエクソンので、一つの後続線であってもよいので、「n」はそうのような行目以降:印刷行+次の2行が一致する場合はawkを使って次の行

1  Cufflinks  transcript  63846957  63847511 
1  Cufflinks  exon 63846957  63847511 
1  Cufflinks  transcript  63851691  63852040  
1  Cufflinks  exon 63851691  63852040 
2  Cufflinks  transcript  8442356 8443964 
2  Cufflinks  exon 8442356 8442368 
2  Cufflinks  exon 8443768 8443964 
2  Cufflinks  exon 8444000 8444578 
2  Cufflinks  transcript  8258988 8259803 
2  Cufflinks  exon 8258988 8259271 
2  Cufflinks  exon 8259370 8259803 

Iは、転写物のみ関連するエクソンラインをプリントアウトしたいと思います転写物の後に2つのエキソンがある場合。この例では、抽出された最後の3本の線のみが存在する(転写産物1本とエキソン2本)。

これはどのようにawkで行うことができますか?

答えて

0

アレイ内に行を保存し、エキソンの数を確認したら印刷することができます。

#!/usr/bin/awk -f 

BEGIN { 
     number_of_exons = 0; 
} 

END { 
     print_if_two_exons(); 
} 

$3 == "transcript" { 
     print_if_two_exons(); 
     transcript = $0; 
} 

$3 == "exon" { 
     exons[number_of_exons++] = $0; 
} 

function print_if_two_exons() { 
     if (transcript && number_of_exons == 2) { 
       print transcript; 
       for (i = 0; i < number_of_exons; i++) { 
         print exons[i]; 
       } 
     } 
     delete exons; 
     number_of_exons = 0; 
} 

出力:

2  Cufflinks  transcript  8258988 8259803 
2  Cufflinks  exon 8258988 8259271 
2  Cufflinks  exon 8259370 8259803 
+0

感謝。コードを少し説明してもらえますか?私はまだ自分自身にbash/awkを教えようとしています。 – zoe

+1

私は可能な限りコードを読みやすく自明に保つようにしましたが、あなたの経験レベルによって異なります。あなたが持っている具体的な質問はありますか? –

+0

print_if_two_exons()が2回呼び出されると私は混乱していると思いますか? ENDの後に1回、$ 3 ==転写物の場合は1回ですか?私はnumber_of_exonsのデータがどのように埋め込まれるのかもよく分かりません。申し訳ありません、私はかなり初心者です。 – zoe

0
$ cat tst.awk 
/transcript/ { prt() } 
{ buf = buf $0 ORS; ++cnt } 
END { prt() } 
function prt() { 
    if (cnt == 3) { 
     printf "%s", buf 
    } 
    buf = "" 
    cnt = 0 
} 

$ awk -f tst.awk file 
2  Cufflinks  transcript  8258988 8259803 
2  Cufflinks  exon 8258988 8259271 
2  Cufflinks  exon 8259370 8259803 
0
$ cat awk-script 
function set_all(s,t,e) { 
    exon=e;tran=t;str=s 
} 
/transcript/{set_all($0,1,0)} 
/exon/{ 
    if(tran){ 
    if(exon<2) 
     set_all(str"\n"$0,tran,exon+1) 
    else 
     set_all("",0,0) 
    } else   
    set_all("",0,0) 
} 
END { 
    print str 
} 

$ awk -f awk-script file 
2  Cufflinks  transcript  8258988 8259803 
2  Cufflinks  exon 8258988 8259271 
2  Cufflinks  exon 8259370 8259803 

非常に簡単方法、および以下のように私はそれを説明します、の連続を記録するために、可変exontranを設定

  • 表示件数はですとtranscript、それぞれ
  • strの値を設定する機能set_allを宣言し、exon、およびtran
0

あなたがこれを行うにはPCREを使用することができます。

Rubyで

Demo

に:

$ ruby -e 'buf=$<.read 
     buf.scan(/.*transcript.*\n+.*exon.*\n.*exon.*\n(?=(?:.*transcript)|\z)/) 
      .each { |m| puts m }' 
2  Cufflinks  transcript  8258988 8259803 
2  Cufflinks  exon 8258988 8259271 
2  Cufflinks  exon 8259370 8259803 

たPerl:あなたの答えのためのPython、GNU grepの中に同様の

$ perl -0777 -lane 'while (/(.*transcript.*\n+.*exon.*\n+.*exon.*\n+)(?=(?:.*transcript)|\z)/g) {print $1;}' file 

など

関連する問題