Comparación de 2 (o 3 archivos si es posible) "línea por línea"

Comparación de 2 (o 3 archivos si es posible) "línea por línea"

Quiero descubrir las diferencias de 2 (o 3 archivos si es posible) línea por línea. Las utilidades diferenciales pueden hacer esto, sin embargo, dan resultados inexactos. Porque 2 archivos tienen el número exacto de líneas, que es "134". Pero diff me da "Líneas agregadas" y "Líneas eliminadas". Sin embargo, esto es incorrecto, tienen exactamente el mismo número de líneas, no se agregan ni se eliminan líneas.

Los archivos de texto en los que quiero encontrar diferencias solo tienen números escritos, tal vez por eso falla el algoritmo. No pude encontrar ninguna opción para evitar eso, sin embargo, puedo estar equivocado, quiero decir que debería haber una opción para eso, pero nuevamente, no pude encontrarla.

Esto es lo que obtengo (5am.txt vs 6am.txt, hay un gran problema): http://img26.imageshack.us/img26/7049/wrongp.png

Esto es lo que quiero (6am.txt vs 7am.txt, todavía tiene problemas): http://img402.imageshack.us/img402/5421/semiright.png

Editar:

Después de darme cuenta de que no tenía sentido hacer esto, me las arreglé solo. Casi hice lo mismo que hizo RedGrittyBrick. Este script imita la utilidad diff, por lo que yo (o usted) podemos usarlo con diff2html.

Para usarlo con diff2html, simplemente cambie de línea

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

a

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

y nombra este script como quieras (necesitaPitón 2.xpara ejecutar, 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 finales: ingrese la descripción de la imagen aquí

Respuesta1

diff supone que el segundo archivo puede haber sido creado no solo editando líneas sino también insertando y eliminando líneas.

Si solo desea saber qué líneas difieren sin considerar las líneas insertadas o eliminadas, puede utilizar un enfoque más simple.

$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

donde está 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;

Respuesta2

Para comparar archivos uno al lado del otro, mi herramienta favorita esBloc de notas++.

Después de instalarlo, en la barra de herramientas, haga clic en Complementos>Administrador de complementos>Disponible y marque Comparar e instalar.

Después de reiniciar Notepad++, abra los dos archivos (se abrirán en pestañas diferentes) y en la barra de herramientas vaya a Complementos>Comparar>Comparar.

Hay varios ajustes que puedes hacer, pero comparar archivos se parece a esto:

ingrese la descripción de la imagen aquí

donde el texto blanco no cambia, el rojo se elimina, se agrega verde y la barra lateral muestra una descripción general de esos cambios en los dos archivos.

información relacionada