Actualizar:
Aquí hay una nueva implementación que hace uso de dc
la "base de salida". Tenga en cuenta que si la suma total es más de 60 horas, esto generará cuatro valores separados por espacios en lugar de tres. (Y si la suma total es inferior a una hora, solo se generarán dos valores separados por espacios).
awk '{print $2}' file.txt | tr : \ | dc -f - -e '60o0ddd[+r60*+r60d**+z1<a]dsaxp'
Se supone que la entrada está en triples de hora, minuto, segundo, como se muestra en la pregunta.
La salida en la entrada proporcionada es:
16 43
Respuesta original:
Hagamos esto con dc
su calculadora de escritorio. Es el back-end bc
y es extremadamente flexible, aunque a menudo se considera críptico.
Primero, algo de preprocesamiento para dar solo los tiempos y convertir los dos puntos en espacios:
awk '{print $2}' | tr : ' '
También podríamos hacer esto con Sed:
sed -En -e 's/^.*([0-9][0-9]):([0-9][0-9]):([0-9][0-9]).*$/\1 \2 \3/p'
Iré con Awk y tr
porque es más simple. Cualquiera de los comandos anteriores produce una salida limpia en el siguiente formato. (Estoy usando mi propio texto de ejemplo porque lo considero más interesante; tiene horas incluidas. El suyo también funcionará).
$ cat input
9 39 42
8 04 50
7 49 32
10 01 54
7 19 18
Dados los tiempos en el formato anterior, ejecútelos en el siguiente script Sed y canalice el resultado dc
como se muestra a continuación:
sed -e '1s/^/0 /' -e 's/$/ r 60 * + r 60 60 * * + +/' -e '$s/$/ 60 60 * ~ 60 ~ f/' input | dc
(Desglosado para reducir el desplazamiento lateral :)
sed <input \
-e '1s/^/0 /' \
-e 's/$/ r 60 * + r 60 60 * * + +/' \
-e '$s/$/ 60 60 * ~ 60 ~ f/' |
dc
La salida será segundos, minutos, horas, en esa secuencia. (Tenga en cuenta que esta es una secuencia inversa.) Estoy aprendiendo, dc
así que esta no es una solución perfecta, pero creo que es bastante buena para un primer vistazo dc
.
Ejemplo de entrada y salida, pegado directamente desde mi terminal:
$ 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
$