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.)
awk '{print $2}' file.txt | tr : \ | dc -f - -e '60o0ddd[+r60*+r60d**+z1<a]dsaxp'
Es wird angenommen, dass die Eingabe in Dreifachstunden, Minuten und Sekunden erfolgt, wie in der Frage gezeigt.
Die Ausgabe an der bereitgestellten Eingabe ist:
16 43
Ursprüngliche Antwort:
Lassen Sie uns dies mit dc
Ihrem Schreibtischrechner tun . Es ist das Back-End bc
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:
awk '{print $2}' | tr : ' '
Wir könnten das auch mit Sed machen:
sed -En -e 's/^.*([0-9][0-9]):([0-9][0-9]):([0-9][0-9]).*$/\1 \2 \3/p'
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.)
$ cat input
9 39 42
8 04 50
7 49 32
10 01 54
7 19 18
Führen Sie die angegebenen Zeiten im obigen Format durch das folgende Sed-Skript und leiten Sie das Ergebnis dc
wie gezeigt weiter:
sed -e '1s/^/0 /' -e 's/$/ r 60 * + r 60 60 * * + +/' -e '$s/$/ 60 60 * ~ 60 ~ f/' input | dc
(Aufgeschlüsselt, um das seitliche Scrollen zu reduzieren :)
sed <input \
-e '1s/^/0 /' \
-e 's/$/ r 60 * + r 60 60 * * + +/' \
-e '$s/$/ 60 60 * ~ 60 ~ f/' |
dc
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 Blick dc
.
Beispiel für eine Ein- und Ausgabe, die direkt von meinem Terminal eingefügt wurde:
$ cat input
9 39 42
8 04 50
7 49 32
10 01 54
7 19 18
$ sed -e '1s/^/0 /' -e 's/$/ r 60 * + r 60 60 * * + +/' -e '$s/$/ 60 60 * ~ 60 ~ f/' input | dc
16
55
42
$