2011-08-07 30 views
6

Nie mogę znaleźć rozwiązania awk dla tego prostego zadania. I łatwo można podsumować kolumnę ($ 3) na podstawie jednej pasującej dziedzinie ($ 1) z:suma kolumn na podstawie dwóch pasujących pól przy użyciu awk

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

Teraz, w jaki sposób można to zrobić w oparciu o dwa pola? Powiedzmy, że $ 1 i 2 $? Oto przykładowe dane:

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

Po prostu muszę zsumować kolumnę 3, jeśli pasują pierwsze i drugie pola.

Dziękuję za pomoc!

Odpowiedz

6

Podobnie jak

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

mój wynik

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

EDIT

Ponieważ PO potrzebuje przecinki pozostać w mocy, ja edytowany odpowiedź powyżej używając @ yi_H w " przecinek ".

+0

dzięki za odpowiedź Ray Toal, ale ja już próbował tego rozwiązania i nie spełnia moje potrzeby, w Fakt, że naprawdę muszę zachować moje pola oddzielone w celu dalszego przetwarzania ... – Chargaff

+2

Przecena: 'tablica [$ 1", "$ 2]' –

+0

@ Poprawka yi_H zachowuje wyjście z trzema kolumnami; odpowiedź edytowana. –

1

rozwiązania która mniej pamięci, ale pierwsza, która sortowania (nic nie jest za darmo):

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;}' 
Powiązane problemy