AWK: Soma dos valores em uma coluna com base nas entradas de outra coluna [duplicada]

3

Gostaria de somar os valores numéricos listados na terceira coluna da tabela abaixo com base nas entradas fornecidas na primeira coluna da mesma tabela. O conteúdo da tabela é o seguinte:

John|Login|2
Mary|Login|10
Mary|Payroll|100
John|Login|200
John|Logout|10
Mary|Payroll|10

O resultado esperado é o seguinte:

John|Login|202
John|Logout|10
Mary|Login|10
Mary|Payroll|110

Como posso usar awk para obter este resultado?

    
por user279255 25.09.2018 / 15:17

2 respostas

1

Este comando funcionou para mim. deve funcionar para você:

     awk -F '|' '{a[$1"|"$2"|"]+= $3} END{for (i in a) print i, a[i]}' filename | sort -k 1,1
John|Login| 202
John|Logout| 10
Mary|Login| 10
Mary|Payroll| 110
    
por 25.09.2018 / 15:50
1

Se você tem o GNU awk instalado, você não precisa usar outra ferramenta sort para definir a ordem correta, mas você pode fazê-lo em awk . Você pode definir a maneira como a passagem da matriz é feita, definindo uma variável especial PROCINFO["sorted_in"] . Consulte Usando pedidos de varredura de matriz predefinidos com gawk

No seu caso, você pode configurá-lo para classificar pelo índice em ordem crescente

awk -vFS="|" -vOFS="|"  '{ 
                             primaryKey=($1 FS $2)
                         }{ 
                             db[primaryKey]+=$3; next 
                         } END { 
                             PROCINFO["sorted_in"] = "@ind_str_asc"
                             for(key in db) 
                                 print key, db[key] 
                         }' file
    
por 25.09.2018 / 16:09