Uma abordagem poderia ser calcular a distância Levenshtein .
Aqui, usando o módulo Text::LevenshteinXS
perl
:
distance() {
perl -MText::LevenshteinXS -le 'print distance(@ARGV)' "$@"
}
Então:
$ distance foo foo
0
$ distance black blink
2
$ distance "$(cat /etc/passwd)" "$(tr a b < /etc/passwd)"
177
Aqui está uma implementação baseada em linha da distância de Levenshtein em awk
(calcula a distância em termos de número de linhas inseridas / excluídas / modificadas em vez de caracteres):
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
Você também pode estar interessado na saída de diffstat
:
$ diff -u /etc/passwd <(tr a b < /etc/passwd) | diffstat
13 | 114 ++++++++++++++++++++++++++++++++++-----------------------------------
1 file changed, 57 insertions(+), 57 deletions(-)