Atualizar:
Aqui está uma nova implementação que faz uso da dc
"base de saída" de s. Observe que se a soma total for superior a 60 horas, isso produzirá quatro valores separados por espaço em vez de três. (E se a soma total for inferior a uma hora, apenas dois valores separados por espaço serão exibidos.)
awk '{print $2}' file.txt | tr : \ | dc -f - -e '60o0ddd[+r60*+r60d**+z1<a]dsaxp'
A entrada é assumida em triplos de hora, minuto, segundo, conforme mostrado na pergunta.
A saída na entrada fornecida é:
16 43
Resposta original:
Vamos fazer isso com dc
sua calculadora de mesa. É o back-end bc
e é extremamente flexível, embora muitas vezes considerado enigmático.
Primeiro, algum pré-processamento para fornecer apenas os horários e converter os dois pontos em espaços:
awk '{print $2}' | tr : ' '
Também poderíamos fazer isso com o Sed:
sed -En -e 's/^.*([0-9][0-9]):([0-9][0-9]):([0-9][0-9]).*$/\1 \2 \3/p'
Eu vou com o Awk e tr
porque é mais simples. Qualquer um dos comandos acima produz uma saída limpa no seguinte formato. (Estou usando meu próprio texto de exemplo porque o considero mais interessante; ele inclui horas. O seu também funcionará.)
$ cat input
9 39 42
8 04 50
7 49 32
10 01 54
7 19 18
Dado os tempos no formato acima, execute-os através do seguinte script Sed e canalize o resultado dc
conforme mostrado:
sed -e '1s/^/0 /' -e 's/$/ r 60 * + r 60 60 * * + +/' -e '$s/$/ 60 60 * ~ 60 ~ f/' input | dc
(Dividido para reduzir a rolagem lateral :)
sed <input \
-e '1s/^/0 /' \
-e 's/$/ r 60 * + r 60 60 * * + +/' \
-e '$s/$/ 60 60 * ~ 60 ~ f/' |
dc
A saída será segundos, minutos, horas, nessa sequência. (Observe que esta é uma sequência invertida.) Estou apenas aprendendo, dc
portanto, essa não é uma solução perfeita, mas acho que é muito bom para uma primeira olhada dc
.
Exemplo de entrada e saída, colado diretamente do meu 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
$