Summe aller Spalten in einer Datei, muss flexibel sein, so viele Spalten wie in der Datei sind

Summe aller Spalten in einer Datei, muss flexibel sein, so viele Spalten wie in der Datei sind

Hallo, ich muss die Summe aller Spalten in einer Datei erhalten. Dabei muss es flexibel sein, so viele Spalten wie in einer Datei vorhanden sind.

derzeit verwende ich:

awk '{for (i=1;i<=NF;i++) sum[i]+=$i;}; END{for (i in sum) print sum[i];}'

Dies gibt mir jedoch nur die Summe der ersten Spalte, die ich natürlich in einer Schleife verarbeiten könnte, aber ich würde etwas Einfacheres bevorzugen.

Irgendwelche Ideen/Antworten?

Antwort1

Estutgibt Ihnen die Summe aller Spalten, aber in einer Spalte (vorausgesetzt, die Daten sind durch Leerzeichen getrennt):

$ cat data.in
1 2
3 4
5 6

$ awk '{ for (i=1;i<=NF;i++) sum[i]+=$i } END { for (i in sum) print sum[i] }' data.in
12 
9 

Es geht also darum,keine Ausgabe einer neuen Zeile zwischen jeder Summe.

$ awk '{ for (i=1;i<=NF;i++) sum[i]+=$i } END { for (i in sum) printf("%d ", sum[i]); printf("\n") }' data.in
12 9

Die printf()Funktion nimmt einen Formatstring entgegen. Dies %dist der Formatstring für eine Ganzzahl ( %ffür Gleitkommazahlen verwenden), und das folgende Leerzeichen wird auch nach der Ganzzahl ausgegeben. Wir beenden die Funktion dann mit der Ausgabe einer expliziten neuen Zeile nach der Schleife.

Eine andere Möglichkeit zur Lösung des Problems besteht in der Verwendung der ORSVariable („Output Record Separator“):

$ awk 'BEGIN { ORS=" " } { for (i=1;i<=NF;i++) sum[i]+=$i } END { for (i in sum) print sum[i]; printf("\n") }' data.in
12 9

Beachten Sie auch Dave Thompsons aufschlussreiche Warnung in den Kommentaren weiter unten zur Reihenfolge der Schlüssel in den assoziativen Arrays von Awk (deren Sortierung nicht garantiert ist).

Antwort2

perl -lane '$sum[$_] += $F[$_] for 0..$#F; END {print join $", @sum}' data.in

verwandte Informationen