Оновлення:
Ось нова реалізація, яка використовує dc
"вихідну базу". Зауважте, що якщо загальна сума більше 60 годин, це виведе чотири розділені пробіли значення замість трьох. (І якщо загальна сума менше однієї години, виведеться лише два значення, розділені пробілом.)
awk '{print $2}' file.txt | tr : \ | dc -f - -e '60o0ddd[+r60*+r60d**+z1<a]dsaxp'
Вхідні дані приймаються у тричі години, хвилини, секунди, як показано в питанні.
Вихід на поданий вхід:
16 43
Оригінальна відповідь:
Давайте зробимо це з dc
вашим настільним калькулятором. Це задній край bc
, і він надзвичайно гнучкий, хоча часто вважається виразним.
По-перше, деяка попередня обробка, щоб дати часу лише та перетворити колонки в пробіли:
awk '{print $2}' | tr : ' '
Ми також могли б зробити це за допомогою Sed:
sed -En -e 's/^.*([0-9][0-9]):([0-9][0-9]):([0-9][0-9]).*$/\1 \2 \3/p'
Я піду з Awk і tr
тому, що це простіше. Будь-яка з вищевказаних команд видає чистий вихід у наступному форматі. (Я використовую власний приклад тексту, тому що вважаю його більш цікавим; він включає години. Також будуть працювати і ваші.)
$ cat input
9 39 42
8 04 50
7 49 32
10 01 54
7 19 18
Зазначені рази у наведеному вище форматі, запустіть їх через наступний скрипт Sed і передайте результат, dc
як показано:
sed -e '1s/^/0 /' -e 's/$/ r 60 * + r 60 60 * * + +/' -e '$s/$/ 60 60 * ~ 60 ~ f/' input | dc
(Розбито вниз, щоб зменшити прокрутку в бік :)
sed <input \
-e '1s/^/0 /' \
-e 's/$/ r 60 * + r 60 60 * * + +/' \
-e '$s/$/ 60 60 * ~ 60 ~ f/' |
dc
Вихід буде у цій послідовності секундами, хвилинами, годинами. (Зауважте, це зворотна послідовність.) Я просто навчаюся, dc
тому це не ідеальне рішення, але я думаю, що це досить добре для першого погляду dc
.
Приклад введення та виводу, вставлений безпосередньо з мого терміналу:
$ 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
$