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?

7voto

Julia Punkte 1467

Hier ist eine schöne und saubere Raku (früher bekannt als Perl 6) Einzeiler:

say [+] slurp.lines

Wir können es so verwenden:

% seq 10 | raku -e "say [+] slurp.lines"
55

Es funktioniert folgendermaßen:

slurp ohne Argumente liest standardmäßig von der Standardeingabe; es gibt eine Zeichenkette zurück. Der Aufruf der lines Methode auf eine Zeichenkette gibt eine Liste von Zeilen der Zeichenkette zurück.

Die Klammern um + drehen. + in eine Reduktionsmeta-Operator die reduziert die Liste auf einen einzigen Wert: die Summe der Werte in der Liste. say und gibt es dann mit einem Zeilenumbruch auf der Standardausgabe aus.

Zu beachten ist, dass wir die Zeilen nie explizit in Zahlen umwandeln - Raku ist intelligent genug, um das für uns zu tun. Das bedeutet jedoch, dass unser Code bei Eingaben, die definitiv keine Zahlen sind, nicht funktioniert:

% echo "1\n2\nnot a number" | raku -e "say [+] slurp.lines"
Cannot convert string to number: base-10 number must begin with valid digits or '.' in 'not a number' (indicated by )
  in block <unit> at -e line 1

6voto

johnlinvc Punkte 194

Für Rubinliebhaber

ruby -e "puts ARGF.map(&:to_i).inject(&:+)" numbers.txt

6voto

clint Punkte 1

Alternative in reinem Perl, recht gut lesbar, keine Pakete oder Optionen erforderlich:

perl -e "map {$x += $_} <> and print $x" < infile.txt

4voto

Tiago Punkte 8909

Sie können es in Python tun, wenn Sie sich wohl fühlen:

Nicht getestet, nur getippt:

out = open("filename").read();
lines = out.split('\n')
ints = map(int, lines)
s = sum(ints)
print s

Sebastian wies auf ein Einzeiler-Skript hin:

cat filename | python -c"from fileinput import input; print sum(map(int, input()))"

4voto

James Anderson Punkte 26827

Folgendes sollte funktionieren (vorausgesetzt, Ihre Nummer ist das zweite Feld in jeder Zeile).

awk 'BEGIN {sum=0} \
 {sum=sum + $2} \
END {print "tot:", sum}' Yourinputfile.txt

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