Se il tuo obiettivo è trovare linee comuni o non comuni, comm
sarebbe il mio comando preferito qui.
Confronta due file e mostra, in tre colonne, righe univoche per il file 1, righe uniche per il file 2 e righe visualizzate in entrambi i file, rispettivamente. È possibile passare flag per eliminare anche questo output. Ad esempio comm -1 file1 file2
sopprimerà la prima colonna, le cose uniche di file1. comm -12 file1 file2
mostrerebbe cose solo in entrambi i file.
C'è un grande avvertimento: l'input deve essere ordinato. Possiamo aggirare questo.
Questo ti mostrerà tutto in ABC che non è in MNO:
comm -23 <(sort abc.txt) <(sort mno.txt)
E puoi convogliarlo wc -l
per ottenere un conteggio.
La ragione per cui vado comm
è che una volta ordinati i file, il confronto fianco a fianco è davvero semplice dal punto di vista computazionale. Se hai a che fare con milioni di questi, questo farà la differenza.
Questo può essere dimostrato con un paio di file finti. Ho un computer abbastanza veloce, quindi per mostrare la differenza tra gli approcci, ho bisogno di un set di campioni piuttosto mastodontico. Sono andato a 10 milioni di stringhe da 10 caratteri per file.
$ cat /dev/urandom | tr -dc '0-9' | fold -w 10 | head -10000000 > abc.txt
$ cat /dev/urandom | tr -dc '0-9' | fold -w 10 | head -10000000 > mno.txt
$ time comm -23 <(sort abc.txt) <(sort mno.txt) | wc -l
... 0m10.653s
$ time grep -Fcxv -f abc.txt mno.txt
... 0m23.920s
$ time grep -Fcwv -f abc.txt mno.txt
... 0m40.313s
$ time awk 'NR==FNR{a[$0]++};NR!=FNR && a[$0]' abc.txt mno.txt | wc -l
... 0m12.161s
L'ordinamento è ciò che richiede la maggior parte del tempo nel mio. Se facciamo finta che abc.txt sia statico, possiamo preordinarlo e questo rende i confronti futuri molto più veloci:
$ sort abc.txt abc-sorted.txt
$ time comm -23 abc-sorted.txt <(sort mno.txt) | wc -l
... 0m7.426s
Potresti guardare questi e considerare alcuni secondi irrilevanti, ma devo evidenziare che questi sono in esecuzione su una macchina di fascia alta. Se vuoi farlo su un (ad es.) Raspberry Pi 3, vedrai turnaround molto più lenti e la differenza aumenterà fino al punto in cui conta davvero.
grep -cxvFf abc.txt mno.txt
?