6 Stimmen

Summenspalte basierend auf zwei übereinstimmenden Feldern mit awk

Ich kann keine awk-Lösung für diese einfache Aufgabe finden. Ich kann leicht eine Spalte ($3) basierend auf einem übereinstimmenden Feld ($1) mit :

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

Wie kann ich das nun auf der Grundlage von zwei Feldern tun? Sagen wir $1 und $2? Hier ist ein Beispiel für Daten:

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

Ich muss lediglich Spalte 3 summieren, wenn das erste und zweite Feld übereinstimmen.

Vielen Dank für jede Hilfe!

6voto

Ray Toal Punkte 82654

Und so

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

Mein Ergebnis

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

EDIT

Da der Auftraggeber die Kommas in der Ausgabe beibehalten möchte, habe ich die obige Antwort mit @yi_Hs "Komma-Korrektur" bearbeitet.

1voto

jfg956 Punkte 15117

Für eine Lösung, die weniger Speicherplatz benötigt, aber zuerst sortiert werden muss (nichts ist frei):

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;}'

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X