
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+=line
es 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:
- Es wird nicht auf die übliche Weise verwendet
awk
. Es durchläuft explizit die Zeilen der Datei in einemBEGIN
Block. Dies ist nicht die idiomatische Art und Weise, wie man normalerweiseawk
Programme schreibt, nämlich (optionale) Muster oder Bedingungen für Blöcke bereitzustellen, die für jeden Eingabedatensatz (Zeile) ausgeführt werden sollen. - 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
,sum
sondern müsstest das zunächst in20
und aufteilen3
.
Mit GNU awk
oder mawk
können wir den Datensatztrenner RS
auf einen regulären Ausdruck setzen, der mit jeder beliebigen Folge von Leerzeichen anstelle des standardmäßigen Zeilenumbruchs übereinstimmt. Dadurch wird awk
die 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'