如何让grep -F -f找到另一个文件中缺少的行

时间:2014-08-14 08:15:18

标签: regex grep

首先我创建两个文件:

echo -en {1..100..3}"\n" > file1; echo -en {1..100..5}"\n" > file2

然后

grep -v -F -f file1 -- file2 >> file3; cat file3 >> file1; rm file3

然后

grep -v -F -f file2 -- file1 >> file3; cat file3 >> file2; rm file3

grep -v -F -f file1 -- file2grep -v -F -f file2 -- file1不返回任何内容

但是像13,19,64,67,100这样的数字仍然只在file1中,为什么?

如果你看一下grep -v -F -f file1 -- file2的输出和 在合并尝试之前grep -v -F -f file2 -- file1这些数字是

如果我使用像IFS=$(echo -en "\n\b") && for a in $(cat <file 1>); do ((\!$(grep -F -c -- "$a" <file 2>))) && echo $a; done && unset IFS这样的东西,那就行了。

更新答案是将-x标志添加到grep进行锚定,感谢Tripleee:

$ echo -en {1..100..3}"\n" > file1; echo -en {1..100..5}"\n" > file2
$ grep -x -v -F -f file1 -- file2 >> file3; cat file3 >> file1; rm file3
$ grep -x -v -F -f file2 -- file1 >> file3; cat file3 >> file2; rm file3
$ grep 13 *

file1:13 file2:13

之前没有

$ echo -en {1..100..3}"\n" > file1; echo -en {1..100..5}"\n" > file2
$ grep -v -F -f file1 -- file2 >> file3; cat file3 >> file1; rm file3
$ grep -v -F -f file2 -- file1 >> file3; cat file3 >> file2; rm file3
$ grep 13 *

file1:13

2 个答案:

答案 0 :(得分:2)

使用-w告诉grep比较单词实现正确的合并。

我用你的例子文件做了这样的测试:

grep -v -w -f file1 file2 >> file1
grep -v -w -f file2 file1 >> file2
grep -v -w -f file1 file2

为了确保我对文件进行了排序:

sort -h file1 > f1
sort -h file2 > f2

并且diff -u f1 f2没有给出任何内容我确保diff -y f1 f2

是正确的

如果您可以详细说明您的用例,我可以改进这个答案。

如果您正在谈论tittle中的行,则-x标志而不是-w可能是您正在寻找的内容。

答案 1 :(得分:0)

如果没有锚定,只要搜索模式是输入的子字符串,grep就会找到匹配项。添加-x选项以更改它。然后只有在模式匹配整个输入行时才会报告匹配。