使用 grep 精确匹配,使用列表文件查找另一个文件

使用 grep 精确匹配,使用列表文件查找另一个文件

我有两个文件 - 一个包含一些 ID(文本文件),另一个包含 ID 和描述(选项卡文件)。

文件1:

31120
211890
542312

文件2:

chr10 31120 A T Descriptions
Chr11 131120 A T Descriptions
chr12 23765090 G C Descriptions
chr15 784930 A G Descriptions 

预期输出:

chr10 31120 A T Descriptions

当前输出:

Random selected columns some matching the file1 IDs and some not.

我正在使用grep -f file1 file2 > output.txt来匹配我的 IDfile1并从中提取他们的信息file2。然而问题在于,当我的 ID 为 31120 时。它会找到我的 ID,例如 31120、231120、311200 等。

由于我正在运行一个文件来查找另一个文件中的模式,因此我可以使用什么来使其特定于我的搜索,以便仅返回 31120。虽然在常规的单行 grep 搜索中很容易做到这一点,但我不知道在比较 2 个文件时如何做到这一点。

我尝试过使用grep -F -f file1 file2但没有用。

现在我使用了 grep -Fwf file1 file2,它也不起作用。

答案1

您只需添加-w即可匹配​​整个单词。由于您没有模式但有固定字符串,因此您可以添加-F.

$ grep -wFf file1 file2
chr10 31120 A T Descriptions

用于这项工作的另一个好工具是join,但默认情况下它会join先打印该字段,然后打印其余字段,这可能不是您喜欢的:

$ join -2 2 file1 file2
31120 chr10 A T Descriptions

-2 2表示第二个文件的连接字段为 2。

请注意,对于join,输入需要在连接字段上按词法排序。如果它们尚未排序并且您的 shell 支持进程替换(AT&T ksh、zsh、bash),您可以执行以下操作:

join -2 -2 <(sort -k1,1 file1) <(sort -k2,2 file2)

答案2

正如其他人建议的那样 grep -Fwf file1 file2 应该可以工作。

如果你想使用循环,请尝试

for i in `cat file1`; do  grep " "${i}" " file2; done

相关内容