Ich möchte wissen, wie viel Zeit eine Reihe von Prozessen in meinem Computer insgesamt benötigt, um zu entscheiden, ob ich dort oder auf einem stärkeren Computer ausgeführt werden soll. Also prognostiziere ich die Laufzeit jedes Befehls. Die Ausgabe sieht aus wie:
process1 00:03:34
process2 00:00:35
process3 00:12:34
Wie kann ich die zweite Spalte summieren, um eine Gesamtlaufzeit zu erhalten? Ich könnte versuchen, jede Zeile durchzublättern
awk '{sum += $2 } END { print sum }
Dies macht jedoch keinen Sinn, da die Werte keine natürlichen Zahlen sind.
bash
time
arithmetic
je_b
quelle
quelle
Angenommen, Sie verwenden den integrierten Befehl bash 'time', bevor Sie Ihr Programm ausführen, können Sie dies
export TIMEFORMAT=%0R
. Die Ausgabe wird dann in ganzen Sekunden von awk hinzugefügt. Weitere Informationen finden Sie im Abschnitt 'Shell-Variablen' der Bash-Manpage.quelle
Wenn Sie
TIMEFORMAT
Ihre Zeit nicht in Sekunden umwandeln können (oder wollen) , addieren Sie sie. Zum Beispiel Rohrausgang durch:Oder wenn Sie möchten, können Sie den letzten
echo
Befehl durch austauschenquelle
$[sum/60%60]
, um die Stunden abzustreifen.Aktualisieren:
Hier ist eine neue Implementierung, die die
dc
"Ausgabebasis" nutzt . Beachten Sie, dass bei einer Gesamtsumme von mehr als 60 Stunden vier statt drei durch Leerzeichen getrennte Werte ausgegeben werden . (Und wenn die Gesamtsumme weniger als eine Stunde beträgt, werden nur zwei durch Leerzeichen getrennte Werte ausgegeben.)Es wird angenommen, dass die Eingabe in Dreifachstunden, Minuten und Sekunden erfolgt, wie in der Frage gezeigt.
Die Ausgabe an der bereitgestellten Eingabe ist:
Ursprüngliche Antwort:
Lassen Sie uns dies mit
dc
Ihrem Schreibtischrechner tun . Es ist das Back-Endbc
und äußerst flexibel, obwohl es oft als kryptisch angesehen wird.Zunächst einige Vorverarbeitungen, um nur die Zeiten anzugeben und die Doppelpunkte in Leerzeichen umzuwandeln:
Wir könnten das auch mit Sed machen:
Ich werde mit Awk gehen und
tr
weil es einfacher ist. Jeder der obigen Befehle erzeugt eine saubere Ausgabe im folgenden Format. (Ich verwende meinen eigenen Beispieltext, weil ich ihn für interessanter halte. Er enthält Stunden. Ihre werden auch funktionieren.)Führen Sie die angegebenen Zeiten im obigen Format durch das folgende Sed-Skript und leiten Sie das Ergebnis
dc
wie gezeigt weiter:(Aufgeschlüsselt, um das seitliche Scrollen zu reduzieren :)
Die Ausgabe erfolgt in dieser Reihenfolge in Sekunden, Minuten, Stunden. (Beachten Sie, dass dies eine umgekehrte Reihenfolge ist.) Ich lerne gerade,
dc
daher ist dies keine perfekte Lösung, aber ich denke, es ist ziemlich gut für einen ersten Blickdc
.Beispiel für eine Ein- und Ausgabe, die direkt von meinem Terminal eingefügt wurde:
quelle
Hier ist meine Lösung - verwenden
split()
. Gesamtzeit in Sekunden drucken:Drucken im schönen Zeitformat:
GNU awk unterstützt auch strftime, verwendet jedoch Ihre aktuelle Zeitzone, sodass die Ergebnisse verwirrend wären.
quelle
gawk
mitTZ=UTC0 gawk...
der Zeitzone Ausgabe zu entfernen.Einfach teilen und berechnen:
quelle
Variation der Themen hier, aber mehr Pfeifen
quelle
Fast jede Shell könnte rechnen:
Verwenden Sie
getseconds $=t
in zsh, um es zu teilen.quelle