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?

15voto

fgeorgatos Punkte 146

Ich kann nicht umhin, diese Frage zu stellen, sie ist der allgemeinste Ansatz für diese Frage, bitte prüfen Sie das:

jot 1000000 | sed '2,$s/$/+/;$s/$/p/' | dc

Sie ist hier zu finden, ich war der OP und die Antwort kam aus dem Publikum:

Und hier sind seine besonderen Vorteile gegenüber awk , bc , perl , GNUs Datenmaschinerie und Freunde:

  • es verwendet Standard-Dienstprogramme, die in jeder Unix-Umgebung üblich sind
  • sie ist nicht von der Pufferung abhängig und somit bei wirklich langen Eingaben nicht abgewürgt wird .
  • sie impliziert keine besonderen Genauigkeitsgrenzen -oder ganzzahlige Größe für diese Angelegenheit-, hallo AWK Freunde!
  • keine Notwendigkeit für einen anderen Code, wenn Gleitkommazahlen hinzugefügt werden müssen, stattdessen .
  • er läuft theoretisch ungehindert in den wenigsten Umgebungen

12voto

Nym Punkte 126

Ich weiß, dass dies eine alte Frage ist, aber ich finde diese Lösung so gut, dass ich sie mit Ihnen teilen möchte.

% cat > numbers.txt
1 
2 
3 
4 
5
^D
% cat numbers.txt | perl -lpe '$c+=$_}{$_=$c'
15

Wenn Interesse besteht, werde ich erklären, wie es funktioniert.

12voto

sed 's/^/.+/' infile | bc | tail -1

11voto

Francisco Canedo Punkte 1920

Das Folgende funktioniert in der Bash:

I=0

for N in `cat numbers.txt`
do
    I=`expr $I + $N`
done

echo $I

8voto

Oliver Ertl Punkte 41

Bash pur und in einem Einzeiler :-)

$ cat numbers.txt
1
2
3
4
5
6
7
8
9
10

$ I=0; for N in $(cat numbers.txt); do I=$(($I + $N)); done; echo $I
55

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