我想比较两个文件的值,但不基于位置或顺序

我想比较两个文件的值,但不基于位置或顺序

假设我有两个文件,内容如下:

$ cat File1.txt
Apple
orange
watermelon
avocado
lime
$ cat File2.txt
orange
Apple
lime 
watermelon
avocado

基本上没有区别,因为两者具有相同的值。我正在使用diff命令:

diff File1.txt File2.txt

它显示文件因值放错位置而不同,在我的情况下,我要求它不应该显示差异。还有什么其他方法可以实现这一目标,欢迎任何建议。

答案1

比较排序后的文件。

在 bash(或 ksh 或 zsh)中,使用流程替代

diff <(sort File1.txt) <(sort File2.txt)

简单来说:

sort File1.txt >File1.txt.sorted
sort File1.txt >File2.txt.sorted
diff File1.txt.sorted File2.txt.sorted

要快速查看排序文件之间的差异,comm可能很有用:它直接显示一个文件中的行,但不显示另一个文件中的行。

comm -12  <(sort File1.txt) <(sort File2.txt) >common-lines.txt
comm -23  <(sort File1.txt) <(sort File2.txt) >only-in-file-1.txt
comm -13  <(sort File1.txt) <(sort File2.txt) >only-in-file-2.txt

如果同一文件中重复一行,则上述命令坚持两个文件具有相同的重复次数。如果你想治疗

foo
bar
foo

与……相同

bar
foo

然后在排序时删除重复项:使用sort -u而不是sort.

如果您保存一个文件的输出sort并稍后在另一个文件可用时使用它,请注意这两个文件必须在同一区域设置中排序。如果这样做,您可能应该按字节顺序排序:

LC_ALL=C sort File1.txt >File1.txt.sorted

答案2

首先对文件进行排序(在 中bash):

diff <(sort file1) <(sort file2)

答案3

使用 awk,您可以使用如下命令为每个不同的输入行文本创建哈希索引:

awk 'The magic' Q=A fileA Q=B fileB Q=C fileC ...

每个输入行的“魔力”是:

{ X[$0] = X[$0] Q; }

当到达 END 条件时,您将迭代 X 的索引。每个文件中仅出现一次的任何行将类似于:

X["Apple"] = "ABC";

在 fileA 中出现一次、在 fileC 中出现 3 次的行将显示为“ACCC”。您可以按照您喜欢的方式报告任意数量的文件的任何异常情况。 (我曾经不得不对在主服务器和备用服务器上运行的安全关键系统进行 14 路比较,每个服务器都有一个实时数据库和 Oracle 数据库。)

如果您选择在每个标签上包含行号 NR,并编写一些有趣的模式,则可以使标签如下所示:

X["Walrus"] = "A347B38C90"

并报告哪些匹配文本位于各个文件的哪些行上。

相关内容