1116 Stimmen

Shell-Befehl zum Summieren ganzer Zahlen, eine pro Zeile?

Ich bin auf der Suche nach einem Befehl, der (als Eingabe) mehrere Textzeilen akzeptiert, wobei jede Zeile eine einzelne Ganzzahl enthält, und die Summe dieser Ganzzahlen ausgibt.

Als Hintergrundinformation habe ich eine Protokolldatei, die Zeitmessungen enthält. Durch Suchen nach den relevanten Zeilen und ein wenig sed Umformatierung kann ich alle Zeitangaben in dieser Datei auflisten. Ich möchte die Gesamtsumme ausrechnen. Ich kann diese Zwischenausgabe an einen beliebigen Befehl weiterleiten, um die Endsumme zu bilden. Ich habe immer verwendet expr in der Vergangenheit, aber solange es nicht im RPN-Modus läuft, glaube ich nicht, dass es damit zurechtkommt (und selbst dann wäre es schwierig).

Wie kann ich die Summe ganzer Zahlen ermitteln?

1664voto

Paul Dixon Punkte 286600

Ein bisschen awk sollte genügen?

awk '{s+=$1} END {print s}' mydatafile

Hinweis: Einige Versionen von awk haben ein seltsames Verhalten, wenn Sie mehr als 2^31 (2147483647) addieren wollen. Siehe Kommentare für mehr Hintergrundinformationen. Ein Vorschlag ist die Verwendung von printf statt print :

awk '{s+=$1} END {printf "%.0f", s}' mydatafile

801voto

radoulov Punkte 1541

Paste fügt normalerweise Zeilen aus mehreren Dateien zusammen, kann aber auch dazu verwendet werden, einzelne Zeilen einer Datei in eine einzige Zeile umzuwandeln. Mit dem Delimiter-Flag können Sie eine Gleichung vom Typ x+x an bc übergeben.

paste -s -d+ infile | bc

Alternativ, wenn Sie von stdin aus pipen,

<commands> | paste -s -d+ - | bc

160voto

dF. Punkte 70587

Die Einzeiler-Version in Python:

$ python -c "import sys; print(sum(int(l) for l in sys.stdin))"

129voto

Ich würde ein großes WARNING auf die allgemein anerkannte Lösung setzen:

awk '{s+=$1} END {print s}' mydatafile # DO NOT USE THIS!!

Das liegt daran, dass awk in dieser Form eine vorzeichenbehaftete 32-Bit-Ganzzahlendarstellung verwendet: bei Summen, die 2147483647 (d.h. 2^31) überschreiten, kommt es zum Überlauf.

Eine allgemeinere Antwort (für die Summierung ganzer Zahlen) würde lauten:

awk '{s+=$1} END {printf "%.0f\n", s}' mydatafile # USE THIS INSTEAD

104voto

banyan Punkte 3298

Avec jq :

seq 10 | jq -s 'add' # 'add' is equivalent to 'reduce .[] as $item (0; . + $item)'

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X