2010-02-22 26 views
13

Ich habe eine Textdatei, die ist:Wie kann ich Werte in einer Spalte basierend auf dem Wert in einer anderen Spalte zusammenfassen?

ABC 50 
DEF 70 
XYZ 20 
DEF 100 
MNP 60 
ABC 30 

ich eine Ausgabe wollen die einzelnen Werte aufsummiert und zeigt sie als Ergebnis. Zum Beispiel ist die Summe aller ABC-Werte in der Datei (50 + 30 = 80) und DEF ist (100 + 70 = 170). So sollte der Ausgang alle eindeutige 1. Spalte Namen als -

ABC 80 
DEF 170 
XYZ 20 
MNP 60 

summieren Jede mögliche Hilfe wird sehr geschätzt.

Dank

Antwort

3

awk '{sums[$1] += $2} END { for (i in sums) printf("%s %s\n", i, sums[i])}' input_file | sort

wenn Sie die Ergebnisse alphabetisch sortiert nicht benötigen, fallen nur die | sort Teil.

+0

verlieren die Katze. Seine UUOC. – ghostdog74

+0

@ ghostdog74: in der Tat – ggiroux

1
my %data; 
while (<>) { 
    if (my ($key, $value) = /^(\w+) \s* (\d+)$/x) { 
     $data{$key} += $value; 
    } 
} 
printf "%s %s\n", $_, $data{$_} for keys %data; 
+0

Warum nicht auf Leerzeichen statt Regex aufgeteilt? – ghostdog74

+0

Jeder Weg würde funktionieren. Mein Ansatz ist ein wenig validierender, aber auch etwas komplexer. –

10
$ awk '{a[$1]+=$2}END{for(i in a) print i,a[i]}' file 
ABC 80 
XYZ 20 
MNP 60 
DEF 170 
5
$ perl -lane \ 
    '$sum{$F[0]} += $F[1]; 
    END { print "$_ $sum{$_}" 
      for sort grep length, keys %sum }' \ 
    input 
ABC 80 
DEF 170 
MNP 60 
XYZ 20
2
perl -lane '$_{$F[0]}+=$F[1]}print"$_ $_{$_}"for keys%_;{' file 

Und ein bisschen weniger einfach:

perl -ape '$_{$F[0]}+=$F[1]}map$\.="$_ $_{$_}\n",keys%_;{' file 
+0

3 Zeichen kürzer: perl -anE '$ _ {$ F [0]} + = $ F [1]} sagen "$ _ $ _ {$ _}" für Schlüssel% _; {' Datei –

+0

Ich weiß. Aber es funktioniert nur in 5.010;) – codeholic

Verwandte Themen