파일을 비교하고 얼마나 유사한지 확인

파일을 비교하고 얼마나 유사한지 확인

두 파일을 비교하고 유사성을 숫자로 표시할 수 있는 방법이 있습니까?

예를 들어, 한 문자만 다른 두 개의 파일이 있는 경우(예: 한 문자가 삭제되거나 변경된 경우) 프로그램은 "파일 X가 한 문자 다릅니다."와 같은 내용을 표시해야 합니다.

또는 두 줄이 다른 경우 "파일 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(-)

관련 정보