Como acelerar o script awk que usa vários arquivos gzip grandes?

1

Eu tenho dois arquivos de dados:

  1. file_1.in , contendo mais de 2k linhas como "12 AB0001" :

    10 AB0001
    11 AC0002
    12 AD0003
    ...
    
  2. 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?

    
por redrich 19.11.2017 / 01:19

0 respostas