¿Cómo hacer una diferencia (diff) insensible a la línea en Linux?

¿Cómo hacer una diferencia (diff) insensible a la línea en Linux?

Tengo dos archivos de texto donde no importa el orden de las líneas. Quiero saber las líneas que son diferentes en un archivo a otro. El uso de diff en Linux encuentra la diferencia pero también tiene en cuenta el cambio en las líneas del mismo texto.

En otras palabras, ¿cómo hago una diferencia insensible a la línea?

Respuesta1

Si sus archivos no son demasiado grandes, puede sortguardarlos antes de diffiniciar sesión.

Entonces algo como esto funcionaría:

sort file1 > file1_sorted
sort file2 > file2_sorted
diff file1_sorted file2_sorted

O, como has descubierto en los comentarios, también puedes hacerlo en una sola línea,

diff <(sort file1) <(sort file2)

Respuesta2

De manera similar a las diffopciones, puede usar el commcomando con las sustituciones de procesos y sort( commrequiere que los archivos en los que opera estén ordenados). Esto le permitiría centrarse solo en las líneas comunes, solo en las líneas que están en un archivo u otro usando -1para suprimir líneas solo en el primer archivo, -2para suprimir líneas solo en el segundo archivo o -3para suprimir líneas en ambos, para ver todas las líneas que están solo en el primer archivo y no en el segundo que podrías hacer

comm -23 <(sort file1) <(sort file2)

por supuesto, si quieres eso también puedes considerar usar grepme gusta

grep -vFxf file2 file1

que tratará las líneas file2como patrones y solo imprimirá las líneas del archivo1 que no tienen coincidencias ( -v) cuando trata las líneas de ( -f) file2como cadenas fijas ( -F) que deben coincidir con la línea completa ( -x).

La grepsolución tiene la ventaja de no necesitar ordenar los archivos, pero sólo busca líneas en uno de los archivos que no estén en el otro, no en ambas direcciones a la vez.

información relacionada