grep 一个列表与另一个列表的内容

grep 一个列表与另一个列表的内容

我有 2 个文件,我想对它们进行 grep

列表1

ACY1
RPL3
RPL4

列表2

1   ABHD14A-ACY1
2   ACY1
3   RPL34
4   RPL21
5   RPL3
6   RPL41

我尝试过这样的事情

grep -Fwf list1.txt list2.txt并得到了这个

1   ABHD14A-ACY1
2   ACY1
5   RPL3

我的 list1 没有 ABHD14A-ACY1。 grep 有办法做到这一点吗?

谢谢

答案1

-w选项使grep整个单词匹配。不幸的是,由于破折号而ABHD14A-ACY1匹配。ACY1您可能想在模式文件中添加一个空格,例如

sed 's/^/ /' file1 | grep -Fwf- file2
2   ACY1
5   RPL3

答案2

-w开关返回构成整个单词的匹配项。

ABHD14A-ACY1它返回而不是返回的原因RPL41是因为ACY1is 位于第一行和第二行的末尾,而RPL4既不在任何行的开头或结尾,也不是后跟非单词组成字符,该字符表示除字母、数字之外的任何内容,或下划线。这在man的页面中有介绍grep

为了测试这一点,如果您在1第一行末尾添加 a ,使其为 ,1 ABHD14A-ACY11并从第六行末尾删除 1 ,使其为 ,那么6 RPL4您的输出将如下所示:

2   ACY1
5   RPL3
6   RPL4

没有办法不使用您拥有的确切命令或仅调用grep它自己来返回第一行。您必须将其通过管道传输sed以删除第一行:

grep -Fwf list1.txt list2.txt | sed '/ABHD14A/d'

或者将其通过管道传输到awk仅打印grep包含您不希望匹配的内容的行之后返回的内容:

grep -Fwf list1.txt list2.txt | awk 'NR>1'

或者通过管道将其输入 grep -v 以排除第一行:

grep -Fwf list1.txt list2.txt | grep -v ^1

还有其他方法可以做到这一点,但这些是最简单的,并且允许您仅通过管道传输已有​​的内容。

相关内容