比较文件并判断它们的相似程度

Bar*_*own 4 diff

有没有办法比较两个文件并给出它们相似性的某种数字指示?

例如,如果我有两个仅相差一个字符的文件(例如,删除或更改了一个字符),则程序应该说“文件 X 相差 1 个字符”。

或者,如果两行不同,请说“文件 X 相差两行”。

最好的输出类似于“文件 X 与文件 Y 的相似度为 95%”

Sté*_*las 10

一种方法是计算Levenshtein 距离

这里使用Text::LevenshteinXS perl模块:

distance() {
  perl -MText::LevenshteinXS  -le 'print distance(@ARGV)' "$@"
}
Run Code Online (Sandbox Code Playgroud)

然后:

$ distance foo foo
0
$ distance black blink
2
$ distance "$(cat /etc/passwd)" "$(tr a b < /etc/passwd)"
177
Run Code Online (Sandbox Code Playgroud)

这是 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
Run Code Online (Sandbox Code Playgroud)

您可能还对diffstat的输出感兴趣:

$ diff -u /etc/passwd <(tr a b < /etc/passwd) | diffstat
 13 |  114 ++++++++++++++++++++++++++++++++++-----------------------------------
 1 file changed, 57 insertions(+), 57 deletions(-)
Run Code Online (Sandbox Code Playgroud)