Listado de líneas de un solo archivo en DIFF

31

Me gustaría obtener (GNU) DIFF para imprimir solo las líneas que son diferentes en un archivo. Tan dado

    ==> diffa.txt <==
    line1
    line2 - in a only
    line3
    line4 changed
    line5

    ==> diffb.txt <==
    line1
    line3
    line4 changed in b
    line5
    line6 in b only

Me gustaría diff --someoption diffa.txt diffb.txt para producir

    line2 - in a only

    line4 changed

Lo siguiente parece que debería ser útil pero es un poco críptico:

   --GTYPE-group-format=GFMT
          Similar, but format GTYPE input groups with GFMT.

   --line-format=LFMT
          Similar, but format all input lines with LFMT.

   --LTYPE-line-format=LFMT
          Similar, but format LTYPE input lines with LFMT.

   LTYPE is `old', `new', or `unchanged'.
          GTYPE is LTYPE or `changed'.

          GFMT may contain:

   %<     lines from FILE1

   %>     lines from FILE2
justintime
fuente
La página del manual es definitivamente un poco tensa en estas banderas! Buena pregunta.
quickshiftin
1
Me gustaría señalar que 'información dif' dará ejemplos completos, hay una gran cantidad de información en la información.
Baroudi Safwen

Respuestas:

37

No es seguro diff Solo puede hacerlo, pero siempre puede usar el poder de otras utilidades de GNU para ayudarlo.

diff -u diffa.txt diffb.txt | grep '^-[^-]' | sed 's/^-//'

Hace el diff, luego selecciona solo las líneas que comienzan con '-' - esas son cambiadas y tienen valores del archivo diffa.txt, luego sed solo remueve esos signos '-'.

Editar: Después de algunos experimentos con diff, parece que el siguiente comando produce lo que quieres:

diff --changed-group-format='%<' --unchanged-group-format='' diffa.txt diffb.txt
vava
fuente
Para un método fuera de la tubería está bien. Preferiría `perl -ne" print if s / ^ - // "` pero eso es gusto. Creo que veo que --changed-group-format='%<' estan haciendo por mi ahora ....
justintime
Gracias. : D Necesitaba algo como esto para enumerar todos mis paquetes entre dos computadoras y usé sdiff pero esto se ve un poco mejor
Rob
10

Método más simple es utilizar comm Utilidad linux (necesita archivo ordenado para la entrada). Escribe en salida estándar:

  • líneas que son únicas para diffa.txt

  • líneas que son únicas para diffb.txt

  • líneas que son comunes

y puede suprimir cada uno de ellos por el parámetro 1,2 o 3 en consecuencia. Así que en tu caso se verá así:

comm -23 diffa.txt diffb.txt

Suprime las líneas que son únicas para diffb.txt, las líneas que son comunes e imprime líneas que son únicas solo para diffa.txt

Fuente de: https://www.tutorialspoint.com/unix_commands/comm.htm

hukko
fuente
Encontré esto mucho más fácil que diff que no está haciendo lo que espero. Y creo que está preinstalado tanto en BSD (es decir, Mac OS X) como en Ubuntu, por lo que no hay pesadillas en el administrador de paquetes.
Sridhar-Sarnobat
2

Me gustaría mencionar que comm espera archivos de entrada ordenados y, por lo tanto, informa resultados diferentes que diff.

diff --changed-group-format='%<' --unchanged-group-format='' diffa.txt diffb.txt

es universal Felicitaciones a @vava

PSchwede
fuente