awk 中的精确模式匹配

awk 中的精确模式匹配

我有一个 listA ,如下所示:

gene1
gene2
gene11
gene22
gene23

我还有一些制表符分隔的文本文件(*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),因此您的问题。

摆脱周围的 shell 循环,只需使用对 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

相关内容