我有一个query_ids
包含多行的文件,例如:
id1
id2
id3
我用来grep idx
在 中查找 id 的匹配项my_file
。
我将这些匹配重定向到一个新matches
文件。
我还使用grep
with 选项-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 时missing
,my_file
我发现它们存在。
即使该文件应该只包含未在 I 中找到的missing
文件中的 id,但我确实找到了匹配项。query_ids
my_file
因此,当选择一些随机 id 时,让我们说 id3 通过执行grep id3 missing
并且grep id3 my_file
都返回匹配项。 <br>
为什么我的代码将 id3 分配给mismatches
文件?
- 我尝试删除周围的引号
$i
,但它并没有改变结果。 - 我还尝试
echo "$i"
确保 id 确实是循环的。
我缺少什么?
答案1
您所做的就是获取一个 ID,例如id1
,然后将与该 ID 匹配的所有行提取到 中matches
。然后提取所有行不是将其匹配到missing
.
对于下一个 ID,,id2
然后将与该 ID 匹配的行添加到matches
,并将不匹配的行添加id2
到missing
。
现在,missing
包含所有不包含 的行id1
,然后包含所有不包含 的行id2
。请注意,包含id1
不包含的行将id2
出现missing
在循环的第二次迭代中。
相反,请同时考虑所有 ID:
grep -f query_ids -Fw my_file >matches
grep -f query_ids -Fw -v my_file >missing
在这里,我提供grep
了query_ids
使用-f
.我要求grep
将 中 的行query_ids
视为查询字符串(-F
,即不是正则表达式),并将它们作为my_file
整个单词进行匹配(-w
,以便与id2
例如 不匹配id23
)。
第一个命令将提取包含任何 ID 的所有行。第二个命令将提取所有不包含 ID 的行。
这里不需要任何类型的循环。