Utilizzando alcune utilità meno conosciute:
sort file1 > file1.sorted
sort file2 > file2.sorted
comm -1 -3 file1.sorted file2.sorted
Questo produrrà duplicati, quindi se c'è 1 3
in file1
, ma 2 in file2
, questo produrrà ancora 1 3
. Se questo non è quello che vuoi, reindirizza l'output da sort
fino a uniq
prima di scriverlo in un file:
sort file1 | uniq > file1.sorted
sort file2 | uniq > file2.sorted
comm -1 -3 file1.sorted file2.sorted
Ci sono molte utilità nel pacchetto GNU coreutils che consentono ogni tipo di manipolazione del testo.
$ awk 'FNR==NR {a[$0]++; next} !($0 in a)' file1 file2
6
7
Spiegazione di come funziona il codice:
- Se stiamo lavorando su file1, traccia ogni riga di testo che vediamo.
- Se stiamo lavorando su file2 e non abbiamo visto il testo della riga, stampalo.
Spiegazione dei dettagli:
FNR
è il numero di record del file correnteNR
è il numero di record complessivo corrente di tutti i file di inputFNR==NR
è vero solo quando stiamo leggendo file1$0
è la riga di testo correntea[$0]
è un hash con la chiave impostata sulla riga di testo correntea[$0]++
traccia che abbiamo visto la riga di testo corrente!($0 in a)
è vero solo quando non abbiamo visto il testo della riga- Stampa la riga di testo se il modello precedente restituisce true, questo è il comportamento predefinito di awk quando non viene data alcuna azione esplicita