当我使用 file1 作为 file2 的模式时,为什么 grep 显示不同的结果,反之亦然?

当我使用 file1 作为 file2 的模式时,为什么 grep 显示不同的结果,反之亦然?

当我运行时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)

相关内容