Обновить:
Вот новая реализация, которая использует 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
$