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
Version imprimable
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:
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:
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:
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 +%TCode: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/kshCitation:
#!/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:
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:
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: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:
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:
1
2
3
4
5
6
7
8read 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:
1
2
3
4
5
6
7
8read 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... :aie::aie::aie:
T'as parfaitement raison.