Imprime palavras únicas, número total de ocorrências e soma usando 'awk'

3

Como posso imprimir palavras únicas, o número de suas ocorrências e a soma de seus valores na coluna relevante usando uma única matriz em awk ?

Estou usando awk como:

awk -F, '{sum[]+=} END{for (x in sum) print x, sum[x]}' inFile

Posso modificar o comando acima para imprimir o número total de ocorrências de palavras únicas também? Algo como o resultado abaixo para a seguinte entrada de amostra:

Resultado (a ordem dos resultados impressos não importa):

A 2 25 
B 1 12 
C 3 18

Entrada:

A,15
C,13
C,4
A,10
B,12
C,1

Eu posso adicionar outra matriz para contá-las separadamente, mas acho que deve haver outra maneira de imprimi-las usando apenas a mesma matriz.

Existe algum índice da matriz sum que armazena o total de palavras vistas?

    
por αғsнιη 03.01.2016 / 09:44

2 respostas

2

Isso deve ser feito:

awk -F, '{x[]["count"]++;x[]["sum"]+=}END{for(y in x){print y,x[y]["count"],x[y]["sum"]}}' in

Basicamente, você substitui a matriz por uma matriz multidimensional para armazenar a contagem das ocorrências de cada primeiro campo exclusivo e a soma de seus segundos campos relativos.

% cat in
A,15
C,13
C,4
A,10
B,12
C,1
% awk -F, '{x[]["count"]++;x[]["sum"]+=}END{for(y in x){print y,x[y]["count"],x[y]["sum"]}}' in
A 2 25
B 1 12
C 3 18
    
por kos 03.01.2016 / 10:22
5

Não, não existe esse índice. Os valores da matriz não contam quantas vezes foram incrementados. A coisa mais natural a fazer aqui é usar uma segunda matriz:

$ awk -F, '{sum[]+=;seen[]++} END{for(x in sum) print x,seen[x],sum[x]}' file
A 2 25
B 1 12
C 3 18

Você também pode usar uma matriz bidimensional como mostrado na resposta de Kos, mas, como você pode ver, isso realmente não simplifica as coisas de forma alguma. Alternativamente, você poderia usar alguma magia perl:

$ perl -F, -lane 'push @{$k{$F[0]}},${$k{$F[0]}}[-1]+$F[1]; 
            END{print "$_ ",$#{$k{$_}}+1," ${$k{$_}}[-1]" for keys(%k)}' file
C 3 18
B 1 12
A 2 25

Não, isso não é ruído de linha e sim, ele usa uma única matriz para imprimir tudo.

    
por terdon 03.01.2016 / 10:40