awkを使用して同じ行に複数の一致を印刷する方法

awkを使用して同じ行に複数の一致を印刷する方法

こんにちは。テーブルファイルがあります(区切り記号= \tA.txt

205 toto patho
207 tata benign
208 titi likely_patho

そしてB.txt

210 lolo patho
211 lala benign
212 lili benign

3番目の列が「patho」または「likely_patho」の場合、2番目の列の値を印刷するファイルが必要です。この例では、次のようになります。

A toto;titi
B lolo

そのために、私は次のことをしました。

for bla in *.txt; do
r="$(basename -s ".txt" $bla)"
awk -v filename=$r '($3=="patho" || $3=="likely_patho") {print filename"\t"$2}' $bla >> result.txt ;
done

ただし、ファイルに複数の一致(たとえばA.txt)が含まれている場合、このコードは各一致に対して1行を提供します。

A toto
A titi
B lolo

どうすれば正しい出力を得ることができますか?ありがとう

ベストアンサー1

awkを使用してください。

$ cat tst.awk
BEGIN {
    split(t,tmp)
    for ( i in tmp ) {
        tgts[tmp[i]]
    }
    FS = OFS = "\t"
}
FNR == 1 {
    fname = FILENAME
    sub(/\.[^.]*$/,"",fname)
}
$3 in tgts {
    hits[fname] = (fname in hits ? hits[fname] ";" : "") $2
}
END {
    for ( fname in hits ) {
        print fname, hits[fname]
    }
}

$ awk -v t='patho likely_patho' -f tst.awk *.txt
A       toto;titi
B       lolo

おすすめ記事