Encontre todas as ocorrências e adicione-as [duplicadas]

0

Eu tenho um arquivo como este:

user1, 10
user2, 5
user2, 6
user1, 15
user3, 23
user1, 15

Gostaria de ter totais na coluna 1 (user1, user2, user3) e torná-lo assim:

user1, 40
user2, 11
user3, 23

Qual seria o melhor caminho a seguir? Um while loop na primeira coluna e soma a segunda coluna, desde que seja o mesmo?

    
por Tuinslak 07.03.2018 / 10:31

1 resposta

2

Awk de uma linha:

$ awk -F, '{a[$1] += $2} END { for (x in a) printf "%s, %s\n", x, a[x] }' < data
user1, 40
user2, 11
user3, 23

Isso é bastante simples, o separador de campo é definido para a vírgula com -F, (isso e a vírgula na saída são as únicas alterações necessárias da duplicata). $1 e $2 são o primeiro e o segundo campos, e como o awk possui matrizes associativas, coletar as somas é simples. Você pode precisar sort da saída depois, se isso for importante.

Claro, poderíamos fazer isso puramente no Bash / ksh / zsh também, já que ele também suporta matrizes associativas, mas seria mais feio, mais lento e mais propenso a acidentes com valores engraçados. E só é útil em um sistema que, por algum motivo, tem um grande shell, mas não awk. (veja o histórico de edições, se você realmente quer isso ...)

    
por 07.03.2018 / 10:36