IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

cumul minute heure seconde


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    Par défaut cumul minute heure seconde
    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

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 587
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 587
    Points : 19 471
    Points
    19 471
    Par défaut
    de manière "'interactive" :
    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
    u cf. la remarque de jmelyn (infra)
    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

  3. #3
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Je suppose que "fichier" contient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    00:01:52
    01:25:23
    00:52:23
    En utilisant la commande awk, on obtient:
    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
    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

  4. #4
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    Par défaut
    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.

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 587
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 587
    Points : 19 471
    Points
    19 471
    Par défaut
    J'ai testé sous ksh, et ça fonctionne. Quels sont les messages d'erreurs ?

  6. #6
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Que donne les commandes uname -a et head -1 /etc/issue ?

  7. #7
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    Par défaut
    ça me donne :

    HP-UX nomdemamachine B.11.31


    GENERIC SYSNAME (HP release B.11.31)

  8. #8
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    Par défaut
    j'ai recopié le code suivant, en le mettant dans un fichier toto.ksh (en 777)

    #!/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
    en changeant #!/bin/bash par #!/usr/bin/ksh

    aprés je saisi :
    toto.ksh 23:22:45 01:26:55

  9. #9
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    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.

  10. #10
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    Par défaut
    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

  11. #11
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Je reprends la solution que j'avais proposée, en supprimant les extensions GNU:
    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
    En supposant que fichier contient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    00:01:52
    01:25:23
    00:52:23
    Ce devrait être bon sur un système non-GNU.

  12. #12
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    Par défaut
    ok ça fonctionne !!

    mais maintenant si on suppose que "fichier" n'est pas un fichier mais une variable, comment je peux faire !!!

    merci

  13. #13
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Le plus simple est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $myVar | awk '...'

  14. #14
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    Par défaut
    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.

  15. #15
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    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.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ echo $toto
    01:23:45
    09:08:07
    ...
    S'il n'y a pas de retour à la ligne entre les heures, awk fonctionnera incorrectement.

  16. #16
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    624
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 624
    Points : 69
    Points
    69
    Par défaut
    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

  17. #17
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Deux modifications pour la une! Et l'addition siouplé!
    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)
    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 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
    }')

  18. #18
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 587
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 587
    Points : 19 471
    Points
    19 471
    Par défaut
    et pas simplement myVar=$(...), parce que...?

  19. #19
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Pour me taper la honte, bien sûr...
    T'as parfaitement raison.

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/04/2008, 08h27
  2. découpage secondes / minutes / heures
    Par astrofan dans le forum C++
    Réponses: 14
    Dernier message: 12/11/2007, 12h17
  3. Jour Mois anné, heure minute et seconde...
    Par SangKou dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 29/11/2005, 13h43
  4. [Dates] Jour Mois anné, heure minute et seconde...
    Par SangKou dans le forum Langage
    Réponses: 4
    Dernier message: 29/11/2005, 08h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo