Как я могу распечатать уникальные слова, количество их случаев и сумму их значений в соответствующем столбце с помощью единого массива в awk
?
Я использую awk
как:
awk -F, '{sum[$1]+=$2} END{for (x in sum) print x, sum[x]}' inFile
Я могу изменить команду выше для печати общего количества случаев уникальных слов также? Что-то как ниже результата для следующего демонстрационного входа:
Результат (порядок печатных результатов не имеет значения):
A 2 25
B 1 12
C 3 18
Вход:
A,15
C,13
C,4
A,10
B,12
C,1
Я могу добавить другой массив для подсчета их отдельно, но я думаю, что должен быть другой способ распечатать его просто использование того же массива.
Есть ли любой индекс массива sum
который хранит общие замеченные слова?
Это должно сделать:
awk -F, '{x[$1]["count"]++;x[$1]["sum"]+=$2}END{for(y in x){print y,x[y]["count"],x[y]["sum"]}}' in
В основном Вы заменяете массив многомерным массивом для хранения и количества происшествий каждого уникального первого поля и суммы их относительных вторых полей.
% cat in
A,15
C,13
C,4
A,10
B,12
C,1
% awk -F, '{x[$1]["count"]++;x[$1]["sum"]+=$2}END{for(y in x){print y,x[y]["count"],x[y]["sum"]}}' in
A 2 25
B 1 12
C 3 18
Нет, нет такого индекса. Значения массива не проводят подсчет того, сколько раз они были увеличены. Самая естественная вещь сделать здесь состоит в том, чтобы использовать второй массив:
$ awk -F, '{sum[$1]+=$2;seen[$1]++} END{for(x in sum) print x,seen[x],sum[x]}' file
A 2 25
B 1 12
C 3 18
Можно также использовать двумерную матрицу как показано в ответе Коса, но, как Вы видите, это действительно не упрощает вещи всегда. С другой стороны, Вы могли использовать некоторое волшебство жемчуга:
$ 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
Нет, это не шум в линии и да, он использует единый массив для печати всего.