AWK: So zählt man die Summe

AWK: So zählt man die Summe

Eingabedatei (FileInput.txt):

10 20 3 100 5 3 27

dies ist mein Awk-Skript:

BEGIN{ while((getline line < "FileInput.txt") > 0) { }

wie kann ich die Summe berechnen? Ich habe es versucht, sum+=linees summiert jedoch nur die erste Spalte.

Antwort1

So etwas kann funktionieren:

awk 'BEGIN {sum=0} {for (i = 1; i <= NF; i++) sum+=$i} END {print sum}' FileInput.txt

Antwort2

Das Problem mit Ihrem Code ist zweierlei:

  1. Es wird nicht auf die übliche Weise verwendet awk. Es durchläuft explizit die Zeilen der Datei in einem BEGINBlock. Dies ist nicht die idiomatische Art und Weise, wie man normalerweise awkProgramme schreibt, nämlich (optionale) Muster oder Bedingungen für Blöcke bereitzustellen, die für jeden Eingabedatensatz (Zeile) ausgeführt werden sollen.
  2. Da die Eingabe aus Datensätzen (standardmäßig einzelne Zeilen) mit mehr als einer Zahl besteht, müsstest du diese Datensätze so behandeln, dass die einzelnen Zahlen aufsummiert werden. Mit anderen Worten, du kannst nicht zu addieren 20 3, sumsondern müsstest das zunächst in 20und aufteilen 3.

Mit GNU awkoder mawkkönnen wir den Datensatztrenner RSauf einen regulären Ausdruck setzen, der mit jeder beliebigen Folge von Leerzeichen anstelle des standardmäßigen Zeilenumbruchs übereinstimmt. Dadurch wird awkdie Datei als eine Sammlung von durch Leerzeichen getrennten Einzelfelddatensätzen gelesen. Diese zu summieren und die Summe am Ende auszudrucken ist dann trivial:

$ awk -v RS='[[:space:]]+' '{ sum += $1 } END { print sum }' FileInput.txt
168

Alternativ,

$ awk 'BEGIN { RS = "[[:space:]]+" } { sum += $1 } END { print sum }' FileInput.txt
168

Oder Sie können eine Variante machen aufwas Romeo Ninov zeigt, das heißt, die Felder jeder Zeile werden durchlaufen,

$ awk '{ for (i = 1; i <= NF; ++i) sum += $i } END { print sum }' file
168

Antwort3

Sie können Ihre Datei so umwandeln, dass Sie eine Zahl pro Zeile haben:

tr -s '[:blank:]' '\n' < FileInput.txt

Wählen Sie dann eine Lösung aushttps://stackoverflow.com/q/2702564/7552um sie zu summieren. Zum Beispiel

tr -s '[:blank:]' '\n' < FileInput.txt | perl -nle '$sum += $_ } END { print $sum'

verwandte Informationen