比较两个文件的内容

SD_*_*_NZ 5 command-line diff

我有两个文件,其中包含来自两个硬盘驱动器的所有文件路径列表(应该完全相同),我认为其中一个文件丢失了。两个列表都有文件路径和大小,但列表的顺序不同(请参见下面的示例)。

有没有一个命令可以比较两个文件之间的差异并将差异输出到一个新文件?

例子:

文件 1:

/docs/red
/docs/blue
/docs/yellow
/docs/green
Run Code Online (Sandbox Code Playgroud)

文件_2:

/docs/blue
/docs/green
/docs/red
Run Code Online (Sandbox Code Playgroud)

差异_文件:

/docs/yellow
Run Code Online (Sandbox Code Playgroud)

αғs*_*нιη 8

使用grep而不需要对它们进行排序:

grep -Fxvf file2 file1 > diff_file
Run Code Online (Sandbox Code Playgroud)

将返回在file1但不在file2 中的行(在file2 中丢失的行)。

  • 此解决方案的问题在于,如果您有长文件(较长文件的长度为 O(N^2)),它会变得非常慢。首先排序并使用“diff”或“comm”之类的东西将是 O(N log N)。 (2认同)

小智 6

我会尝试使用排序和差异:

$ diff <(sort csv1.txt) <(sort csv2.txt)
4d3
< 
8d6
< /docs/yellow
Run Code Online (Sandbox Code Playgroud)

  • `colordiff` 使输出易于阅读,还添加了一些选项,因为 `-c` 是个好主意。您可以通过这种方式对文件进行动态排序:`colordiff -c &lt;(sort csv1.txt) &lt;(sort csv2.txt)` (2认同)

Col*_*ing 6

我通常使用 meld(这是一个非常有用的视觉差异工具)进行此类比较。

安装融合:

sudo apt-get install meld
Run Code Online (Sandbox Code Playgroud)

排序,然后比较:

sort csv1.txt > csv1-sorted.txt
sort csv2.txt > csv2-sorted.txt
meld csv1-sorted.txt csv2-sorted.txt 
Run Code Online (Sandbox Code Playgroud)

  • 使用 meld 的另一个好处是它还能够比较目录。由于您正在比较包含文件名的文本文件,因此您可能可以只对目录和文件本身运行 meld。 (2认同)