如何计算linux上两个文件之间的差异?

Zso*_*kai 48 shell diff count

我需要处理大文件,必须找到两者之间的差异.我不需要不同的位,但需要差异的数量.

要找到我想出的不同行数

diff --suppress-common-lines --speed-large-files -y File1 File2 | wc -l
Run Code Online (Sandbox Code Playgroud)

它有效,但还有更好的方法吗?

以及如何计算差异的确切数量(使用标准工具,如bash,diff,awk,sed一些旧版本的perl)?

Jos*_*osh 45

如果要计算不同的行数,请使用:

diff -U 0 file1 file2 | grep ^@ | wc -l
Run Code Online (Sandbox Code Playgroud)

约翰的回答不是重复计算不同的行吗?

  • 正如@khedron指出的那样,可以将批量连续的行组合在一个块中.通过我的计算,这意味着这种方法很容易计算不足. (9认同)
  • 您可以编写`grep -c ^ @`而不是`grep ^ @ | wc -l` (6认同)
  • "倾向于计算不足"是温和的 - 在两个完全不同的文件上运行此命令,它将给你1的结果. (5认同)
  • 在MacOSX和Ubuntu上,这似乎也可能会对我进行重复计算.成批的连续行可以在一个块中组合在一起,这取决于您的任务是否应该是一个或多个差异. (2认同)

Joh*_*ica 43

diff -U 0 file1 file2 | grep -v ^@ | wc -l
Run Code Online (Sandbox Code Playgroud)

对于diff列表顶部的两个文件名,减去2 .统一格式可能比并行格式快一点.

  • 正确的解决方案在这里https://unix.stackexchange.com/questions/53719/get-correct-number-of-lines-in-diff-output作为接受的答案 (6认同)
  • 这不起作用,因为我定义"工作"http://pastie.org/pastes/3179433/text每个文件中只有一个字符,数字"4"与什么有关? (5认同)
  • 这取决于你如何计算差异.在这个例子[pastie.org/5553254 ](http://pastie.org/5553254)中,我认为有两行不同,即我同意红杉mcdowell.必须从结果中减去2也是不方便的(由于打印了2个差异文件).因此,我认为Josh的答案是正确的.它可以通过在grep上使用-c(count)选项稍微缩短,而不是管道到wc -l,如下所示:`diff -U 0 file1 file2 | grep -c ^ @` (5认同)

dub*_*jim 5

如果使用Linux/Unix,那么如何comm -1 file1 file2在file1中打印不在file2中的行comm -1 file1 file2 | wc -l来计算它们,同样适用于comm -2 ...


小智 5

由于每个不同的输出行都以<>字符开头,我建议这样做:

diff file1 file2 | grep ^[\>\<] | wc -l
Run Code Online (Sandbox Code Playgroud)

通过在脚本行中仅使用\<或 ,\>您可以仅计算其中一个文件中的差异。