Je veux connaître le temps total qu'une série de processus prendrait sur mon ordinateur pour décider si je devrais y courir ou dans un ordinateur plus puissant. Donc, je prévois le temps d'exécution de chaque commande. La sortie ressemble à:
process1 00:03:34
process2 00:00:35
process3 00:12:34
Comment additionner la deuxième colonne pour obtenir une durée totale de fonctionnement? Je pourrais essayer de parcourir chaque ligne
awk '{sum += $2 } END { print sum }
mais cela n'a aucun sens car les valeurs ne sont pas des nombres naturels.
bash
time
arithmetic
je_b
la source
la source
En supposant que vous utilisez la commande intégrée bash 'time', avant d'exécuter votre programme, vous le pouvez
export TIMEFORMAT=%0R
. La sortie sera ensuite ajoutée en secondes entières par awk. Plus d'informations sont disponibles dans la section 'Variables du shell' de la page de manuel bash.la source
Si vous ne pouvez pas (ou ne voulez pas) utiliser
TIMEFORMAT
votre simple besoin de transférer le temps en secondes, puis ajoutez-le ensemble. Par exemple, sortie de tuyau via:Ou si vous le souhaitez, vous pouvez échanger la dernière
echo
commande parla source
$[sum/60%60]
de supprimer les heures.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.)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:
Réponse originale:
Faisons cela avec
dc
votre calculatrice de bureau. C'est le back-endbc
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:
On pourrait aussi faire ça avec Sed:
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.)É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é:(Décomposé pour réduire le défilement latéral :)
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 regarddc
.Exemple d'entrée et de sortie, collé directement depuis mon terminal:
la source
Voici ma solution - utiliser
split()
. Impression du temps total en secondes:Impression au format de l'heure agréable:
GNU awk prend également en charge strftime, mais il utilisera votre fuseau horaire actuel, donc les résultats seraient déroutants.
la source
gawk
avecTZ=UTC0 gawk...
pour supprimer le problème de fuseau horaire.Il suffit de diviser et de calculer:
la source
Variation sur les thèmes ici, mais plus de tuyaux
la source
Presque n'importe quel shell pourrait faire le calcul:
Utilisez
getseconds $=t
dans zsh pour le diviser.la source