Enviado em 23/01/2013 - 13:20h
Pessoal,
Preciso comparar dois arquivos, cada um contendo aproximadamente 3,5 milhões de linhas (irá gerar aprox. 10^12 combinações). A partir da primeira coluna do primeiro arquivo, irei compará-la à primeira do segundo e imprimir a quarta coluna (do 2), caso essa exista.
Por exemplo:
Arq1
p0001
p0002
Arq2
p0001 lala xrx
p0002 lele rxr s0002
Neste caso, apenas o resultado abaixo me interessa:
s0002
Tentei três formas de resolver o problema:
1) Usando grep:
2) Usando um shell script:
3) Usando um script em AWK:
Alguma sugestão tanto em termos de eficiência quanto para consertar os erros?
Desde já agradeço,
Preciso comparar dois arquivos, cada um contendo aproximadamente 3,5 milhões de linhas (irá gerar aprox. 10^12 combinações). A partir da primeira coluna do primeiro arquivo, irei compará-la à primeira do segundo e imprimir a quarta coluna (do 2), caso essa exista.
Por exemplo:
Arq1
p0001
p0002
Arq2
p0001 lala xrx
p0002 lele rxr s0002
Neste caso, apenas o resultado abaixo me interessa:
s0002
Tentei três formas de resolver o problema:
1) Usando grep:
grep -f arq1.txt arq2.txt | awk '$4 ~ /^s/ {print $4}' > output.txt Não sei se é a solução apropriada pois está utilizando muito espaço no swap (17gb) e demorando várias horas para terminar.2) Usando um shell script:
while read arq1t.txtMas está dando erro na última linha.
do
line2=`grep $line1 <arq2.txt`
if ($line2<>"")
then
IS=`echo $line2 | awk '{print $4}' > output.txt`
endif
done <arq1.txt
3) Usando um script em AWK:
Neste, provavelmente pelo uso do getline aninhado, ele só dá uma volta no primeiro While e saí do loop.
#!/bin/awk -f
BEGIN {
while((getline line1 < "arq1.txt")>0) {
while((getline line2 < "arq2.txt")>0) {
split(line2,l,/\t/)
if(l[1] ~ line1) {
if(l[4] ~ /^s/) {
saida = sprintf("s%\n",l[4])
print saida > "output.txt"
}
}
}
}
}
Alguma sugestão tanto em termos de eficiência quanto para consertar os erros?
Desde já agradeço,