Usar awk
deve ser eficiente o suficiente - fornece matrizes associativas incorporadas, em que o tempo de pesquisa da chave é logaritmicamente proporcional ao número de chaves (de sua tabela de consulta - que é relativamente pequena no seu exemplo).
Para sua entrada, isso seria:
42M * log2(1.5M) -> 42M * 20 key comparisons
(onde M significa 10 ^ 6)
No caso do seu awk usar tabelas de hash, cada consulta de chave custaria apenas uma quantidade de tempo constante.
Um exemplo de uma solução eficiente baseada no awk (usando o separador de campo padrão):
$ awk 'ARGIND == 1 { a[$1] = 1; next } a[$1] { print $0 }' keys.dat largefile.dat
Como as duas entradas estão ordenadas, você pode escrever um script que seja mais eficiente (com um tempo de execução dimensionado linearmente com os dois tamanhos de arquivo de entrada). Mas custaria mais tempo programá-lo.
Ou você pode usar join
, que espera arquivos classificados como entrada - restrição é que sua chave precisa ser classificada em ordem alfabética - e talvez você precise ajustar o formato de saída. Por exemplo:
$ join -j1 keys.dat largefile.dat
Use -t
para configurar o separador de campos e -o
para ajustar o formato de saída.
Isso deve ser executado no tempo linear ao tamanho da entrada.