Se o seu objetivo é encontrar linhas comuns ou incomuns, comm
seria meu comando aqui.
Compara dois arquivos e mostra - em três colunas - linhas exclusivas do arquivo 1, linhas exclusivas do arquivo 2 e linhas que aparecem nos dois arquivos, respectivamente. Você pode passar os sinalizadores para suprimir qualquer uma dessas saídas também. Por exemplo, comm -1 file1 file2
suprimirá a primeira coluna, as coisas exclusivas do arquivo1. comm -12 file1 file2
mostraria apenas as coisas nos dois arquivos.
Há uma grande advertência: a entrada deve ser classificada. Podemos contornar isso.
Isso mostrará tudo no abc que não está no mno:
comm -23 <(sort abc.txt) <(sort mno.txt)
E você pode canalizar isso em wc -l
para obter uma contagem.
O motivo pelo qual eu uso o comm
é que, uma vez que os arquivos são classificados, a comparação lado-a-lado é computacionalmente simples. Se você está lidando com milhões deles, isso fará diferença.
Isso pode ser demonstrado com alguns arquivos simulados. Eu tenho um computador bastante rápido para mostrar a diferença entre as abordagens, eu preciso de um conjunto de amostra muito grande. Eu fui para 10 milhões de 10 caracteres por arquivo.
$ 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
A classificação é o que mais demora na minha. Se fingirmos que o abc.txt é estático, podemos pré-classificá-lo e isso torna futuras comparações muito mais rápidas:
$ sort abc.txt abc-sorted.txt
$ time comm -23 abc-sorted.txt <(sort mno.txt) | wc -l
... 0m7.426s
Você pode considerar esses e considerar alguns segundos irrelevantes, mas devo destacar que eles estão sendo executados em uma máquina de ponta. Se você quisesse fazer isso em um (por exemplo) Raspberry Pi 3, você estará olhando para reviravoltas muito mais lentas e a diferença aumentará a um ponto que realmente importa.