データファイルがあります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.tsv
:20B
- inの対応する変異A.tsv
にすべての変異がある場合は、cladeという新しい列(最後の列の後ろ)に印刷します。 - inの行がinの行と異なるバリエーションを含む場合には問題になりません。 - ライン入力にinのすべてのバリエーションが含まれていない場合は何も印刷しません。結果(新しいファイルに保存)は次のとおりです。40A
B.tsv
A.tsv
Conclusion
40A
20B
A.tsv
40A
B.tsv
20B
A.tsv
40A
B.tsv
C.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内で一意である必要があります。そうしないと、常に最後の値が返されます。