Diff

比較文件並判斷它們的相似程度

  • March 20, 2014

有沒有辦法比較兩個文件並給出它們相似性的某種數字指示?

例如,如果我有兩個僅相差一個字元的文件(例如,刪除或更改了一個字元),則程序應該說“文件 X 相差 1 個字元”之類的內容。

或者,如果兩行不同,則說“文件 X 相差兩行”。

最好的輸出類似於“文件 X 與文件 Y 95% 相似”

一種方法是計算Levenshtein distance

這裡使用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(-)

引用自:https://unix.stackexchange.com/questions/120529