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 :

Question avec awk


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 2
    Par défaut Question avec awk
    Bonjour, dans le cadre d'un cours de programmation j'ai à réaliser un script awk effectuant un tri et des calculs simples.
    L'énnoncé; sur base d'une liste (exemple) ; Ville;prénom;nombre
    Hannut;Pol;1200
    Hannut;Sabine;120
    Jodoigne;Rudy;100
    Wavre;Caroline;1500
    Wavre;Didier;200
    Wavre;Thomas;1200

    Trier sur le champ ville les lignes ayant ce premier champ identique et additionner les nombre du 3e champ.
    Résultat attendu ;
    wavre 2900
    1 Caroline 1500
    2 Didier 200
    3 Thomas 1200

    Hannut 1320
    1 Pol 1200
    2 Sabine 120

    Jodoigne 100
    1 Rudy 100


    voilà mon script awk ;
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    BEGIN {
    FS=";";
    cpta=0;
    cptb=0;
    cptc=0;
          }
    suma=0;
    sumb=0;
    sumc=0;
     
     
    $1 == "Wavre" {
    grpA[cpta] = $2 " " $3;
    for(i=3;i<=NF;i++) { suma += $i; }
    sommea[cpta] = suma;
    cpta++;
     
                   }
     
    $1 == "Hannut" {
    grpB[cptb] = $2 " " $3;
    for(i=3;i<=NF;i++) { sumb += $i; }
    sommeb[cptb] = sumb;
    cptb++;
     
                   }
     
    $1 == "Jodoigne" {
    grpC[cptc] = $2 " " $3;
    for(i=3;i<=NF;i++) { sumc += $i; }
    sommec[cptc] = sumc;
    cptc++;
     
                   }
     
    END { tota=0;
          totb=0;
          totc=0;
     
    print"\n-----------------------"
     
    for(i=0;i<cpta;i++)
                    {tota += sommea[i]}
     
    print "\nwavre  " tota "\t"
     
    for(i=0;i<cpta;i++){print " " i+1 " " grpA[i]  "\t" }
     
     
     
     
    for(i=0;i<cptb;i++)
                    {totb += sommeb[i]}
     
    print "\nHannut  " totb "\t"
     
    for(i=0;i<cptb;i++){print " " i+1 " " grpB[i]  "\t" }
     
     
     
    for(i=0;i<cptc;i++)
                    {totc += sommec[i]}
     
    print "\nJodoigne  " totc "\t"
     
    for(i=0;i<cptc;i++){print " " i+1 " " grpC[i]  "\t" }
    print "\n------------------------"                 
     
                    }
    Pour lancer le tri; awk -f script.awk liste.txt

    Bon cela fonctionne.... MAIS l'astuce serait d'obtenir un awk pouvant servir pour d'autre liste de données de type : Ville;prénom;nombre. Et donc de passer outre les $1 == "tel nom de ville" .Je débute dans la progra sous awk et je ne parviens pas à trouver un moyen de déclarer mes champs subissant le tri d'une autre facon.
    Un grand merci pour votre aide!

  2. #2
    Membre chevronné
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Par défaut
    Voici un début de réponse en ksh ( à adapter avec awk !!)
    cat ok
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Hannut;Pol;1200
    Hannut;Sabine;120
    Jodoigne;Rudy;100
    Wavre;Caroline;1500
    Wavre;Didier;200
    Wavre;Thomas;1200
    cat ok.sh
    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
     
    #!/bin/ksh
     
    LE_FIC=ok
    #------------------------------------------------
    #- Pour l'ensemble des villes du fichier
    #------------------------------------------------
    for ville in `cut -d";" -f1 $LE_FIC | sort | uniq`
    do
        echo $ville
        N=0
        T=0
        #------------------------------------------------
        #- Pour l'ensemble des "prénom;nom" de la ville
        #------------------------------------------------
        for A in `grep $ville $LE_FIC | sort -t";" -r -n +2 | cut -d";" -f2,3`
        do
            N=`expr $N + 1`
            echo " $N $A"
            R=`echo $A|cut -d";" -f2`
            T=`expr $T + $R`
        done
        echo "Total $ville = $T"
        echo ""
    done
    execution de ok.sh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Hannut
     1 Pol;1200
     2 Sabine;120
    Total Hannut = 1320
     
    Jodoigne
     1 Rudy;100
    Total Jodoigne = 100
     
    Wavre
     1 Caroline;1500
     2 Thomas;1200
     3 Didier;200
    Total Wavre = 2900

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Si ton fichier est trié comme dans ton exemple, ce qui suit devrait fonctionner. Sinon, un petit passage dans sort et ça le fait.

    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
    BEGIN {
        FS = ";";
        total = 0
        ville = ""
    }
     
    {
        if ( $1 == ville || ville == "") {
            total = total + $3
        } else {
            print  "Total "ville":", total,"\n"
            total = $3
        }
        print $2, $3
        ville = $1
    }
     
    END {
            print  "Total "ville":", total
    }

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 2
    Par défaut
    Un grand merci messieurs! tout ca m'a l'air de fonctionner à merveille
    Jme permettrai dvous tenir au courant si jamais jgalere dans le paufinage de la chose...
    A plouche!

Discussions similaires

  1. Réponses: 7
    Dernier message: 17/02/2012, 11h57
  2. Réponses: 5
    Dernier message: 09/01/2005, 19h54
  3. Réponses: 33
    Dernier message: 15/10/2004, 16h19
  4. Problème sur une cmd avec AWK
    Par OrangeBud dans le forum Linux
    Réponses: 3
    Dernier message: 02/06/2004, 10h51

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