Quero descobrir as diferenças de 2 (ou 3 arquivos, se possível) linha por linha. Os utilitários Diff podem fazer isso, mas fornecem resultados imprecisos. Porque 2 arquivos têm um número exato de linhas que é "134". Mas diff me dá "Linhas Adicionadas" e "Linhas Removidas". Porém 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 desejo encontrar diferenças entre eles têm apenas números escritos, talvez seja por isso que o algoritmo falha. Não consegui encontrar nenhuma opção para evitar isso, mas posso estar errado, quero dizer, deveria haver uma opção para isso, mas, novamente, não consegui encontrar.
Isto é o que recebo (5h.txt vs 6h.txt, há um grande problema):
Isso é o que eu quero (6h.txt vs 7h.txt, ainda tem problemas):
Editar:
Depois que descobri que não há utilidade para fazer isso, resolvi sozinho. Quase fiz a mesma coisa que RedGrittyBrick fez. Este script imita o utilitário diff para que eu (ou você) possa 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 quiser (precisaPython 2.xpara 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:
Responder1
diff assume que o segundo arquivo pode ter sido criado não apenas editando linhas, mas também inserindo e excluindo linhas.
Se você deseja apenas saber quais linhas diferem sem considerar as linhas inseridas ou excluídas, você pode usar 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 está
#!/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;
Responder2
Para comparar arquivos lado a lado, minha ferramenta favorita éBloco de notas++.
Após instalá-lo, na barra de ferramentas clique em Plugins>Gerenciador de Plugins>Disponível e marque Comparar e Instalar.
Após reiniciar o Notepad++, abra os dois arquivos (eles serão abertos em abas diferentes), e na barra de ferramentas vá em Plugins>Comparar>Comparar.
Existem vários ajustes que você pode fazer, mas a comparação de arquivos é mais ou menos assim:
onde o texto branco permanece inalterado, o vermelho é removido, o verde é adicionado e a barra lateral mostra uma visão geral dessas alterações nos dois arquivos.