Aktualizacja:
Oto nowa implementacja, która wykorzystuje dc
„bazę wyjściową”. Zauważ, że jeśli łączna suma jest większa niż 60 godzin, spowoduje to wygenerowanie czterech wartości oddzielonych spacjami zamiast trzech. (A jeśli całkowita suma jest mniejsza niż jedna godzina, zostaną wyświetlone tylko dwie wartości rozdzielone spacjami.)
awk '{print $2}' file.txt | tr : \ | dc -f - -e '60o0ddd[+r60*+r60d**+z1<a]dsaxp'
Zakłada się, że dane wejściowe będą trzykrotnie godziny, minuty, sekundy, jak pokazano w pytaniu.
Dane wyjściowe na dostarczonym wejściu to:
16 43
Oryginalna odpowiedź:
Zróbmy to za pomocą dc
kalkulatora biurkowego. Jest to back-end bc
i jest niezwykle elastyczny, choć często uważany za tajemniczy.
Po pierwsze, niektóre wstępne przetwarzanie, aby podać tylko czasy i przekonwertować dwukropki na spacje:
awk '{print $2}' | tr : ' '
Możemy to również zrobić za pomocą Sed:
sed -En -e 's/^.*([0-9][0-9]):([0-9][0-9]):([0-9][0-9]).*$/\1 \2 \3/p'
Pójdę z Awk i tr
ponieważ jest to prostsze. Każde z powyższych poleceń generuje czysty wynik w następującym formacie. (Używam własnego przykładowego tekstu, ponieważ uważam go za bardziej interesujący; zawiera godziny. Twój też będzie działał).
$ cat input
9 39 42
8 04 50
7 49 32
10 01 54
7 19 18
Biorąc pod uwagę czasy w powyższym formacie, uruchom je za pomocą następującego skryptu Sed i potokuj wynik, dc
jak pokazano:
sed -e '1s/^/0 /' -e 's/$/ r 60 * + r 60 60 * * + +/' -e '$s/$/ 60 60 * ~ 60 ~ f/' input | dc
(Podzielone, aby zmniejszyć przewijanie w bok :)
sed <input \
-e '1s/^/0 /' \
-e 's/$/ r 60 * + r 60 60 * * + +/' \
-e '$s/$/ 60 60 * ~ 60 ~ f/' |
dc
Dane wyjściowe będą w sekundach, minutach, godzinach w tej sekwencji. (Zauważ, że jest to odwrócona sekwencja.) Właśnie się uczę, dc
więc nie jest to idealne rozwiązanie, ale myślę, że jest całkiem dobry na pierwsze spojrzenie dc
.
Przykładowe dane wejściowe i wyjściowe, wklejone bezpośrednio z mojego terminala:
$ 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
$