grep 循环:我使用一个文件的每一行作为查询来查找与另一个文件匹配的内容。为什么我的输出不一致?

grep 循环:我使用一个文件的每一行作为查询来查找与另一个文件匹配的内容。为什么我的输出不一致?

我有一个query_ids包含多行的文件,例如:

id1
id2
id3

我用来grep idx在 中查找 id 的匹配项my_file
我将这些匹配重定向到一个新matches文件。
我还使用grepwith 选项-v来获取重定向到mismatches文件的所有不匹配项。我正在使用这个小脚本:

#!/bin/bash


for i in $(cat query_ids)
do 
    # saving matches 
    grep "$i" my_file >> matches
    # saving mismatches
    grep -v "$i" my_file >> missing
done

我显然做错了什么:
当从文件中手动搜索一些 id 时missingmy_file我发现它们存在。
即使该文件应该只包含未在 I 中找到的missing文件中的 id,但我确实找到了匹配项。query_idsmy_file

因此,当选择一些随机 id 时,让我们说 id3 通过执行grep id3 missing并且grep id3 my_file都返回匹配项。 <br>

为什么我的代码将 id3 分配给mismatches文件?

  1. 我尝试删除周围的引号$i,但它并没有改变结果。
  2. 我还尝试echo "$i"确保 id 确实是循环的。

我缺少什么?

答案1

您所做的就是获取一个 ID,例如id1,然后将与该 ID 匹配的所有行提取到 中matches。然后提取所有行不是将其匹配到missing.

对于下一个 ID,,id2然后将与该 ID 匹配的行添加到matches,并将不匹配的行添加id2missing

现在,missing包含所有不包含 的行id1,然后包含所有不包含 的行id2。请注意,包含id1不包含的行将id2出现missing在循环的第二次迭代中。

相反,请同时考虑所有 ID:

grep -f query_ids -Fw    my_file >matches
grep -f query_ids -Fw -v my_file >missing

在这里,我提供grepquery_ids使用-f.我要求grep将 中 的行query_ids视为查询字符串(-F,即不是正则表达式),并将它们作为my_file整个单词进行匹配(-w,以便与id2例如 不匹配id23)。

第一个命令将提取包含任何 ID 的所有行。第二个命令将提取所有不包含 ID 的行。

这里不需要任何类型的循环。

相关内容