두 파일을 비교하고 유사성을 숫자로 표시할 수 있는 방법이 있습니까?
예를 들어, 한 문자만 다른 두 개의 파일이 있는 경우(예: 한 문자가 삭제되거나 변경된 경우) 프로그램은 "파일 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(-)