De uma linha de comando do Linux / Unix / Mac:
sort file1 file2 | uniq -d | sort file2 - | uniq -u
Explicação:
Isso retorna apenas as linhas no arquivo2 que não correspondem exatamente a nenhuma linha no arquivo1.
Etapas:
-
sort file1 file2
: Concatena file1 e file2 juntos, classifica-os e imprime-os para stdout. Observe que as duplicatas serão listadas em linhas adjacentes (duas vezes seguidas) após a classificação. -
uniq -d
: obtém a saída do comando anterior e imprime somente as linhas duplicadas . -
sort file2 -
: Concatena o arquivo original2 e a saída do comando anterior (stdout, representado pelo nome do arquivo "-
" hífen) e imprime o resultado para stdout. Além disso, todos os itens no arquivo2 que também estavam no arquivo1 serão duplicados (listados duas vezes seguidas) na saída. -
uniq -u
: obtém a saída do comando anterior e imprime somente itens que não são duplicados (em outras palavras, imprime apenas itens que não estão listados duas vezes seguidas).
Possíveis dicas:
Isto assume que qualquer linha dada no arquivo1 corresponde exatamente uma linha correspondente no arquivo2. Se, por exemplo, arquivo1 e arquivo2 tivessem o mesmo e-mail, mas com capitalização diferente; ou se o arquivo1 tivesse um nome como "Jon Sampson" enquanto o arquivo2 tivesse o mesmo endereço de e-mail com o nome "Jonathan Sampson", eles não seriam considerados duplicados.
Você poderia controlar isso pré-processando o arquivo para remover tudo, exceto o endereço de e-mail e, além disso, minúscula o endereço de e-mail. Os comandos do Unix cut
e tr
poderiam ser úteis neste caso. Ou você pode alternar para o SQL para cenários mais complexos.
Tamanho do arquivo:
Um arquivo de 200.000 linhas e uma de 12.000 linhas não é tão grande assim. Gerei arquivos de tamanho similar usando o arquivo /usr/share/dict/words
no meu MacBook Pro e testei o comando acima; demorou menos de 5 segundos para ser executado.