Estoy tratando de entender el comando linux diff en dos archivos cuyas líneas son solo permutación entre sí pero no pueden asimilar el resultado que genera. Considere los tres comandos a continuación:
[myPrompt]$ cat file1
apples
oranges
[myPrompt]$ cat file2
oranges
apples
[myPrompt]$ diff file1 file2
1d0
< apples
2a2
> apples
¿Alguien puede explicar el resultado críptico anterior de diff.
- ¿Por qué no hay mención alguna de "naranjas" en la salida?
- ¿Qué significa
1d0y qué2a2significa?
Entiendo por esta respuesta que:
"<" significa que falta la línea en el archivo2 y ">" significa que falta la línea en el archivo1
PERO eso no explica por qué faltan naranjas en la salida.

orangeses la parte común más grande entre los dos archivos, lo que obtienes es la forma más corta de expresar las diferencias entre los dos.diff -u file1 file2en su lugar. Eso se llama formato "diff unificado". El formato diff original estaba destinado a ser muy compacto, pero los diff unificados están destinados a ser mucho más legibles.diff -y file1 file2Respuestas:
Para comprender el informe, recuerde que
diffes prescriptivo y describe los cambios que se deben realizar en el primer archivo (file1) para que sea el mismo que el segundo archivo (file2).Específicamente, el
din1d0significa eliminar y elain2a2significa agregar .Así:
1d0significa que la línea 1 debe eliminarse enfile1(apples).0en1d0significa que la línea 0 es donde habrían aparecido en el segundo archivo (file2) si no se hubieran eliminado. Eso significa que cuando se cambiafile2afile1(hacia atrás), agregue la línea 1file1después de la línea 0 defile2.2a2significa agregar la segunda línea (oranges)file2a la ahora segunda línea defile1(después de eliminar la primera líneafile1,orangescambiar a la línea 1)fuente
0en1d0?Considere estos archivos:
file1:file2:Cómo
difffunciona, dado que está basado en pedidos:difflee el primer bloque de líneas defile1yfile2, e intenta encontrar líneas iguales:Ahora omitirá todas las líneas que son iguales en ambos archivos, que es solo
orangesen este caso:Ahora encuentre otro conjunto de líneas similares e imprima las diferencias:
Salta las líneas similares
Encuentre líneas idénticas, si es posible, e imprima diferencias:
Ahora si lo hago
diff file1 file2:Ahora es simple explicar lo que
diffsignifica la salida:Para hacer
file1igual afile2:1,2d0: Eliminar (d) líneas1-2defile1y modificar la línea0enfile2consecuencia3a2: Añadir (a) a la línea3defile1línea2defile24a4,5: Añadir a la línea4defile1líneas4-5defile2diffse comparafile1confile2línea por línea y resuelve diferencias en la memoria temporal. Después de hacerfile1igual afile2hasta la primera aparición de una línea enfile1, que también ocurre enfile2, todas las líneas que son iguales hasta una diferencia no se mencionan, a menudo se indican como---. En este caso solo hay una línea similar, que esoranges. Tenga en cuenta que dijefile1igual afile2, por lo quefile1se ve en relación confile2y no al revés.La salida está en relación con el primer archivo dado, en este caso
file1.fuente
applesocurre en ambos archivos.oranges". Incorrecto: en realidad hay dos líneas, que no solo son similares , sino absolutamente idénticas . Uno de ellos leeoranges, el otro leeapples. Además, su explicación (puramente basada en el orden) está en contradicción con el comentario de Stéphane sobre la pregunta (basada en la longitud): ¿quién tiene razón?Allí están:
fuente
El formato de salida estándar (antiguo) mostrará la diferencia entre los archivos sin texto circundante con áreas donde los archivos difieren.
Por ejemplo:
1d0 <(eliminar) significa que las manzanas deben eliminarse de la primera línea defile1, y2a2 >(agregar) significa que las manzanas deben agregarse enfile2la segunda línea, por lo que ambos archivos pueden coincidir.La documentación disponible en
info diffexplica más aún más:Ver también:
Entonces, para ver las naranjas, tendrías que diferenciarlas una al lado de la otra o usando un contexto unificado.
Por ejemplo:
fuente