A chave para o desempenho é ler o arquivo enorme apenas uma vez.
Você pode passar vários padrões para o grep colocando-os em linhas separadas. Isso geralmente é feito dizendo ao grep para ler padrões de um arquivo:
grep -F -f 300KFile 30MFile
Isso exibe as correspondências na ordem do arquivo grande e imprime linhas que correspondem a vários padrões apenas uma vez. Além disso, isso procura padrões em qualquer lugar da linha; por exemplo, se o arquivo padrão contiver 1234
, as linhas como 123456,345678,2348962342
e 478912,1211138,1234
corresponderão.
Você pode restringir as correspondências exatas da coluna pré-processando o padrão. Por exemplo, se os padrões não contiverem nenhum caractere especial ()?*+\|[]{}
:
<300KFile sed -e 's/^/(^|,)/' -e 's/$/($|,)/' |
grep -E -f - 30MFile
Se for importante manter apenas a primeira correspondência para cada padrão, faça um primeiro passo para extrair somente as linhas relevantes como acima, então faça uma segunda passagem em awk ou perl que rastreie padrões que já foram vistos.
<300KFile sed -e 's/^/(^|,)/' -e 's/$/($|,)/' |
grep -E -f - 30MFile |
perl -l -F, -ape '
BEGIN {
open P, "300KFile" or die;
%patterns = map {chomp; $_=>1} <P>;
close P;
}
foreach $c (@F) {
if ($patterns{$c}) {
print;
delete $patterns{$c};
}
}
'