我有两个几乎相同的文件,“foo” 和 “bar”。
每个文件有数千行,每行一个数字。
如果我sort
然后同时处理diff
两个文件,结果如下:
$ diff foo bar
5984a5985,5986
> 15676
> 15677
7703,7706d7704
< 17486
< 17487
< 17488
< 17489
但是,如果我grep -Fvf
同时提交两个文件,则两个方向上的“不匹配”均为零:
$ grep -Fvf foo bar
$ grep -Fvf bar foo
$
这是为什么?我不应该得到类似于 diff 的结果吗?我希望第一个命令返回 diff 上值的“前半部分”,第二个 grep 命令返回其余部分。
为什么我没有得到预期的结果?
答案1
因为diff
,grep -Fvf
与线条出现的顺序很重要。此外,由于-x
grep 命令中不包含该选项,因此仅包含部分匹配被排除在输出之外。
可重现的示例
考虑这两个文件:
$ cat foo
156
174
15676
17486
17487
$ cat bar
15677
15678
156
174
15676
该diff
命令显示它们不同,但grep
命令没有产生任何输出:
$ diff foo bar
0a1,2
> 15677
> 15678
4,5d5
< 17486
< 17487
$ grep -Fvf foo bar; grep -Fvf bar foo
如果我们添加-x
需要全行匹配,那么 grep 会产生:
$ grep -Fvxf foo bar
15677
15678
$ grep -Fvxf bar foo
17486
17487
附加建议
作为阿布利格在评论中提出建议,diff -u
提供更多上下文,可以使输出更容易理解。