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]}'
Tags performance awk