Como (memória limitada) grep -F -f file_A file_B output.txt

2

file_A (~ 500MB, 1.6M linhas) consiste em todos os termos de pesquisa de tamanho igual, 1 por linha, não classificados.

file_B consiste em todas as linhas de texto de tamanho igual, 1 por linha, não classificadas

Eu consegui executar "grep -F -f file_A file_B > > output.txt" com qualquer arquivo de tamanho_B sem problemas em uma caixa com 52 GB de RAM. O problema é que agora estou limitado a 4 GB de RAM e, portanto, o tamanho de file_A agora é muito grande para que isso seja executado sem esgotar a memória disponível.

Falta de cortar manualmente o arquivo_A em picadas menores, existe alguma maneira fácil de fazer o script para grep para as primeiras 1000 linhas de arquivo_A, então quando isso terminar para grep automaticamente para as linhas 1001-2000, ect. até que eu tenha passado por todo o arquivo_A?

    
por Butch 04.07.2017 / 21:54

1 resposta

2

Faça um loop através de trechos de file_A, enviando-os como stdin para a mesma declaração do grep; ajuste 1000 à sua memória disponível:

nlines=$(wc -l < file_A)
chunk=1000
for((i=1; i < nlines; i += chunk)) 
do 
  sed -n $i,+$((chunk - 1))p file_A | grep -F -f - file_B
done > output
    
por 05.07.2017 / 03:54