我有 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
是因为ACY1
is 位于第一行和第二行的末尾,而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
还有其他方法可以做到这一点,但这些是最简单的,并且允许您仅通过管道传输已有的内容。