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?

40voto

innocent-world Punkte 538

Meine fünfzehn Cents:

$ cat file.txt | xargs  | sed -e 's/\ /+/g' | bc

Ejemplo:

$ cat text
1
2
3
3
4
5
6
78
9
0
1
2
3
4
576
7
4444
$ cat text | xargs  | sed -e 's/\ /+/g' | bc 
5148

30voto

agc Punkte 7474

Die Verwendung des GNU datamash verwenden :

seq 10 | datamash sum 1

出力します。

55

Wenn die Eingabedaten unregelmäßig sind, mit Leerzeichen und Tabulatoren an ungeraden Stellen, kann dies zu Verwirrung führen datamash verwenden, dann entweder die -W Schalter:

<commands...> | datamash -W sum 1

...oder verwenden Sie tr um den Leerraum zu bereinigen:

<commands...> | tr -d '[[:blank:]]' | datamash sum 1

Wenn die Eingabe groß genug ist, wird die Ausgabe in wissenschaftlicher Notation erfolgen.

seq 100000000 | datamash sum 1

出力します。

5.00000005e+15

Um das in Dezimalzahlen umzuwandeln, verwenden Sie den Befehl --format Option:

seq 100000000 | datamash  --format '%.0f' sum 1

出力します。

5000000050000000

20voto

Khaja Minhajuddin Punkte 6433

Einfacher Bash-One-Liner

$ cat > /tmp/test
1 
2 
3 
4 
5
^D

$ echo $(( $(cat /tmp/test | tr "\n" "+" ) 0 ))

20voto

Jay Punkte 40418

BASH-Lösung, wenn Sie dies zu einem Befehl machen wollen (z. B. wenn Sie dies häufig tun müssen):

addnums () {
  local total=0
  while read val; do
    (( total += val ))
  done
  echo $total
}

Dann Verwendung:

addnums < /tmp/nums

17voto

sykora Punkte 88704

Sie können num-utils verwenden, obwohl es für Ihre Zwecke zu viel sein könnte. Dies ist ein Satz von Programmen zur Manipulation von Zahlen in der Shell und kann einige raffinierte Dinge tun, darunter natürlich auch das Zusammenzählen von Zahlen. Es ist ein bisschen veraltet, aber es funktioniert immer noch und kann nützlich sein, wenn Sie etwas mehr tun müssen.

https://suso.suso.org/programs/num-utils/index.phtml

Es ist wirklich einfach zu bedienen:

$ seq 10 | numsum
55

Aber bei großen Eingaben wird der Speicher knapp.

$ seq 100000000 | numsum
Terminado (killed)

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