Compare os arquivos e diga como eles são semelhantes

4

Existe uma maneira de comparar dois arquivos e dar algum tipo de indicação numérica de sua similaridade?

Por exemplo, se eu tiver dois arquivos que diferem por apenas um caractere (digamos, um caractere foi excluído ou alterado), o programa deve dizer algo como "o arquivo X difere em 1 caractere".

Ou se duas linhas forem diferentes, diga "o arquivo X difere em duas linhas".

O melhor resultado seria algo como "Arquivo X é 95% semelhante ao arquivo Y"

    
por Barry Brown 20.03.2014 / 07:33

1 resposta

10

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(-)
    
por 20.03.2014 / 08:29

Tags