データファイルがありますA.tsv
(フィールド区切り記号= \t
)。
id clade mutation
243 40A titi,toto,lala
254
267 40B lala,jiji,jojo
とテンプレートファイルB.tsv
(フィールド区切り記号= \t
):
40A lala,toto,xixi,xaxa
40B xaxa,jojo,huhu
40C sasa,sisi,lala
A.tsv
共通列(クレード)に基づいてテンプレートのバリエーションを比較し、次のように新しいB.tsv
ファイル()の新しい列で見つかった一致数を表示したいと思います。C.tsv
id clade mutation number
243 40A titi,toto,lala 2
254
267 40B lala,jiji,jojo 1
次のように2つのファイルを比較する方法を知っています。
awk -F"," -vOFS="," '
NR==FNR {
a[$2]=$3;
next
}
{ print $0,a[$2] }
' B.tsv A.tsv > C.tsv
しかし、一致を計算する方法がわかりません。良いアイデアがありますか?
2番目の質問:
.NETファイルにどれだけの突然変異があるかについての情報のみを含む新しい列を作成する方法を知りたいですB.tsv
。total_mut
次の列の例C.tsv
:
id clade mutation number total_mut
243 40A titi,toto,lala 2 4
254
267 40B lala,jiji,jojo 1 3
ベストアンサー1
GNUおよびawk
(単語境界アンカー)の使用:\<
\>
awk 'BEGIN{ FS=OFS="\t" }
NR==FNR{ mutations[$1] =$2; next }
{
split($3, muts, "," );
for(x in muts) { tmp=mutations[$2]; c+=sub( "\\<"muts[x]"\\>", "", tmp) }
}
FNR==1 { c="number" }
{ print $0, (c?c:""); c=0 }' fileB fileA
出力:
id clade mutation number
243 40A titi,toto,lala 2
254
267 40B lala,jiji,jojo 1
2番目のリクエストに対する回答が更新されました。
awk 'BEGIN{ FS=OFS="\t" }
NR==FNR{ mutations[$1] =$2; next }
{
split($3, muts, "," );
for(x in muts) { tmp=mutations[$2]; c+=sub( "\\<"muts[x]"\\>", "", tmp) }
m=1+gsub(",", "", tmp)
}
FNR==1 { c="number"; m="total_mut" }
{ print $0, (c?c:""), (m>1?m:""); c=m=0 }' fileB fileA
出力:
id clade mutation number total_mut
243 40A titi,toto,lala 2 4
254
267 40B lala,jiji,jojo 1 3