Bonjour,
J'ai les variables suivantes : HH:MM:SS
00:01:52
01:25:23
00:52:23
je veux les additionner via un script en ksh. Comment puis je faire pour cumuler les heures, minutes et secondes ?
Merci
Bonjour,
J'ai les variables suivantes : HH:MM:SS
00:01:52
01:25:23
00:52:23
je veux les additionner via un script en ksh. Comment puis je faire pour cumuler les heures, minutes et secondes ?
Merci
de manière "'interactive" :u cf. la remarque de jmelyn (infra)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 #!/bin/bash for date in $@; do IFS=":" while read Heures Minutes Secondes; do ssTotalSec=$(( ((${Heures}*3600)) + ((${Minutes}*60)) + ${Secondes} )) TotalGen=$(( $TotalGen + $ssTotalSec )) done <<< "$date" # shift # inutile done date -ud @$TotalGen +%T
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Scripts/addDate.sh 00:01:52 01:25:23 00:52:23 02:19:38
Je suppose que "fichier" contient:
En utilisant la commande awk, on obtient:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 00:01:52 01:25:23 00:52:23
Edit: Attention N_BaH, ton résultat n'est pas correct à cause du changement d'heure (il n'y a que 2h19mn38s). D'où chez moi le 3e argument 1 de la fonction strftime(). Il te faut en plus l'option -u (UTC): date -u -d @GenTotal +%T
Code : Sélectionner tout - Visualiser dans une fenêtre à part awk -F ':' '{T+=$1*3600+$2*60+$3} END {print strftime("%H:%M:%S",T,1)}' fichier
j'ai recopié les solutions que vous m'avez fourni et ça ne fonctionne pas.
Il met plein d'erreur.
pour info, je fais du ksh.
J'ai testé sous ksh, et ça fonctionne. Quels sont les messages d'erreurs ?
Que donne les commandes uname -a et head -1 /etc/issue ?
ça me donne :
HP-UX nomdemamachine B.11.31
GENERIC SYSNAME (HP release B.11.31)
j'ai recopié le code suivant, en le mettant dans un fichier toto.ksh (en 777)
en changeant #!/bin/bash par #!/usr/bin/ksh#!/bin/bash
for date in $@; do
IFS=":"
while read Heures Minutes Secondes; do
ssTotalSec=$(( ((${Heures}*3600)) + ((${Minutes}*60)) + ${Secondes} ))
TotalGen=$(( $TotalGen + $ssTotalSec ))
done <<< "$date"
shift
done
date -ud @$TotalGen +%T
aprés je saisi :
toto.ksh 23:22:45 01:26:55
Et alors, ça marche?
Ici, nous sommes dans un forum Linux qui est GNU: les commandes et notamment leurs options ne sont pas toujours les mêmes que HP-UX, AIX ou SunOS.
dans la boucle et quand il commence son calcul, il ne prends pas en compte les variables heures, minutes secondes
ill m'affiche cela ((*3600)) + ((*60)) + : syntax error
Je reprends la solution que j'avais proposée, en supprimant les extensions GNU:
En supposant que fichier contient:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 #!/bin/bash awk -F ':' '{T+=$1*3600+$2*60+$3} END \ { H=int(T/3600) M=int((T-H*3600)/60) S=T-H*3600-M*60 print H":"M":"S }' fichier
Ce devrait être bon sur un système non-GNU.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 00:01:52 01:25:23 00:52:23
ok ça fonctionne !!
mais maintenant si on suppose que "fichier" n'est pas un fichier mais une variable, comment je peux faire !!!
merci
Le plus simple est:
Code : Sélectionner tout - Visualiser dans une fenêtre à part echo $myVar | awk '...'
si par exemple, je fais un cat $fichier | awk ' ....', ça fonctionne bien.
par contre, si je fais un echo "${toto}" | awk ' ....'
Il me fait le calcul que sur la dernière ligne.
Faut voir comment est vraiment le contenu de la variable. Ce que tu écris paraît correct. Mais la manière d'initialiser cette variable ne l'est peut-être pas, notamment à cause des retours à la ligne. Et il est probable que ce soit ce genre de problème. Essaie de juste faire echo "$toto": il ne devrait y avoir qu'une seule heure par ligne.
S'il n'y a pas de retour à la ligne entre les heures, awk fonctionnera incorrectement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 $ echo $toto 01:23:45 09:08:07 ...
ok ça fonctionne !!
mais en resultat , j'ai par exemple :
2:2:26 correspondant à 2H2mn et 26 secondes.
Alors que en affichage, je souhaiterai avoir 02:02:26, comment puis je faire ?
D'autre part, comment puis je rediriger mon résulat print dans une variable X.
merci
Deux modifications pour la une! Et l'addition siouplé!
Ou bien à partir d'une variable (myVar1) et pas d'un fichier:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 read myVar <<< $(awk -F ':' '{T+=$1*3600+$2*60+$3} END \ { H=int(T/3600) M=int((T-H*3600)/60) S=T-H*3600-M*60 printf "%02d:%02d:%02d\n", H, M, S }' fichier)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 read myVar2 <<< $(echo myVar1 | awk -F ':' '{T+=$1*3600+$2*60+$3} END \ { H=int(T/3600) M=int((T-H*3600)/60) S=T-H*3600-M*60 printf "%02d:%02d:%02d\n", H, M, S }')
et pas simplement myVar=$(...), parce que...?
Pour me taper la honte, bien sûr...
T'as parfaitement raison.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager