Mettre à jour:
Voici une nouvelle implémentation qui utilise dc
la "base de sortie" de. Notez que si la somme totale est supérieure à 60 heures, cela produira quatre valeurs séparées par des espaces au lieu de trois. (Et si la somme totale est inférieure à une heure, seules deux valeurs séparées par des espaces seront générées.)
awk '{print $2}' file.txt | tr : \ | dc -f - -e '60o0ddd[+r60*+r60d**+z1<a]dsaxp'
L'entrée est supposée être en triplets d'heure, minute, seconde, comme indiqué dans la question.
La sortie sur l'entrée fournie est:
16 43
Réponse originale:
Faisons cela avec dc
votre calculatrice de bureau. C'est le back-end bc
et extrêmement flexible bien que souvent considéré comme cryptique.
Tout d'abord, un certain prétraitement pour ne donner que les heures, et convertir les deux-points en espaces:
awk '{print $2}' | tr : ' '
On pourrait aussi faire ça avec Sed:
sed -En -e 's/^.*([0-9][0-9]):([0-9][0-9]):([0-9][0-9]).*$/\1 \2 \3/p'
J'irai avec Awk et tr
parce que c'est plus simple. L'une des commandes ci-dessus produit une sortie propre au format suivant. (J'utilise mon propre exemple de texte parce que je le trouve plus intéressant; il comprend des heures. Le vôtre fonctionnera également.)
$ cat input
9 39 42
8 04 50
7 49 32
10 01 54
7 19 18
Étant donné les heures dans le format ci-dessus, exécutez-les via le script Sed suivant et canalisez le résultat dc
comme indiqué:
sed -e '1s/^/0 /' -e 's/$/ r 60 * + r 60 60 * * + +/' -e '$s/$/ 60 60 * ~ 60 ~ f/' input | dc
(Décomposé pour réduire le défilement latéral :)
sed <input \
-e '1s/^/0 /' \
-e 's/$/ r 60 * + r 60 60 * * + +/' \
-e '$s/$/ 60 60 * ~ 60 ~ f/' |
dc
La sortie sera en secondes, minutes, heures, dans cette séquence. (Notez que c'est une séquence inversée.) J'apprends juste dc
donc ce n'est pas une solution parfaite, mais je pense que c'est assez bon pour un premier regard dc
.
Exemple d'entrée et de sortie, collé directement depuis mon 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
$