столбец суммы, основанный на двух совпадающих полях, использующих awk - PullRequest
6 голосов
/ 07 августа 2011

Я не могу найти решение awk для этой простой задачи.Я могу легко суммировать столбец (3 доллара) на основе одного совпадающего поля (1 доллар) с помощью:

awk -F, '{array[$1]+=$3} END { for (i in array) {print i"," array[i]}}' datas.csv

Теперь, как я могу сделать это на основе двух полей?Скажем, $ 1 и $ 2?Вот пример данных:

P1,gram,10  
P1,tree,12  
P1,gram,34  
P2,gram,23  
...

Мне просто нужно сложить столбец 3, если первое и второе поля совпадают.

Спасибо за любую помощь!

Ответы [ 2 ]

6 голосов
/ 07 августа 2011

Примерно так:

awk -F, '{array[$1","$2]+=$3} END { for (i in array) {print i"," array[i]}}' datas.csv

Мой результат

P1,tree,12
P1,gram,44
P2,gram,23

РЕДАКТИРОВАТЬ

Поскольку ОП требует, чтобы запятые оставались на выходе,Я отредактировал ответ выше, используя @ yi_H "запятая исправить".

1 голос
/ 07 августа 2011

Для решения, которое требует меньше памяти, но сначала нуждается в сортировке (ничего не свободно):

sort datas.csv | awk -F "," 'NR==1{last=$1 "," $2; sum=0;}{if (last != $1 "," $2) {print last "," sum; last=$1 "," $2; sum=0;} sum += $3;}END{print last "," sum;}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...