Diff
比較文件並判斷它們的相似程度
有沒有辦法比較兩個文件並給出它們相似性的某種數字指示?
例如,如果我有兩個僅相差一個字元的文件(例如,刪除或更改了一個字元),則程序應該說“文件 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(-)