以下のように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