Compare dos archivos estrictamente línea por línea, sin inserciones o eliminaciones

13

Tengo dos archivos que esencialmente contienen volcados de memoria en formato hexadecimal. Por el momento, uso diff para ver si los archivos son diferentes y dónde están las diferencias. Sin embargo, esto puede ser engañoso cuando se trata de determinar la ubicación exacta (es decir, la dirección de memoria) de la diferencia. Considere el siguiente ejemplo que muestra los dos archivos uno al lado del otro.

file1:       file2:

0001    |    0001
ABCD    |    FFFF
1234    |    ABCD
FFFF    |    1234

Ahora diff -umostrará una inserción y una eliminación, aunque 3 líneas (ubicaciones de memoria) han cambiado entre los dos archivos:

 0001
+FFFF
 ABCD
 1234
-FFFF

¿Hay una manera fácil de comparar los dos archivos de manera que cada línea solo se compare con la misma línea (en términos de numeración de líneas) en el otro archivo? Entonces, en este ejemplo, debería informar que las últimas 3 líneas han cambiado, junto con las líneas cambiadas de file1y file2. La salida no tiene que ser de estilo diff, pero sería genial si pudiera colorearse (en este momento coloreo la diff -usalida usando sedpara que pueda adaptarse fácilmente).

Fritz
fuente

Respuestas:

18

Este podría ser un enfoque:

diff <(nl file1) <(nl file2)

Con nlnúmero las líneas que diffreconoce las líneas línea por línea.

caos
fuente
3
Eso es genial, no conocía el programa nl. Esas herramientas de Unix son realmente útiles, pero hay muchas de ellas.
Fritz
1
Acabo de intentar esto, y desafortunadamente lo que obtengo es: cada línea del primer archivo, seguida de cada línea del segundo archivo ... en lugar de la línea 1 del archivo 1, seguida de la línea 1 del archivo dos, seguida de la línea 2 del archivo uno, seguido de la línea 2 del archivo 2 ...
Michael Hewson
@MichaelHewson Parece que sus dos archivos no tienen líneas en común. En ese caso, así es como difffunciona. Puede probar el programa gui meldque muestra los dos archivos uno al lado del otro. Como enmeld <(nl file1) <(nl file2)
Fritz