Jede Zeile enthält Text und Zahlen in einer Spalte. Ich muss die Summe der Zahlen in jeder Zeile berechnen. Wie kann ich das machen? Danke
example.log enthält:
time=31sec
time=192sec
time=18sec
time=543sec
Die Antwort sollte 784 sein
Jede Zeile enthält Text und Zahlen in einer Spalte. Ich muss die Summe der Zahlen in jeder Zeile berechnen. Wie kann ich das machen? Danke
example.log enthält:
time=31sec
time=192sec
time=18sec
time=543sec
Die Antwort sollte 784 sein
Antworten:
Wenn Sie
grep
Unterstützung-o
wünschen, können Sie Folgendes versuchen:POSIXly:
quelle
Mit einer neueren Version (4.x) von GNU
awk
:Mit anderen
awk
s versuchen:quelle
s+0
für den Fall, dasss
leer ist, wird es0
statt leer gedruckt .s
leer sein kann. Wenn die Eingabedaten keine Zeilen enthalten (dh wenn überhaupt keine Eingabe erfolgt ). In diesem Fall sind zwei Verhaltensweisen möglich. 1) keine Eingabe => keine Ausgabe oder 2) immer etwas ausgeben, wenn nur 0. Beide Optionen sind je nach Anwendungskontext sinnvoll. Die+0
Adressierung Option 2). Um Option 1) anzusprechen, müssten Sie lieber schreibenEND {if(s) print s}
. - Daher ist es nicht sinnvoll, eine der beiden Optionen (für diesen Eckfall ohne Daten) anzunehmen, bis sie in der Frage angegeben sind.quelle
time=1.4e5sec
Ein weiterer GNU
awk
:Eine
perl
Eins:Ein POSIX eins:
quelle
quelle
sed
:awk --field-separator = '{ sum+=$2 } END { print sum}' data.dat
-F'='
verwenden--field-separator =
man awk
einziger gibt-F fs
und--field-separator fs
-F'='
oder es-F '='
gibt zwei Möglichkeiten, dies zu tun-F fs
(in Ihrem Fall ist fs "="). Ich habe die einfachen Anführungszeichen hinzugefügt, um sicherzustellen, dass das fs von awk richtig gesehen und interpretiert wird, nicht von der Shell (nützlich, wenn das fs zum Beispiel ';' ist)Sie können dies versuchen:
quelle
Jeder hat tolle
awk
Antworten gepostet , die ich sehr mag.Eine Variation von @cuonglm ersetzt
grep
durchsed
:sed
Streifen alles außer den Zahlen.paste -sd+ -
Befehl verbindet alle Zeilen zu einer einzigen Zeilebc
wertet den Ausdruck ausquelle
Sie sollten einen Taschenrechner verwenden.
Mit Ihren vier Zeilen, die gedruckt werden:
Und einfacher:
... was druckt ...
Wenn Geschwindigkeit das ist, wonach Sie streben,
dc
ist es das, was Sie wollen. Traditionell war esbc
der Compiler - und ist es immer noch für viele Systeme.quelle
dc
so nahe wie ich es beurteilen kann. Worüber redest du?perl
das Standard-Unix-Toolset als Benchmark verwenden - ist es nicht sehr sinnvoll, GNU-Tools zu verwenden, die in einer GNU-Toolchain kompiliert wurden. Alles, was die Leistung von Perl negativ beeinflussen kann, ist auch in all diesen GNU-kompilierten GNU-Utils enthalten. Traurig aber wahr. Sie benötigen ein echtes, einfach aufgebautes, einfaches Toolset, um den Unterschied genau beurteilen zu können. Wie ein Erbstück-Werkzeugkasten, der statisch mit den Bibliotheken der Muslime verknüpft ist - auf diese Weise können Sie das Ein-Werkzeug / Ein-Job-Paradigma mit dem Ein-Werkzeug-um-sie-alle-zu-regieren-vergleichen.Durch python3,
quelle
re.findall
gibt eine Liste von Zeichenketten zurück, dies wird nicht funktionierensum(int(e) for e in l)
ist mehr pythonisch.Reine Bash-Lösung (Bash 3+):
Kurzfassung:
quelle
PS4='$((x+=${time%s*}))' time=0 x=0 sh -x <infile