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?
hexdump
esas dos líneas y vea qué difiere?Respuestas:
Supongo que simplemente no ha ordenado los archivos. Ese es uno de los comportamientos que puede obtener en la entrada sin clasificar:
Pero, si ordena:
El
diff
trabajo 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.fuente
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 ladiff
salida, en lugar de pasarlagrep
.fuente
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.
fuente
cat -A
habrí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.