awkの特定の条件で2つのファイルの2つの列を比較する方法

awkの特定の条件で2つのファイルの2つの列を比較する方法

データファイルがありますA.tsv(フィールド区切り記号= \t)。

id  clade   mutation
243 40A titi,xixi,lolo
254 20B titi,toto,jiji,lala
261
267 20B lala,jiji,jojo

とテンプレートファイルB.tsv(フィールド区切り記号= \t):

40A titi,toto,lala
40F xaxa,jojo,huhu
40C sasa,sisi,lala

共通のcladeに基づいてA.tsvテンプレートの突然変異を比較したいと思いますB.tsv。 cladeが次の場合A.tsv20B- inの対応する変異A.tsvにすべての変異がある場合は、cladeという新しい列(最後の列の後ろ)に印刷します。 - inの行がinの行と異なるバリエーションを含む場合には問題になりません。 - ライン入力にinのすべてのバリエーションが含まれていない場合は何も印刷しません。結果(新しいファイルに保存)は次のとおりです。40AB.tsvA.tsvConclusion40A20BA.tsv40AB.tsv20BA.tsv40AB.tsvC.tsv

id  clade   mutation    Conclusion
243 40A titi,xixi,lolo  
254 20B titi,toto,jiji,lala 40A
261
267 20B lala,jiji,jojo  

私は次のように始めました:

awk 'BEGIN{ OFS=FS="\t" }
  NR==FNR{ clade[$1]=$2; next }         
  FNR==1{ print $0, "Conclusion"; next }    
  !($2 in clade){ print; next }         
  {                                     
     split($3 "," clade[$2], tmp, ",")  
     for (i in tmp)                     
       if (++num[tmp[i]] > 1)          
         ++count                      

     print $0, count                   
     delete num                      
     count=0                            
  }
' B.tsv A.tsv > C.tsv

しかし、残りはどうすべきかわかりません。良いアイデアがありますか?ありがとう

ベストアンサー1

awk 'BEGIN   { FS=OFS="\t" }
     NR==FNR { if($1=="40A") { cladeB=$1; mutB=$2; "nextfile" }; next }
     FNR==1 && mutB{ $4="Conclusion"; }

{ mutbak=mutB; split($3, muts, ","); for(x in muts) gsub(muts[x], "", mutbak) }
{ print $0, (mutbak ~ /^[[:blank:],]*$/ && $2=="20B" )?cladeB:""}' fileB fileA

文参照を解放しますnextfile(GNUの場合アッ次に、次のファイルを読みます(残りを続行したくない場合)文書B;また、「クレード=」も参照してください。40A"はfileB内で一意である必要があります。そうしないと、常に最後の値が返されます。

おすすめ記事