In Bash kann ich einige Zeitmessungen aus einer solchen Protokolldatei abrufen
grep "time:" myLogfile.txt | cut -d' ' -f 3 >> timeMeasurements.txt
#timeMeasurements.txt
2.5
3.5
2.0
...
Jetzt möchte ich den Mittelwert aus den Werten in berechnen timeMeasurements.txt
. Was ist der schnellste Weg, um das in Bash zu tun?
Ich weiß, dass es Gnuplot und R gibt, aber es scheint, als müsste man für beide ein langes Skript schreiben.
command-line
bash
mcExchange
quelle
quelle
Antworten:
Ein anderer Weg, mit
sed
undbc
:Der sed-Ausdruck konvertiert die Eingabe in etwa Folgendes:
Dies wird weitergeleitet,
bc
um es Zeile für Zeile auszuwerten.quelle
Obligatorische GNU-Datamash- Version
ASIDE : es fühlt sich an wie dies wirklich sollte möglich sein , nativ in
bc
(dh ohne die Schale verwendet wird , oder ein externes Programm, um eine Schleife über Eingangswert). Die GNU-bc
Implementierung enthält eineread()
Funktion - es scheint jedoch frustrierend schwierig zu sein, das Ende der Eingabe zu erkennen. Das Beste, was ich mir einfallen lassen kann, ist:Anschließend können Sie die Dateieingabe weiterleiten, sofern Sie die Eingabe mit einem nicht numerischen Zeichen beenden, z
quelle
sudo apt install datamash
war auf meiner Ubuntu 16.04 VM ausreichend.Sie könnten verwenden
awk
. Bash selbst ist nicht sehr gut in Mathe ...Anmerkungen
lines=0; total=0
Setzen Sie die Variablen auf 0lines++
lines
für jede Zeile um eins erhöhentotal+=$1
Addieren Sie den Wert in jeder Zeile zur laufenden Summeprint total/lines
Wenn Sie fertig sind, teilen Sie die Summe durch die Anzahl der Wertequelle
awk
- so könnte man „Golf“ diesawk '{total+=$1} END{print total/NR}'
Anpassen des R-Befehls aus diesem U & L-Beitrag :
quelle
Sie können
bc
den Basisrechner in einerwhile
Schleife verwenden mitread
:Oder besser lesbar:
Erläuterung:
while read -r num; do ... ; done < timeMeasurements.txt
, um dies zu tun. Dies bedeutet, dass wir für jede Zeile der Datei etwas tun.((count++))
.$(...)
mitecho
piped,bc
um den Wert der Variablen num für diese Zeile der Datei zur Summe der Variablen num aus allen vorherigen Zeilen hinzuzufügen.bc
wird verwendet, da bash mit Gleitkomma-Arithmetik nicht gut zurechtkommt.An diesem Punkt endet die Schleife, die Zählvariable enthält die Anzahl der Zeitmesswerte, die Summenvariable enthält die Summe der Zeitmessungen.
echo
diese Variablen, um die Mittelwertberechnung zu erstellen, an die übergeben wirdbc
. Derscale=2
Teil gibt an,bc
wie viele signifikante Zahlen angezeigt werden sollen.quelle
Das Datamash One scheint eine gute Option zu sein, aber selbst wenn ich anerkenne, dass meine Antwort übertrieben sein kann, ist die Oktave nicht so ausführlich, nur für den Fall, dass Sie ein bisschen mehr als nur einen Mittelwert machen möchten:
Wenn Sie Mittelwerte verwenden, denken Sie daran, dass der gleiche Mittelwert aus sehr unterschiedlichen Verhaltensweisen stammen kann. Daher ist die Standardabweichung normalerweise auch relevant:
oder sogar ein einfaches Histogramm ist einfach zu machen:
Ich denke auch, dass Datamash nicht in den apt-get-Repositorys für vertrauenswürdige Versionen enthalten ist, sondern nur für neuere Versionen.
Bearbeiten:
Oneliner für skriptfreundlichere Anwendungen:
quelle