Comparando 2 (ou 3 arquivos se possível) “Linha por linha”

2

Eu quero descobrir as diferenças de 2 (ou 3 arquivos, se possível) linha por linha. Utilitários Diff podem fazer isso, no entanto, dá resultados imprecisos. Porque, 2 arquivos têm o número exato de linhas que é "134". Mas diff me dá "Adicionado linhas" e "linhas removidas". No entanto, isso está errado, eles têm exatamente o mesmo número de linhas, não há linhas adicionadas ou removidas.

Os arquivos de texto que eu quero encontrar diferenças deles, tem apenas números escritos, talvez seja por isso que o algortihm falha. Não encontrei nenhuma opção para evitar isso, mas posso estar errado, quero dizer que deveria haver uma opção para isso, mas, novamente, não consegui encontrar.

Isso é o que eu recebo (5 am.txt vs 6 am.txt, há um problema enorme):

Istoéoqueeuquero(6am.txtvs7am.txt,aindatemproblemas):

Editar:

Depois que eu descobri que não há utilidade para fazer isso, eu me comportei. Eu quase fiz a mesma coisa que o RedGrittyBrick fez. Este script imita o utilitário diff, então eu (ou você) pode usá-lo com o diff2html.

Para usá-lo com diff2html, basta alterar a linha

diff_stdout = os.popen("diff %s" % string.join(argv[1:]), "r")

para

diff_stdout = os.popen("script.py %s" % string.join(argv[1:]), "r")

e nomeie este script como você quiser (precisa de Python 2.x para executar, como diff2html):

import sys

f1=open(sys.argv[1],"r")
f1_read=f1.readlines()
f1.close()
f2=open(sys.argv[2],"r")
f2_read=f2.readlines()
f2.close()

changed={}
first_c = ""
for n in range(len(f1_read)):
    if f1_read[n]!=f2_read[n]:
        if first_c == "":
            first_c=n+1
        changed[first_c]=n+1
    else:
        first_c=""

#Let's imitate diff-utils...

for (x, y) in changed.items():
    print "%d,%dc%d,%d" % (x,y,x,y)
    for i in range(x,y+1):
        sys.stdout.write("< %s" % f1_read[i-1])
    print "---"
    for i in range(x,y+1):
        sys.stdout.write("> %s" % f2_read[i-1])

Resultados finais:

    
por PythEch 15.04.2012 / 15:30

2 respostas

3

diff assume que o segundo arquivo pode ter sido criado não apenas pela edição de linhas, mas também pela inserção e exclusão de linhas.

Se você quiser apenas saber quais linhas são diferentes sem considerar as linhas inseridas ou excluídas, use uma abordagem mais simples.

$perl d.pl a b | less
  1:   255,   107 DIFFERENT!
  2:   197,   148 DIFFERENT!
  3:   113,   165 DIFFERENT!
  4:     0,   221 DIFFERENT!
  5:     0,   153 DIFFERENT!
  6:     0,    85 DIFFERENT!
  7:    48,   255 DIFFERENT!
  8:    61,   187 DIFFERENT!
  9:    63,    85 DIFFERENT!
 10:     3,     0 DIFFERENT!
 11:    49,     0 DIFFERENT!
 12:    58,    15 DIFFERENT!
 13:    47,     0 DIFFERENT!
 14:    62,     0 DIFFERENT!
 15:    61,     0 DIFFERENT!
 16:   255,   255 same
 17:   255,   255 same
 18:   255,   255 same
 19:   255,   255 same
 20:   255,   255 same
 21:   255,   255 same

onde d.pl é

#!/usr/bin/perl
use strict;
use warnings;

open my $f1, '<', $ARGV[0] or die "Can't read '$ARGV[0]' - $!\n";
open my $f2, '<', $ARGV[1] or die "Can't read '$ARGV[1]' - $!\n";

while (my $f1_line = <$f1>) {
  my $f2_line = <$f2>;
  chomp for $f1_line, $f2_line;
  my $verdict = $f1_line eq $f2_line ? 'same' : "DIFFERENT!";
  printf "%3d: %5d, %5d %s\n", $., $f1_line, $f2_line, $verdict;
}

close $f2;
close $f1;
    
por 15.04.2012 / 17:03
2

Para comparar os arquivos lado-a-lado, minha ferramenta favorita é o Notepad ++ .

Após instalá-lo, na barra de ferramentas, clique em Plug-ins > Gerenciador de plug-ins > Disponível e marque Comparar e instalar.

Depois de reiniciar o Notepad ++, abra os dois arquivos (eles serão abertos em guias diferentes) e, na barra de ferramentas, acesse Plugins > Compare > Compare.

Existem vários ajustes que você pode fazer, mas comparar arquivos é algo assim:

onde o texto branco não é alterado, o vermelho é removido, o verde é adicionado e a barra lateral mostra uma visão geral dessas alterações nos dois arquivos.

    
por 15.04.2012 / 16:22