
paulo1205
(usa Ubuntu)
Enviado em 23/01/2013 - 19:43h
Se o primeiro arquivo tem 3,5M linhas, eu fico com pena de rodar 3,5M de
greps sobre o segundo arquivo, que também tem 3,5M linhas, assim como também fazer 3,5M invocações do
awk apenas para imprimir a quarta coluna de uma linha já conhecida.
Se o a primeira linha do primeiro arquivo for composta de campos suficientemente pequenos, eu faria um script em Perl (poderia ser
awk, mas eu não o conheço tão bem quanto Perl) que:
1) Lesse o primeiro arquivo e guardasse os elementos da primeira coluna num array associativo.
2) Lesse o segundo arquivo, vendo se o elemento da primeira coluna se cada linha lida existe no array associativo e se a quarta coluan existe. Se sim, imprime a quarta coluna da linha lida.
Como eu disse, o primeiro arquivo não poderia ser muito grande, Supondo que se possa gastar cerca de 1GB de RAM com o script, o primeiro elemento de cada linha do primeiro arquivo teria de ter um tamanho médio um pouco menor do que trezentos caracteres (300*3,5M=1,05G).
Mas há um jeito mais prosaico, sem precisar de arrays associativos nem coisa parecida, mas tão somente
sort e o próprio shell: ordene os dois arquivos pela primeira coluna (se quiser, pode já suprimir do segundo arquivo as linhas que não tiverem a quarta coluna antes de ordenar, para poupar tempo), gerando um novo par de arquivos ordenados. Depois disso, você conseguirá, com o próprio shell, percorrer paralelamente percorrer ambos os novos arquivos uma única vez, pulando os elementos de cada linha lida de um deles enquanto eles forem menores do que o elemento de comparação do outro; quando forem iguais, você imprime a quarta coluna da linha que tiver sido lida do novo segundo arquivo.