我想比较两个文本文件。通常,我只需diff
比较两个文件即可查看差异。这很好,但我更关心两个文件的百分比差异。
例如:
File A:
banana
TESTING
File B:
TESTING
在这种情况下,结果将有 50% 的差异。我查看了wdiff
,它基本上有效,但例外是它逐字查看元素(事实上,我可以通过执行 获得上述结果wdiff -s filea fileb
)。
是否存在一个工具可以提供按字符/字节级别的文件百分比差异?
答案1
对两个文本文件进行逐个字符的比较实际上是编辑距离计算。Linux 中没有一个常见的独立程序可以执行此计算,但有一些库函数(我知道 PHP 有一个)和大量在线示例代码可用于此计算。
另一个小警告是,Levenshtein 距离严格来说是两个字符串之间的变化次数,因此如果您要查找百分比,则需要对计算出的距离进行标准化。除以两个字符串长度(文本文件的大小)的平均值是一种广泛使用的标准化方法。
答案2
我在两组转录文件中遇到了类似的问题,我使用了 Levenshtein 距离,正如最多投票的答案中所建议的那样,但发现使用 python 是更好的选择。
pip install python-Levenshtein
代码如下:
import sys
from Levenshtein import *
txt1 = open(sys.argv[1]).read()
txt2 = open(sys.argv[2]).read()
print("distance:", distance(txt1,txt2))
使用:
python distance.py file1 file2
答案3
尝试将 diff 的输出通过管道传输到wc
命令。有多种选择,但-l
可能会为您提供更改行数的合理计数。由于 diff 输出的是行前和行后以及其他格式,因此您可能需要将结果除以该因子,然后将其放在整个文件长度(以行为单位)的结果上。wc -l
答案4
我建议差异:
❯ sdiff -B -b -s ~/temp/code_old.cpp ~/temp/code_new.cpp | wc
47 366 3685
^^ ~~~ number of changed lines
然后:
❯ cat ~/temp/code_old.cpp | wc
131 466 4388
^^^ ~~~ number of lines before change
然后:
❯ bc -l <<< "47./131.*100."
35.87786259541984732800
给出结果——代码改变了 35%。(计算行数)。