当我运行时grep -m 1 -Fnxvf file1 file2
,对于一些文件,我得到的行号与运行时不同grep -m 1 -Fnxvf file2 file1
(交换文件)。
为什么?
我已将文件缩减为最小的示例。
文件1
Pp: 1 Id pezzo 193 posIn = { x = 132, y = 1432 }
Pp: 1 Id pezzo 193 posIn = { x = 136, y = 1432 }
Pp: 1 Id pezzo 193 posIn = { x = 84, y = 1436 }
Pp: 1 Id pezzo 193 posIn = { x = 88, y = 1436 }
文件2
Pp: 1 Id pezzo 193 posIn = { x = 132, y = 1432 }
Pp: 1 Id pezzo 193 posIn = { x = 84, y = 1436 }
Pp: 1 Id pezzo 193 posIn = { x = 88, y = 1436 }
Pp: 1 Id pezzo 193 posIn = { x = 92, y = 1436 }
我得到的结果:
$ grep -m 1 -Fnaxvf file2 file1
2:Pp: 1 Id pezzo 193 posIn = { x = 136, y = 1432 }
$ grep -m 1 -Fnaxvf file1 file2
4:Pp: 1 Id pezzo 193 posIn = { x = 92, y = 1436 }
第一个结果正是我所期望的,但在第二种情况下,我期望看到(通常是这样),file2
.
长解释
我试图找到(并显示)两个文件之间的第一个差异。我想展示仅有的第一个区别,以及它发生的位置。
我发现了这回答SO(看看我对答案的评论),它似乎有效,但对于一些文件,我注意到上面显示的奇怪行为。
答案1
TLDR:您不能保证 grep 会按顺序使用您的模式。
假设您有两个包含以下内容的文件(每行一个字母,为了便于阅读,我折叠起来)
文件1
A B D E
和
文件2
A B C D
- 文件 1 中第 2 组 (ABCD) 中第一个排除的(因为您使用 -v )字母是 E。
- 文件 2 中集合 1 中第一个排除的字母是 C。
文件的比较通常是:
cmp file1 file2
对于二进制文件,当您不关心 diff 时(您甚至可以使用 cmp -s (静默))diff file1 file2
它显示了从 file1 到 file2 的伪 sed 代码(diff file2 file1 非常对称)comm -123 file1 file2
显示 file1 (-1) 和 file2 (-2) 中的公共行 (-3)