Ergebnis

Ergebnis

Ich habe eine Datei wie diese:

paper 3
paper 6
eraser 2
pencil 9
pencil 44
pencil 1

Ich möchte die Zeilen mit einem gemeinsamen ersten Feld wie folgt zusammenfassen:

paper 9
eraser 2
pencil 54

Gibt es eine nette Einzeiler-Methode, um dies mit Standard-Unix-Dienstprogrammen zu tun? Oder sogar mit nicht ganz so standardmäßigen Unix-Dienstprogrammen.

Antwort1

Schauen Sie sich das hier an:

$ echo "$a"
paper 3
paper 6
eraser 2
pencil 9
pencil 44
pencil 1

$ awk '{a[$1]=a[$1]+$2}END{for (i in a) print i,a[i]}' <(echo "$a")
pencil 54
eraser 2
paper 9

Ersetzen Sie <(echo "$a)durch Ihr file:

$ awk '{a[$1]=a[$1]+$2}END{for (i in a) print i,a[i]}' file

Antwort2

Mit dem nicht ganz so standardmäßigen DienstprogrammGNU Datamash

$ datamash --whitespace groupby 1 sum 2 < file
paper   9
eraser  2
pencil  54

oder prägnanter

$ datamash -Wg 1 sum 2 < file
paper   9
eraser  2
pencil  54

Antwort3

Wenn uns die Druckreihenfolge wichtig ist, können wir Folgendes tun:

perl -lane '$h{$F[0]}+=$F[1]; $h[-1+keys%h]=$F[0]; END{print "$_ $h{$_}" for @h}'

Die Idee besteht darin, die laufenden Summen eines bestimmten Elements im Hash %hund die Reihenfolge beizubehalten, in der das bestimmte Element im @hArray angezeigt wurde. Am Ende der Datei drucken wir einfach den Hash (Schlüssel+Wert), übernehmen aber die Reihenfolge aus @hdem Array.

Ergebnis

paper 9
eraser 2
pencil 54

Antwort4

Hier ist ein nicht ganz so süßer Einzeiler in awk:

awk '{ if (prev && prev != $1) { print prev, sum; sum = 0 }; sum += $2; prev = $1 } END { print prev, sum }' < file.txt

Dabei ist es erforderlich, dass Zeilen mit gleichem Wert im ersten Feld zusammengefasst werden. Ist dies nicht der Fall, können Sie sort file.txt | awk ....

verwandte Informationen