awk para processar arquivos muito grandes

2

Eu tenho um arquivo aqui onde quero marcar cada linha com FILEB e FILEC como referências.

Se a coluna 1 do fileb ou filec estiver na coluna 2 do filea, obtenha a coluna 2 do fileb ou filec (se o arquivo da coluna 1 não for igual a 63), senão imprima 'outros' (consulte OUTPUT1).

A saída final seria a soma da coluna 4 (grupo por coluna 2 e 5 de OUTPUT1) e contagem por coluna 5 (OUTPUT 1).

FILEA

 63,234111,000,2
 63,234111,111,3
 56,456711,000,2
 63,678999,111,1

FILEB

 234,XXX
 456,ZZZ

FILEC

 4567,YYY
 234,GGG

OUTPUT1

 63,234111,000,2,XXX
 63,234111,111,3,XXX
 56,456711,000,2,YYY
 63,678999,111,1,OTHERS

FINAL

 C1, C2,     C3,  SUM of C4, XXX, ZZZ, YYY, GGG, OTHERS
 63, 234111, 000, 5,         2,   0,   0,   0,   0
 56, 456111, 000, 2,         0,   0,   1,   0,   0
 63, 678999, 111, 1,         0,   0,   0,   0,   1

Eu tenho um script aqui, mas muito lento para processar arquivos muito grandes.

##tagging (ref fileb)

awk -F~ 'NR==FNR {a[$1+0]=$2;next} $1+0==63 {print $0"~"a[$2+0]}' fileb filea > OUTPUT

##tagging (ref filea)

awk -F~ 'NR==FNR {a[$1+0]=$2;next} $1+0!~63 {print $0,a[$2+0]}' filec OUTPUT > OUTPUT

##tagging others

awk -F~ '{if ($5 == "") print $0,"OTHERS"}' > OUTPUT

##sum and count

awk 'BEGIN { FS=OFS=SUBSEP="~"}{arr[$2,$5]+=$4 }{arr2[$2,$5]++}END {for (i in arr) print i,arr[i],arr2[i]}'
    
por User101 10.01.2017 / 07:55

0 respostas