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