hallo,
aus einer Pipe kommen viele Zahlen raus.
20.90 36.90 36.90 36.90 36.90 36.90 36.90 52.90 50.90 ...
Diese sollen aufsummiert werden und zum Schluss die Summe angezeigt werden. Wie stelle ich das am besten an?
Mit freundlichen Grüßen
Jens Puruckherr
Hi Jens,
On Wed, May 16, 2007 at 13:43:43 +0200, Jens Puruckherr wrote:
aus einer Pipe kommen viele Zahlen raus.
[...]
36.90 52.90 50.90 ...
Diese sollen aufsummiert werden und zum Schluss die Summe angezeigt werden. Wie stelle ich das am besten an?
Ein Loesung waere:
cat zahlen | (tr '\012' + ; echo 0.00) | bc
Das zieht alle Summanden zusammen in eine Zeile. Koennte zum Problem werden, wenn die maximale Zeilenlaenge von bc dadurch ueberschritten wird. Ausserdem geht diese Loesung davon aus, dass die Eingabe aus der Pipe Unix-Zeilenenden (also nur LF) verwendet. Sind es DOS-Zeilenenden (CR+LF), muesste noch ein zusaetzliches tr zum Entfernen des CR in die Kette.
Gruss, Chris
Am 16.05.07 schrieb Christian Perle chris@linuxinfotag.de:
Hi Jens,
On Wed, May 16, 2007 at 13:43:43 +0200, Jens Puruckherr wrote:
aus einer Pipe kommen viele Zahlen raus.
[...]
36.90 52.90 50.90 ...
Diese sollen aufsummiert werden und zum Schluss die Summe angezeigt werden. Wie stelle ich das am besten an?
Ein Loesung waere:
cat zahlen | (tr '\012' + ; echo 0.00) | bc
Das zieht alle Summanden zusammen in eine Zeile. Koennte zum Problem werden, wenn die maximale Zeilenlaenge von bc dadurch ueberschritten wird.
Der Summandenbeschränkung könnte man ja so begegnen:
cat zahlen | while read summand; do summe=$(echo "$summe + $summand" | bc); done;
Wobei es natürlich nicht sehr ökonomisch ist, für jede Zahl nen neues bc zu starten.
Robert
mit perl: $summe=0; while(<>){ $summe=$summe+$_; } print $summe;
Falls perl nicht auf Deinem System ist, einfach apt-get install perl o.ae. eingeben
On 5/16/07, Jens Puruckherr jpuruckherr@cyberport.de wrote:
hallo,
aus einer Pipe kommen viele Zahlen raus.
20.90 36.90 36.90 36.90 36.90 36.90 36.90 52.90 50.90 ...
Diese sollen aufsummiert werden und zum Schluss die Summe angezeigt werden. Wie stelle ich das am besten an?
Mit freundlichen Grüßen
Jens Puruckherr
Lug-dd maillist - Lug-dd@mailman.schlittermann.de http://mailman.schlittermann.de/mailman/listinfo/lug-dd
Frank Gerlach frankgerlach@gmail.com (Mi 16 Mai 2007 15:15:25 CEST):
mit perl: $summe=0; while(<>){ $summe=$summe+$_; } print $summe;
#! /usr/bin/perl $summe += $_ while <>; print $summe, "\n";
oder:
perl -ne '$summe += $_; END { print $summe, "\n" }' <FILE
#! /usr/bin/perl $summe += $_ while <>; print $summe, "\n";
oder:
perl -ne '$summe += $_; END { print $summe, "\n" }' <FILE
Bitte noch eine kryptischere variante. Vielleicht mit awk ? Ich denke, (ohne Eigenlob, ganz objektiv), dass mein perl Skript am einfachsten zu verstehen ist. Man sollte nicht immer alles in eine Zeile packen......
On 5/18/07, Frank Gerlach frankgerlach@gmail.com wrote:
Bitte noch eine kryptischere variante.
Wie wäre es mit:
ruby -le 'print readlines.inject(0) { |sum, f| sum += f.to_f }' < FILE
?
Viele Grüße, Torsten
Frank Gerlach wrote:
#! /usr/bin/perl $summe += $_ while <>; print $summe, "\n";
oder:
perl -ne '$summe += $_; END { print $summe, "\n" }' <FILE
Bitte noch eine kryptischere variante. Vielleicht mit awk ?
awk '{s=s+$1} END {print s}' FILE
Ich denke, (ohne Eigenlob, ganz objektiv), dass mein perl Skript am einfachsten zu verstehen ist. Man sollte nicht immer alles in eine Zeile packen......
Nicht immer ist Lesbarkeit das Ziel :-)
Ciao, Thomas
Am Freitag, 18. Mai 2007 23:31 schrieb Frank Gerlach:
#! /usr/bin/perl $summe += $_ while <>; print $summe, "\n";
oder:
perl -ne '$summe += $_; END { print $summe, "\n" }' <FILE
Bitte noch eine kryptischere variante. Vielleicht mit awk ?
.... | awk '{sum +=$1} END{print sum}'
Ich denke, (ohne Eigenlob, ganz objektiv), dass mein perl Skript am einfachsten zu verstehen ist. Man sollte nicht immer alles in eine Zeile packen......
Kann man aber ;-)
Jens
Am 19.05.07 schrieb Jens Weiße jens.weisse@gmx.net:
Am Freitag, 18. Mai 2007 23:31 schrieb Frank Gerlach:
#! /usr/bin/perl $summe += $_ while <>; print $summe, "\n";
oder:
perl -ne '$summe += $_; END { print $summe, "\n" }' <FILE
Bitte noch eine kryptischere variante. Vielleicht mit awk ?
.... | awk '{sum +=$1} END{print sum}'
das sieht für mich ein ganzes Stück lesbarer aus als der Perl-Code.
Schönen Gruß Robert
On 5/19/07, Robert Müller muellerrobert@gmail.com wrote:
das sieht für mich ein ganzes Stück lesbarer aus als der Perl-Code.
Aber will man wirklich die locale berücksichtigen?
$ echo -e "0.3\n0.2" | awk '{sum +=$1} END{print sum}' 0 $ echo -e "0,3\n0,2" | awk '{sum +=$1} END{print sum}' 0,5
Mir sieht das wie die Excel-Krankheit aus; im Vergleich dazu:
$ echo -e "0.3\nbla" | ruby -le 'print readlines.inject(0) { |sum, f| sum += f.to_f }' 0.3 $ echo -e "0.3\nbla" | perl -ne '$summe += $_; END { print $summe, "\n" }' 0.3
Gefällt mir besser.
Viele Grüße, Torsten
On 5/19/07, Torsten Werner mail.twerner@googlemail.com wrote:
Mir sieht das wie die Excel-Krankheit aus; im Vergleich dazu:
$ echo -e "0.3\nbla" | ruby -le 'print readlines.inject(0) { |sum, f| sum += f.to_f }' 0.3 $ echo -e "0.3\nbla" | perl -ne '$summe += $_; END { print $summe, "\n" }' 0.3
Korrektur:
$ echo -e "0.3\n0.2" | ruby -le 'print readlines.inject(0) { |sum, f| sum += f.to_f }' 0.5 $ echo -e "0.3\n0.2" | perl -ne '$summe += $_; END { print $summe, "\n" }' 0.5
Am 19.05.07 schrieb Torsten Werner mail.twerner@googlemail.com:
On 5/19/07, Robert Müller muellerrobert@gmail.com wrote:
das sieht für mich ein ganzes Stück lesbarer aus als der Perl-Code.
Aber will man wirklich die locale berücksichtigen?
$ echo -e "0.3\n0.2" | awk '{sum +=$1} END{print sum}' 0 $ echo -e "0,3\n0,2" | awk '{sum +=$1} END{print sum}' 0,5
Mir sieht das wie die Excel-Krankheit aus; im Vergleich dazu:
$ echo -e "0.3\nbla" | ruby -le 'print readlines.inject(0) { |sum, f| sum += f.to_f }' 0.3 $ echo -e "0.3\nbla" | perl -ne '$summe += $_; END { print $summe, "\n" }' 0.3
Gefällt mir besser.
echo -e "0.3\n0.2" | LANG=c awk '{sum +=$1} END{print sum}'
gefällt mir besser, abgesehen davon würde ich in einem Script immer eine Definierte Umgebung schaffen.
Bis dann dann Robert
Zitat von Frank Gerlach frankgerlach@gmail.com:
Bitte noch eine kryptischere variante.
Schnellschuss mit PHP:
cat zahlen.txt | php -r 'while (!feof(STDIN)) { $summe += fgets(STDIN); } echo $summe;'
Tschau,
Falk
PS: Suche Variante mit Phyton
Das ist ja richtig verstaendlicher Code :-)
On 5/22/07, Martin Vieweg martin.vieweg@gugux.de wrote:
falk.doering@fadoe.de schrieb:
PS: Suche Variante mit Phyton
[pypipe.py]:
#!/usr/bin/python import os; sum = 0 data = os.popen("./irgendeinprozess.sh").readlines() for i in data: sum += float(i[0:5]) print sum
Grüße Martin
Lug-dd maillist - Lug-dd@mailman.schlittermann.de http://mailman.schlittermann.de/mailman/listinfo/lug-dd
On 5/22/07, Frank Gerlach frankgerlach@gmail.com wrote:
Das ist ja richtig verstaendlicher Code :-)
Explizite for-Schleifen sind doch schon seit 10 Jahren aus der Mode...
Viele Grüße, Torsten
lug-dd@mailman.schlittermann.de