Como girar os dados por awk no script de shell unix?

0

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
  • Aqui, o primeiro campo pertence a $5 .
  • O segundo campo corresponde a $12 (total de $12 ).
  • E o terceiro campo pertence a $15 (total de $15 ).

A condição deve seguir em awk :

$3=="MP" && $10=="S" && $5!="MP"
    
por user3548033 12.01.2016 / 12:48

2 respostas

0

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
    
por 12.01.2016 / 22: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
    
por 12.01.2016 / 13:01