diff informa la misma línea como diferente en 2 archivos

13

Tengo 2 archivos que contienen una lista de canciones. hdsongs.txt y sdsongs.txt

Escribí un script simple para enumerar todas las canciones y resultados en archivos de texto, para luego ejecutar un diff en contra. Funciona bien en su mayor parte, pero el comando diff real en el script muestra la misma línea como diferente. Esto realmente está sucediendo para varias líneas, pero no para todas.

Aquí hay un ejemplo de una canción en ambos archivos:

$ grep Apologize \*songs\*
hdsongs.txt:Timbaland/Apologize.mp3
sdsongs.txt:Timbaland/Apologize.mp3

No hay caracteres especiales finales que pueda ver:

$ cat -A hdsongs.txt sdsongs.txt | grep Apologize
Timbaland/Apologize.mp3$
Timbaland/Apologize.mp3$

Cuando ejecuto diff, muestra la misma línea en cada archivo; pero no son las lineas iguales?

$ diff hdsongs.txt sdsongs.txt | grep Apologize
> Timbaland/Apologize.mp3
< Timbaland/Apologize.mp3

Esto es similar al hilo aquí: diff informa que dos archivos difieren, ¡aunque son iguales!

pero esto es para líneas dentro del archivo, no todo el archivo, y la resolución allí no parece encajar en este caso.

$ diff <(cat -A phonesongsonly.txt) <(cat -A passportsongsonly.txt) | grep Apologize
< Timbaland/Apologize.mp3$
> Timbaland/Apologize.mp3$

$ wdiff -w "$(tput bold;tput setaf 1)" -x "$(tput sgr0)" -y "$(tput bold;tput setaf 2)" -z "$(tput sgr0)" hdsongs.txt sdsongs.txt | grep Apologize
>Timbaland/Apologize.mp3
>Timbaland/Apologize.mp3

¿Alguien sabe por qué diff informaría la misma línea dos veces como esta?

usuario1718443
fuente
¿Quizás intente con hexdumpesas dos líneas y vea qué difiere?
user43791

Respuestas:

23

Supongo que simplemente no ha ordenado los archivos. Ese es uno de los comportamientos que puede obtener en la entrada sin clasificar:

$ cat file1 
foo
bar
$ cat file2
bar
foo
$ $ diff file1 file2
1d0
< foo
2a2
> foo

Pero, si ordena:

$ diff <(sort file1) <(sort file2)
$ 

El difftrabajo del programa es decirle si dos archivos son idénticos y, si no, dónde difieren. No está diseñado para encontrar similitudes entre diferentes líneas. Si la línea X de un archivo no es la misma que la línea X del otro, entonces los archivos no son lo mismo. No importa si contienen exactamente la misma información, si esa información está organizada de manera diferente, los archivos se informan como diferentes.

terdon
fuente
4

Como no ha indicado que los archivos están ordenados, supondré que no lo están. Este es el resultado esperado de diff cuando aparece una línea en ambos archivos, pero en diferentes ubicaciones. Esto quedaría claro si miraras toda la diffsalida, en lugar de pasarla grep.

G-Man dice 'restablecer a Mónica'
fuente
2

Sugeriría intentar usar algo como el programa hexdiff para obtener una salida binaria / hexadecimal, ya que el ojo humano no siempre puede distinguir la diferencia entre los caracteres que muestra una computadora, y algunos caracteres pueden no mostrarse.

Jason Rush
fuente
2
cat -Ahabría mostrado la mayoría (¿todos?) casos de caracteres que no se imprimen. No estoy seguro de cómo habría hecho frente a la extrañeza de Unicode, pero deberían haberse mostrado otros caracteres que no son de impresión.
terdon