Poco tempo fa ho avuto la necessità di processare un file di testo contenente alcune parole ad un programma di elaborazione dati.  Purtroppo dopo aver processato il file (che chiameremo file A) della base dati mi ero accorto di non aver dato in pasto al processore l’ultima versione contenuta invece in un altro file (che chiameremo file B). Per evitare di ripetere tutta l’operazione ho avuto la necessità di generare un nuovo file (il file C) che è la risultante delle differenze del file B ed il file A.

Supponendo di avere il file A così composto:

lunedi
mercoledi
giovedi
sabato

Mentre il file B è formato da tutti i giorni della settimana:

lunedi
martedi
mercoledi
giovedi
venerdi
sabato
domenica

Se volessimo tirare fuori le parole presenti in B ma non in A ottenendo un nuovo file C possiamo utilizzare il comando grep nel seguente modo:

[cc escaped=”true” lang=”bash”]grep -vf A B > C[/cc]

Il risultato sarà:

martedi
venerdi
domenica

In buona sostanza il parametro v di grep inverte il senso dello string matching, mentre il parametro f specifica a grep la base dati da utilizzare per lo string matching.

AGGIORNAMENTO 19/06/2017:

Girando su internet ho trovato altre varianti più o meno performanti.

La prima è data dal comando comm ecco un esempio:

comm -3 <(sort A) <(sort B)

come si vede il file comm necessita che i file in ingresso siano già ordinati.

Altro esempio è con il comando join:

join -v 1 <(sort A) <(sort B)