2017-07-08 4 views
1

では、$3SNV or MNV or INDELの場合、ヘッダー行とともに、行全体を印刷しようとしています。その条件が満たされているか、それは本当の、そして$4subパターン:GMAF=が発見されたとした場合=記号の後に値がチェックされます。その値が.01以下の場合は、ヘッダー行とともに行全体が出力されます。awkがキーワードで一致し、別のフィールドのサブパターンを確認する

$3が空白またはNULLにSNV$4することは可能であるので、その後、私もこれをキャプチャする方法を確認していません。 2行目はこれの例です。 $4に値がない場合、これはゼロと同じであるため、有意であり、抽出されると仮定します。私はまた、ヘッダー行から#を差し引いたものをプリントにどのように含めるかについてはわかりません。 ---はファイルの一部ではなく、ヘッダーを示すためのものです。私は各行にコメントを追加しました。ありがとうございました :)。

ファイルtab-delimited

##..... 
##..... 
#ID Name Func List  ---- header row ---- 
1 1 REF 
2 2 SNV 
3 3 SNV AMAF=0.0041:EMAF=0.0:GMAF=0.0014 

所望の出力tab-delimited

ID Name Func List 
2 2 SNV 
3 3 SNV AMAF=0.0041:EMAF=0.0:GMAF=0.0014 

AWK

awk -F'\t' -v OFS='\t' 'NR>3 # define FS and OFS as tab and look in 3 row of file 
     $3 == "SNV"|| $3 == "MNV"|| $3 == "INDEL"{ # start block and look in row 3 in`$2` for any of these words 
     sub(/:GMAF=*/,"",$4); # if found then search `$4` for `:GMAF=` 
     VAL=substr($4,RSTART+4,RLENGTH-4); 3 extract the 4 digits after the = sign as VAL 
              } # close block 
      for(i=1;i<=num;i++){ # create a loop to iterate over each line as i 
        if(VAL[i] <= 0.01){ 3 check each VAL in iand if less then or equal to 0.01 
        { # start block 
            print $1, $2, $3, VAL; # print output 
             } # end block 
       next # process next line 
       } # end block 
       1' file 
ただ理解しやすいように、上記のコードをフォーマットするエド・モートンが210

編集:

awk -F'\t' -v OFS='\t' '       # define FS and OFS as tab 
    NR>3           # and look in 3 row of file 

    $3 == "SNV" || $3 == "MNV" || $3 == "INDEL" { # start block and look in row 3 in`$2` for any of these words 
     sub(/:GMAF=*/,"",$4);      # if found then search `$4` for `:GMAF=` 
     VAL=substr($4,RSTART+4,RLENGTH-4);   3 extract the 4 digits after the = sign as VAL 
    }            # close block 

    for(i=1;i<=num;i++) {       # create a loop to iterate over each line as i 
     if(VAL[i] <= 0.01) {      3 check each VAL in iand if less then or equal to 0.01 
      {          # start block 
       print $1, $2, $3, VAL;    # print output 
      }          # end block 
      next         # process next line 
     }           # end block 
1' file 
+0

コードの流れを見ることがはるかに簡単ですので、私はあなたのスクリプトで空白とインデントを変更しました。これで、すべての構文と意味エラー(中かっこ、余分な中かっこ、コメント開始文字がないなど)を簡単に確認できるようになりました。問題を解決した後に戻ってきます。インデントと空白はソフトウェアでは非常に重要です。フォローするのに適した標準を見つけ、それを実行してください。ああ、組み込み変数との衝突を避けるために、すべての大文字の変数名を使用しないでください。 –

答えて

2

短い答え:

$4が解除/空白/非こと、既存のされている場合をキャッチしますフィールドの総数が3(NF==3

#をヘッダー行の前に削除するには、任意の代替技術(つまり、サブ)を使用することができます。私はテストでgensubを使用しました。

完全回答:
あなたのニーズに合ったようです。私はタブ区切りのファイルを使用していませんが、あなたはあなたのテーブルファイルに応じて調整することができます。

$ cat file4 
##..... 
##..... 
#ID Name Func List 
1 1 REF 
2 2 SNV 
3 3 SNV AMAF=0.0041:EMAF=0.0:GMAF=0.0014 
4 4 RNV AMAF=0.0041:EMAF=0.0:GMAF=0.0014 
5 5 SNV AMAF=0.0041:EMAF=0.0:GMAF=0.14 
6 6 INDEL 
7 7 RNV 
8 8 SNV GMAF=0.0041:EMAF=0.0:AMAF=0.0014 
9 9 SNV EMAF=0.0041:GMAF=0.1:AMAF=0.0014 

$ awk 'NR<3{next}NR==3{print gensub(/^#/,"","1");next}($3 == "SNV"|| $3 == "MNV"|| $3 == "INDEL") && NF==3{print;next}  
($3 == "SNV"|| $3 == "MNV"|| $3 == "INDEL") {val=gensub(/.*GMAF=(.[^:]*).*/,"\\1","g",$4);if (val<=0.1) print}' file4 
ID Name Func List 
2 2 SNV 
3 3 SNV AMAF=0.0041:EMAF=0.0:GMAF=0.0014 
6 6 INDEL 
8 8 SNV GMAF=0.0041:EMAF=0.0:AMAF=0.0014 
9 9 SNV EMAF=0.0041:GMAF=0.1:AMAF=0.0014 

説明:

awk 'NR<3{next}              # skip the first two lines 
    NR==3{print gensub(/^#/,"","1");next}       # print the third line (header) by removing the leading # 
    ($3 == "SNV"|| $3 == "MNV"|| $3 == "INDEL") && NF==3{print;next} # Print the lines missing $4 and go to next line  
    ($3 == "SNV"|| $3 == "MNV"|| $3 == "INDEL") {     # if $3 fullfils the criteria then 
     val=gensub(/.*GMAF=(.[^:]*).*/,"\\1","g",$4);     # isolate the value of GMAF with regex 
     if (val<=0.1) print;           # compare and print 
     }' file4 
+0

@Chrisアップデートを参照してください –

+1

@エドモートンあなたの貴重なご意見ありがとうございました。私はあなたのアドバイスのほとんどを含めて私の答えを更新しました。 –

+1

ようこそ。 $ 3 == "SNV" ||を使用しない理由は分かりません。 $ 3 == "MNV" || $ 3 == "INDEL" {IF(NF = 3!){ヴァル= gensub(/.* GMAF =([^:]。*)* /、 "\\ 1"、 "G"、$ 4)。 if(val> 0。1)next} print} 'または同様のコードを2回指定して保存します。 –

関連する問題