![比较文件并判断它们有多相似](https://linux22.com/image/51684/%E6%AF%94%E8%BE%83%E6%96%87%E4%BB%B6%E5%B9%B6%E5%88%A4%E6%96%AD%E5%AE%83%E4%BB%AC%E6%9C%89%E5%A4%9A%E7%9B%B8%E4%BC%BC.png)
有没有办法比较两个文件并给出它们相似性的某种数字指示?
例如,如果我有两个文件仅相差一个字符(例如,删除或更改了一个字符),则程序应该显示“文件 X 相差 1 个字符”之类的内容。
或者如果两行不同,则说“文件 X 相差两行”。
最好的输出类似于“文件 X 与文件 Y 相似度为 95%”
答案1
一种方法可能是计算编辑距离。
这里使用该Text::LevenshteinXS
perl
模块:
distance() {
perl -MText::LevenshteinXS -le 'print distance(@ARGV)' "$@"
}
然后:
$ distance foo foo
0
$ distance black blink
2
$ distance "$(cat /etc/passwd)" "$(tr a b < /etc/passwd)"
177
这是 Levenshtein 距离的基于行的实现awk
(根据插入/删除/修改的行数而不是字符数来计算距离):
awk '
{if (NR==FNR) s[++m]=$0; else t[++n]=$0}
function min(x, y) {
return x < y ? x : y
}
END {
for(i=0;i<=m;i++) d[i,0] = i
for(j=0;j<=n;j++) d[0,j] = j
for(i=1;i<=m;i++) {
for(j=1;j<=n;j++) {
c = s[i] != t[j]
d[i,j] = min(d[i-1,j]+1,min(d[i,j-1]+1,d[i-1,j-1]+c))
}
}
print d[m,n]
}' file1 file2
diffstat
您可能还对的输出感兴趣:
$ diff -u /etc/passwd <(tr a b < /etc/passwd) | diffstat
13 | 114 ++++++++++++++++++++++++++++++++++-----------------------------------
1 file changed, 57 insertions(+), 57 deletions(-)