我有两个文件 - 一个包含一些 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