Aggiornare:
Ecco una nuova implementazione che utilizza dc
la "base di output". Se la somma totale è superiore a 60 ore, verranno generati quattro valori separati da spazi anziché tre. (E se la somma totale è inferiore a un'ora, verranno emessi solo due valori separati da spazio.)
awk '{print $2}' file.txt | tr : \ | dc -f - -e '60o0ddd[+r60*+r60d**+z1<a]dsaxp'
Si presume che l'input sia in triple di ora, minuti, secondi, come mostrato nella domanda.
L'output sull'input fornito è:
16 43
Risposta originale:
Facciamolo con il dc
tuo calcolatore da scrivania. È il back-end bc
, ed è estremamente flessibile anche se spesso considerato criptico.
Innanzitutto, alcune pre-elaborazioni per fornire solo i tempi e convertire i due punti in spazi:
awk '{print $2}' | tr : ' '
Potremmo farlo anche con Sed:
sed -En -e 's/^.*([0-9][0-9]):([0-9][0-9]):([0-9][0-9]).*$/\1 \2 \3/p'
Andrò con Awk e tr
perché è più semplice. Uno dei comandi precedenti produce un output pulito nel seguente formato. (Sto usando il mio testo di esempio perché lo considero più interessante; ha ore incluse. Anche il tuo funzionerà.)
$ cat input
9 39 42
8 04 50
7 49 32
10 01 54
7 19 18
Dati i tempi nel formato sopra, eseguili attraverso il seguente script Sed e convoglia il risultato dc
come mostrato:
sed -e '1s/^/0 /' -e 's/$/ r 60 * + r 60 60 * * + +/' -e '$s/$/ 60 60 * ~ 60 ~ f/' input | dc
(Suddiviso per ridurre lo scorrimento laterale :)
sed <input \
-e '1s/^/0 /' \
-e 's/$/ r 60 * + r 60 60 * * + +/' \
-e '$s/$/ 60 60 * ~ 60 ~ f/' |
dc
L'output sarà secondi, minuti, ore, in quella sequenza. (Nota che questa è una sequenza inversa.) Sto solo imparando, dc
quindi questa non è una soluzione perfetta, ma penso che sia abbastanza buono per una prima occhiata dc
.
Esempio di input e output, incollati direttamente dal mio terminale:
$ 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
$