比较文件并判断它们有多相似

比较文件并判断它们有多相似

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

例如,如果我有两个文件仅相差一个字符(例如,删除或更改了一个字符),则程序应该显示“文件 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(-)

相关内容