ファイルを比較し、どれくらい似ているかを確認する

ファイルを比較し、どれくらい似ているかを確認する

2つのファイルを比較して類似性を数値で表示する方法はありますか?

たとえば、1 文字だけ異なる 2 つのファイルがある場合 (たとえば、1 文字が削除または変更された場合)、プログラムは「ファイル X が 1 文字異なります」などの内容を表示する必要があります。

あるいは、2行が異なる場合は、「ファイルXが2行ほど異なります」と言います。

最良の出力は、「ファイルXはファイルYに95%似ています」と同じです。

答え1

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(-)

関連情報