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
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?
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
Tags awk shell-script