2017-09-14 17 views
0

awk/NM/のパターンを持つ場合にのみ:p.=をそれぞれ$7に追加しようとしています。以下のようになります:が$7に1行しかない場合は、2行目のようになります。しかし、NM$7に複数ある場合、3行目のように:p.=が最後に追加されます。 ;を使用して、フィールド内に複数のNMを区切ります。私はコメントを追加しましたが、私が何をしていないのか分かりません。ありがとうございました :)。awkはフィールド内の各パターンにテキストを追加します

入力tab-delimited

R_Index Chr Start End Ref Alt Detail.refGene Gene.refGene 
1 chr1 948846 948846 - A dist=1 ISG15 
2 chr1 948870 948870 C G NM_005101:c.-84C>G ISG15 
3 chr1 948921 948921 T C NM_005101:c.-33T>C;NM_005101:c.-84C>G ISG15 
4 chr1 949654 949654 A G . ISG15 

AWK

awk ' 
    BEGIN { FS=OFS="\t" } # define FS and OFS as tab and start processing 
    $7 ~ /NM/ {   # look for pattern NM in $7 
     # split $7 by ";" and cycle through them 
      i=split($7,NM,";") 
      for (n=1; n<=i; n++) { 
       sub("$", ":p=", $7) # add :p. to end off each $7 before the ; 
    }  # close block 
}1' input # define input file 

電流出力tab-delimited

R_Index Chr Start End Ref Alt Detail.refGene Gene.refGene 
1 chr1 948846 948846 - A dist=1 ISG15 
2 chr1 948870 948870 C G NM_005101:c.-84C>G:p.= ISG15 
3 chr1 948921 948921 T C NM_005101:c.-33T>C;NM_005101:c.-84C>G:p.=p.= ISG15 
4 chr1 949654 949654 A G . ISG15 

所望の出力tab-delimited

R_Index Chr Start End Ref Alt Detail.refGene Gene.refGene 
1 chr1 948846 948846 - A dist=1 ISG15 
2 chr1 948870 948870 C G NM_005101:c.-84C>G:p.= ISG15 
3 chr1 948921 948921 T C NM_005101:c.-33T>C:p.=;NM_005101:c.-84C>G:p.= ISG15 
4 chr1 949654 949654 A G . ISG15 
+3

:これで

 i=split($7,NM,";") for (n=1; n<=i; n++) { sub("$", ":p=", $7) # add :p. to end off each $7 before the ; } 

を?それは機械でも人間に優しいものでもありません。 – karakfa

+0

申し訳ありませんが、私はコードをより読みやすくするためにインデントしましたが、残念なことにファイルタイプがこのように楽器から来ていました。ありがとうございました :)。 – Chris

+2

':p。='ネクタイでうずくまる? :D –

答えて

2

この置き換え:これらの恐ろしい形式を思い付く

 out="" 
     i=split($7,NM,/;/) 
     for (n=1; n<=i; n++) { 
      sub(/$/, ":p=", NM[i]) # add :p. to end off each NM[i] before the ; 
      out = (out=="" ? "" : out";") NM[i] 
     } 
     $7 = out 
関連する問題