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 :

[awk] Calcul moyennes de temps


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2012
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2012
    Messages : 17
    Points : 17
    Points
    17
    Par défaut [awk] Calcul moyennes de temps
    Bonjour,

    J'ai un fichier sous cette forme

    NOMA,00:00:23
    NOMB,00:20:00
    NOMC,02:00:00
    NOMA,02:10:12
    NOMB,03:40:30

    J'aimerais trouver avec la commande awk le moyen d'obtenir un fichier sous cette forme :

    NOMA,temps_moyen
    NOMB,temps_moyen
    NOMC,temps_moyen


    Merci par avance et Joyeuses Fêtes...

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    Bonjour,

    tu dois créer un tableau qui prendra le premier champ en indice, et qui prendra l'addition des heures, minutes (converties en secondes) et les secondes en valeur.
    à la fin (END) du script awk, il faut afficher chaque indice du tableau, et convertir en heures:minutes:secondes le total des secondes.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2012
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2012
    Messages : 17
    Points : 17
    Points
    17
    Par défaut Un exemple
    Voici le code auquel je suis arrivé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    #!/bin/sh
     
    awk 'BEGIN {
         FS=";"}
         {if ($1 in A)
            {
             split($2,sec,":");
             second[$1]=second[$1]+sec[1]*3600+sec[2]*60+sec[3];
             cpt[$1]++;
             next;
            }
         else
            {
             split($2,sec,":");
             second[$1]=second[$1]+sec[1]*3600+sec[2]*60+sec[3];
             traitement[$1]=$1;
             cpt[$1]++;
            }
         A[$1]=""}
         END {
             for (x in A) {
             tmp=second[x]/cpt[x];
             printf "%s;%02d:%02d:%02d\n", traitement[x], int(tmp/3600), int(tmp/60%60), int(tmp%60);
            }
            }
         ' liste.20161223
    J'aimerais avoir vos remarques...

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    je ne comprends pas l'intérêt des tableaux A (et donc de la condition d'existence de $1 dans ce tableau), et traitement.
    il devrait suffire de travailler avec les tableaux second, et cpt.

    vu qu'il n'y a que du awk, tu peux changer le shebang pour #!/usr/bin/awk -f, et adapter légèrement le script; le nom du fichier sera passé en argument.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre à l'essai
    Inscrit en
    Février 2012
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2012
    Messages : 17
    Points : 17
    Points
    17
    Par défaut Merci
    Merci pour les infos.

    Pour le shebang, cela vient du fait que c'est une toute petite partie d'un script plus important.

    Pour le tableau, là j'aurais besoin d'un petit exemple.

    Encore merci 😊

  6. #6
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 277
    Points : 12 722
    Points
    12 722
    Par défaut
    Bonjour,

    Voici une idée, reste plus qu'a inclure la partie transformation en seconde, pour l'addition, et la conversion en heure avant affichage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ cat /tmp/file1.txt 
    NOMA,23
    NOMB,20
    NOMC,02
    NOMA,12
    NOMB,40
    $ awk -F\, '{A[$1]++;B[$1]+=$2}END{OFS=FS;for (i in A){print i,B[i]/A[i]}}' /tmp/file1.txt 
    NOMA,17.5
    NOMB,30
    NOMC,2
    Cordialement.

  7. #7
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    le même genre de solution, mais avec la moyenne sous forme horaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    awk -F',' '{nb[$1]++; "date -u +%s -d \"01/01/1970 " $2 " +0000\"" |& getline z; val[$1]+=z} END {for(i in nb){v=val[i]/nb[i]; "date -u +%H:%M:%S -d@" v |& getline z; print i "," z}}' fichier
    NOMA,01:05:17
    NOMB,02:00:15
    NOMC,02:00:00
    la version dépliée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    {
       nb[$1]++;
       "date -u +%s -d \"01/01/1970 " $2 " +0000\"" |& getline z;
       val[$1] += z
    }
     
    END {
       for (i in nb) {
          v = val[i] / nb[i];
          "date -u +%H:%M:%S -d@" v |& getline z;
          print i "," z
       }
    }
    ...et par avance un bon réveillon à tous

  8. #8
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 277
    Points : 12 722
    Points
    12 722
    Par défaut
    Bon, ok, tout en gnu awk (sinon pas marrant ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ cat /tmp/file1.txt 
    NOMA,00:00:23
    NOMB,00:20:00
    NOMC,02:00:00
    NOMA,02:10:12
    NOMB,03:40:30
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ cat /tmp/awkfile1.sh 
    #!/bin/sh
    TZ=UTC awk -F\, '{
    	gsub(/:/," ",$2)
    	A[$1]++
    	B[$1]+=strftime("%s",mktime("1970 01 01 "$2))
    }
    END{
    	OFS=FS
    	for (i in A){
    		print i,strftime("%H:%M:%S",B[i]/A[i])
    	}
    }' /tmp/file1.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ /tmp/awkfile1.sh 
    NOMA,01:05:17
    NOMB,02:00:15
    NOMC,02:00:00
    Bonne Fête à tous.
    Cordialement.

  9. #9
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Bon, ok, tout en gnu awk (sinon pas marrant )
    en plus d'être faux ouai, j'avais des résultats incohérents pour avoir oublié le -u à date

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Calculer Moyenne avec un vecteur
    Par theserialkiller10 dans le forum C++
    Réponses: 5
    Dernier message: 20/11/2007, 21h23
  2. Calcul moyenne par requête
    Par mulanzia2003 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 07/11/2007, 08h23
  3. [CR XI] Formule calculer moyenne
    Par campia dans le forum Formules
    Réponses: 9
    Dernier message: 05/07/2007, 12h13
  4. Réponses: 35
    Dernier message: 10/05/2006, 01h11
  5. [TP]Calculer delai de temps
    Par Alkangelis dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 03/11/2004, 13h05

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