Usando o awk para filtragem e o GNU Datamash para o pivoting que você pode fazer:
$ awk -F, '$3=="MP" && $10=="S" && $5!="MP"' FILE.TXT \
| datamash --sort -t, --group 5 sum 12 sum 15
AI,1,0.2
AIR,5,1
BIR,10,2
Estou tentando dinamizar um arquivo usando o awk. Este é um exemplo do meu arquivo de entrada:
P2P,P2P,MP,DL,AIR,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2
P2P,P2P,MP,DL,AI,UP,HR,UPE,GSM,F,PP,4,NA,0.2,0.8
P2P,P2P,MP,DL,AIR,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2
P2P,P2P,MP,DL,AI,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2
P2P,P2P,MP,DL,AIR,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2
P2P,P2P,MP,DL,AIR,UP,HR,UPE,GSM,F,PP,1,NA,0.2,0.2
P2P,P2P,MP,DL,BIR,UP,HR,UPE,GSM,S,PP,10,NA,0.2,2
P2P,P2P,MP,KT,AIR,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2
P2P,P2P,MP,MM,AIR,UP,HR,UPE,GSM,S,PP,1,NA,0.2,0.2
A saída desejada deve estar seguindo.
AIR,5,1
AI,1,0.2
BIR,10,2
$5
. $12
(total de $12
). $15
(total de $15
). A condição deve seguir em awk
:
$3=="MP" && $10=="S" && $5!="MP"
Usando o awk para filtragem e o GNU Datamash para o pivoting que você pode fazer:
$ awk -F, '$3=="MP" && $10=="S" && $5!="MP"' FILE.TXT \
| datamash --sort -t, --group 5 sum 12 sum 15
AI,1,0.2
AIR,5,1
BIR,10,2
com awk
:
awk -F, '$3=="MP"&&$10=="S"&&$5!="MP"{a[$5]+=$12;b[$5]+=$15}
END{for(i in a){print i","a[i]","b[i]}}' file
-F,
define o delimitador como ,
. $3=="MP"&&$10=="S"&&$5!="MP"{...}
esta é a condição da questão
a[$5]+=$12;b[$5]+=$15
preenche uma matriz a
com o valor total de $12
e uma matriz b
com o valor total de $15
. END{...}
este bloco é executado quando awk
terminou o processamento de todas as linhas.
for(i in a)
faz um loop no array a
print i","a[i]","b[i]}
imprime os valores nas duas matrizes e seu índice. A saída:
AI,1,0.2
AIR,5,1
BIR,10,2
Tags text-processing awk