Se você quiser "linhas que contenham uma string encontrada em outro arquivo"
(e não "linhas que contêm uma string que corresponde a um regExp em outro arquivo"), tente:
grep -vFf file1 file2 > file3
"grep -F" não está procurando correspondência de expressão regular, mas simples correspondência de seqüência de caracteres ( muito mais rápido )
ou melhor ainda
grep -vwFf file1 file2 #respect word boundary
Apenas um teste de comparação rápida:
1) construa um arquivo de exemplo de 100 000 linhas aleatórias2
seq 1000000 | shuf -n 100000 > file2
2) crie um arquivo de exemplo de linhas aleatórias de 10 000 (strings para remover)
seq 1000000 | shuf -n 10000 > file1
31) Usando grep -F
--- time grep -vwFf file1 file2 > file31
real 0m0.111s
user 0m0.100s
sys 0m0.008s
32) Sem -F
--- time grep -vwf file1 file2 > file32
... horas!
if file1 has just 300 lines -- 0.327s very fast
.... 600 lines -- 8.326s
.... 900 lines -- 35.334s
.... 1200 lines -- 1m31.433s (quadratic with file1 len?)
.... 10000 lines -- it is still calculating (several hours?)
UPDATED 1h03m53.983s
Conclusão do teste:
-
grep -vFf file1 file2
é muito mais rápido que grep -vf
-
grep -vFf file1 file2
não tem problemas com grandes file1
arquivos
-
grep -vf file1 file2
é afetado com o aumento do tamanho do arquivo file1
(isso é visível apenas para tamanhos > 500 linhas ou > 4kbytes)