awkを使用して2つのファイルの2つの列を比較し、一致するアイテム数を印刷する方法

awkを使用して2つのファイルの2つの列を比較し、一致するアイテム数を印刷する方法

データファイルがあります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.tsvtotal_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

おすすめ記事