如何从字符串列表的文件中grep完全匹配

时间:2014-02-27 16:55:47

标签: bash grep

我有一个文件A,其中一列包含如下字符串列表:

ADAMTS9
AIP
....

我想使用文件A中的字符串来grep文件B中包含它们的行,文件B如下所示:

chr13   50571142        50592603        ADAMTS9  21461   +
chr19   50180408        50191707        AIP   11299   +
chr19   50180408        50193000        AIP-S1   6532    -

我用过:

grep -F -i -w -f A B 

它能够上面所有3行。但是,我只希望前两行是grep'ed而第三行与AIP-S1并不完全匹配AIP ..

有人可以告诉我如何修复命令吗?

感谢。

2 个答案:

答案 0 :(得分:3)

您可以改用awk:

awk 'FNR==NR{a[$1];next} ($4 in a)' A B
chr13   50571142        50592603        ADAMTS9  21461   +
chr19   50180408        50191707        AIP   11299   +

要搜索任何字段:

awk 'FNR==NR{a[$1];next} {for (i=1; i<=NF; i++) if ($i in a) print}' A B

答案 1 :(得分:2)

您正在使用-w进行全字搜索。麻烦的是,在“AIP-S1”中,“ - ”字符不是一个字符。所以“AIP” 被发现为一个完整的单词。

这个疯狂的命令可以将模式文件转换为包含“类字边界”模式:

$ grep -if <(sed 's/^/\\(^\\|[[:space:]]\\)/; s/$/\\($\\|[[:space:]]\\)/' A) B
chr13   50571142        50592603        ADAMTS9  21461   +
chr19   50180408        50191707        AIP   11299   +