La risposta semplice non ha funzionato per me perché non mi ero reso conto che comm
corrisponda alla linea per riga, quindi le righe duplicate in un file verranno stampate come non esistenti nell'altro. Per esempio, se file1 conteneva:
Alex
Bill
Fred
E file2 contenuta:
Alex
Bill
Bill
Bill
Fred
Poi comm -13 file1 file2
sarebbe uscita:
Bill
Bill
Nel mio caso, ho voluto sapere solo che ogni stringa file2 esisteva in file1, indipendentemente dal numero di volte in cui quella riga si verificava in ogni file.
Soluzione 1: utilizzare il -u
(unica) bandiera per sort
:
comm -13 <(sort -u file1) <(sort -u file2)
Soluzione 2: (la prima risposta "di lavoro" che ho trovato) da unix.stackexchange:
fgrep -v -f file1 file2
Si noti che se file2 contiene dupli linee di cate che non esistono affatto nel file 1, fgrep
genererà ciascuna delle linee duplicate.Si noti inoltre che i miei test totalmente non scientifici su un singolo laptop per un singolo dataset (abbastanza grande) hanno mostrato che la Soluzione 1 (utilizzando comm
) è quasi 5 volte più veloce della Soluzione 2 (utilizzando fgrep
).
Aggiungerò che funziona solo se entrambi i file sono ordinati. (So che l'OP accennato ha ordinato i file, ma molte persone, me incluso, leggono il titolo della domanda e poi passano alle risposte) – user247866
@ user247866: Fortunatamente comm è abbastanza gentile da dirti se non sono ordinati :) – marlar