GNU/Linux >> Linux Esercitazione >  >> Linux

Come ottenere la differenza (solo aggiunte) tra due file in Linux

diff e poi grep per il tipo di modifica desiderato.

diff -u A1 A2 | grep -E "^\+"

Un approccio simile a https://stackoverflow.com/a/15385080/337172 ma si spera più comprensibile e facile da modificare:

diff \
  --new-line-format="%L" \
  --old-line-format="" \
  --unchanged-line-format="" \
  A1 A2

La maggior parte di quanto segue viene copiata direttamente dalla risposta serverfault di @TomOnTime qui. In fondo c'è un tentativo che funziona su file non ordinati, ma il comando ordina i file prima di dare il diff quindi in molti casi non sarà ciò che si desidera. Per differenze ben formattate di file non ordinati, potresti trovare più utili le altre risposte (grazie a @Fritz per averlo segnalato):

Mostra le righe che esistono solo nel file a:(cioè ciò che è stato cancellato da a)

comm -23 a b

Mostra le righe che esistono solo nel file b:(ovvero ciò che è stato aggiunto a b)

comm -13 a b

Mostra righe che esistono solo in un file o nell'altro:(ma non in entrambi)

comm -3 a b | sed 's/^\t//'

(Attenzione:se il file a contiene righe che iniziano con TAB, esso (il primo TAB) verrà rimosso dall'output.)

NOTA:entrambi i file devono essere ordinati affinché "comm" funzioni correttamente. Se non sono già ordinati, dovresti ordinarli:

sort <a >a.sorted
sort <b >b.sorted
comm -12 a.sorted b.sorted

Se i file sono estremamente lunghi, questo può essere piuttosto oneroso in quanto richiede una copia aggiuntiva e quindi il doppio dello spazio su disco.

Modifica:nota che il comando può essere scritto in modo più conciso utilizzando la sostituzione del processo (grazie a @phk per il commento):

comm -12 <(sort < a) <(sort < b)

Puoi provare questo

diff --changed-group-format='%>' --unchanged-group-format='' A1 A2

Le opzioni sono documentate in man diff :

       --GTYPE-group-format=GFMT
              format GTYPE input groups with GFMT

e:

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

e:

              GFMT (only) may contain:

       %<     lines from FILE1

       %>     lines from FILE2

       [...]

Linux
  1. Come trasferire file tra due computer utilizzando i comandi nc e pv

  2. Come unire due file di testo in Linux

  3. Come trovare tutti i file sparsi in Linux

  4. Come posso differenziare due file XML?

  5. Come differenziare solo la prima riga di due file?

Qual è la differenza tra Linux e Unix?

Come visualizzare due file affiancati in Linux

Come confrontare due file nel terminale Linux

Come sincronizzare automaticamente i file tra due server Linux

Come trovare file con il comando fd in Linux

Differenza negli spazi bianchi tra due file su Linux