awkの正確なパターンマッチング

awkの正確なパターンマッチング

以下のようにlistAがあります。

gene1
gene2
gene11
gene22
gene23

また、4番目の列がリストの遺伝子と一致するタブ区切りテキストファイル(* hist.txt)もあります。タブ区切りテキストファイルからlistAの各遺伝子値を抽出したいと思います。

これは私が書いたものです。

for i in `cat listA.txt`
do
    for a in *hist.txt
    do
        fn=${a%%_*}
        cat $a | awk -v OFS="\t" -v fn="$fn" -v pattern="$i" '$4 ~ pattern{print fn,$0}' >> ${i}_out.txt
    done
done

正確なパターンマッチングがないと、awkでパターンマッチングが失敗します。 gene1の出力にはgene11も含まれます。

ベストアンサー1

非常にあいまいなので、この文脈では「パターン」という言葉を使用しないでください。何を意味する場合でも、常に「文字列」または「正規表現」を使用してください(参照パターンに一致するテキストを見つける方法より多くの情報を知りたい場合)。

完全な文字列マッチングを実行したいように聞こえますが、正規表現演算子(~)と境界のない動的正規表現(pattern)を使用するので、質問があります。

周囲のシェルループを削除するには、awkに次の1回の呼び出しを使用します。

awk '
    BEGIN { FS=OFS="\t" }
    NR==FNR { genes[$1]; next }
    FNR==1 { fn=FILENAME; sub(/_.*/,"",fn) }
    $4 in genes { out=$4"_out.txt"; print fn, $0 >> out; close(out) }
' listA.txt *hist.txt

おすすめ記事