如何从一个字符串列表的文件中使用grep精确匹配字符串?

4

我有一个文件A,其中一列是像这样的字符串列表:

ADAMTS9
AIP
....

我想使用文件A中的字符串在文件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 

它能够抓取上面的所有三行。然而,我只想抓取前两行,并且第三行中的AIP-S1与AIP不是完全匹配。

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

谢谢。

2个回答

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

2

您正在使用-w进行整词搜索。问题在于,在“AIP-S1”中,“-”字符不是一个单词字符。因此,“AIP”被认为是一个完整的单词。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接