A maneira mais rápida e eficiente de remover linhas contendo strings (strings listadas em outro arquivo de texto)

1

Eu queria saber se o fgrep é a maneira mais rápida e eficiente de remover linhas de um arquivo (file1) que contém uma string encontrada em outro arquivo (file2).

Eu encontrei a função fgrep que deve fazer isso da seguinte maneira:

  fgrep -v -f file1  file2  > file_with_lines_containing_search_strings_removed

Não sei se isso funcionará bem com arquivos muito grandes.

Eu tenho dois arquivos com 100.000 linhas e quero usar o método mais rápido possível.

Obrigado.

Feliz dia 4 de julho para todos aqueles americanos de aparência engraçada.

    
por speld_rwong 05.07.2017 / 04:13

2 respostas

1

Sim, tudo bem. O pior caso é quando o arquivo com as sequências a serem excluídas é igual ao tamanho do arquivo que está sendo processado e de um tamanho que não cabe na memória. Se você tiver esse caso, divida o arquivo de exclusão em partes e execute várias etapas.

    
por 05.07.2017 / 05:03
0

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)

por 05.07.2017 / 10:48