Elenco delle righe da un solo file in DIFF


34

Vorrei ottenere (GNU) DIFF per stampare solo righe diverse in un unico file. Così dato

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

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

vorrei diff --someoption diffa.txt diffb.txtprodurre

    line2 - in a only

    line4 changed

Quanto segue sembra che dovrebbe essere utile ma è un po 'enigmatico:

   --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

La pagina man è decisamente un po 'concisa su queste bandiere! Buona domanda.
cambio rapido il

1
Vorrei sottolineare che "info diff" fornirà esempi completi, che contengono molte informazioni.
Baroudi Safwen,

Risposte:


42

Non sei sicuro che diffsolo tu possa farlo, ma puoi sempre usare la potenza di altre utility GNU per aiutarti.

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

Fa il diff, quindi seleziona solo le righe che iniziano con '-' - quelle vengono modificate e hanno valori dal file diffa.txt, quindi sedrimuovi semplicemente quei segni '-'.

Modifica: dopo alcuni esperimenti diff, sembra che il comando seguente produca ciò che desideri:

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

Per uno fuori il metodo del tubo va bene. Preferirei `perl -ne" print se s / ^ - // "` ma questo è gusto. Penso di vedere cosa --changed-group-format='%<'stanno facendo per me ora ....
justintime

Grazie. : DI aveva bisogno di qualcosa del genere per elencare tutti i miei pacchetti tra due computer e ho usato sdiff ma questo sembra un po 'meglio.
Rob,

12

Il metodo più semplice è usare l' commutilità linux (ha bisogno di un file ordinato per l'input). Scrive sullo standard output:

  • linee uniche per diffa.txt

  • linee uniche per diffb.txt

  • linee comuni

e puoi sopprimere ciascuno di essi con i parametri 1,2 o 3 di conseguenza. Quindi nel tuo caso sembrerà così:

comm -23 diffa.txt diffb.txt

Sopprime le linee uniche per diffb.txt, le linee comuni e stampa le linee uniche solo per diffa.txt

Fonte da: https://www.tutorialspoint.com/unix_commands/comm.htm


L'ho trovato molto più semplice di quello diffche non sta facendo quello che mi aspetto. E credo che sia preinstallato sia su BSD (cioè Mac OS X) che su Ubuntu, quindi non ci sono incubi di gestione dei pacchetti.
Sridhar Sarnobat,

3

Vorrei menzionare che commprevede file di input ordinati e quindi riporta risultati diversi rispetto a diff.

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

è universale. Complimenti a @vava

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.