Eu tenho dois arquivos de dados:
file_1.in , contendo mais de 2k linhas como "12 AB0001" :
10 AB0001
11 AC0002
12 AD0003
...
Uma lista de *.gz
arquivos gzipados (cerca de 1 a 3 milhões de linhas) eu deveria
extrair e analisar para criar um arquivo de saída denominado como linhas (segundo
col) em file_1.in .
##comment..
##comment..
#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT AB0001 AC0002 AD0003
21 1234567 ab11111 G A 100 PASS info1;info2 GT 0|0 0|1 0|0
21 1234568 ab22222 C A 100 PASS info1,info2 GT 1:23:2 .:.:. 0:32:2
21 1234569 ab33333 A C 100 PASS info1;info2 GT 0|2 1|0 0|0
Tentando diferentes abordagens, cheguei a isto:
{
if(FNR==NR){list[$1]=$2;next}
if(!/^#/){
for(p in list){
split($p, sp, ":");
if (sp[1] != "0|0" && sp[1] != "0" && sp[1] != "."){
printf("%s %s %s %s %s %s %s %s %s %s\n",
$1, $2, $3, $4, $5, $6, $7, $8, $9, $p) >> out"/"list[p]".tmp"
}
}
}
}
executado pela linha de comando:
awk -v out="outfolder/" -f myscript.awk file_1.in <(zcat *.gz)
Mas são necessárias mais de duas horas para criar apenas um arquivo. Poderia haver uma maneira de melhorar meu código? Eu acho que a maior parte do tempo é gasto por zcat
de cada arquivo e pela função de escrita anexa que parece ser lenta. O que você acha?