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 :

Script AWK de gestion


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 1
    Par défaut Script AWK de gestion
    Bonjour à tous,

    Je suis actuellement en train de créer un script qui a pour but de renvoyer le nom et le prénom d'un étudiant en ne donnant comme argument son groupe. Voici la forme de mon fichier "etudiants.txt"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ID 000 NOM Toto PRENOM Tintin ETUDES informatique GROUPE 12
    ID 001 NOM Xoxo PRENOM Xavxav ETUDES informatique GROUPE 12
    Voici mon script:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #! /usr/bin/awk -f
     
    x=$(sed -n '$=' etudiants.txt)
     
    BEGIN {RS=""}
    for i in x
    do
    	print{$3 ":" $4 $5 ":" $6}
    done
    Explications: Je souhaite affecter à une variable x le nombre de ligne afin de savoir le nombre d'étudiant (car il y en a un par ligne)
    Sachant que le fichier est séparé par des espaces, RS=""
    Et je veux qu'il affiche le nom et le prénom des étudiants appartenant au même groupe, c'est à dire que si je rentre 12 en argument il renvoie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    NOM Toto  PRENOM Tintin
    NOM Xoxo PRENOM Xavxav
    Mais je suis un peu perdu.. de l'aide serait la bienvenu ^^

    Merci d'avance

  2. #2
    Membre éprouvé
    Homme Profil pro
    Expert Middleware
    Inscrit en
    Septembre 2006
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Expert Middleware

    Informations forums :
    Inscription : Septembre 2006
    Messages : 75
    Par défaut
    Pour moi plusieurs façon de faire ça mais une trés simple avec un grep et un awk :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep "12$" toto | awk '{ print $4 " " $6 }'
    Après tu peux le faire en parcourant le fichier mais je n'en vois pas trop l'interrêt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    compteur=0
     
    nbEtudiants=`wc -l etudiants.txt`
     
    while read TitreID ID TitreNom Nom TitrePrenom Prenom TitreEtude Etude TitreGroupe Groupe
    do
       if [ $Groupe -eq $argument ]
       then
           echo "$Nom $Prenom"
           compteur=$((compteur+1))
       fi
    done < etudiants.txt
     
    echo "${compteur} etudiant(s) trouvé(s) sur $nbEtudiants etudiants"

    Pour le nombre d'étudiants, si tu cherches le total, un simple wc -l de ton fichier devrait suffir

  3. #3
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    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 347
    Par défaut
    Bonjour et Bienvenue,

    En effet, il y a du boulot de ton coté pour comprendre comment fonctionne awk, je te suggère de compulser un tutoriel sur le sujet...

    Pour faire simple:
    -awk, n'est pas un shell, donc on ne lui dit pas de lancer des commande comme sed.
    -il a un esprit d'automate pour traiter un flux (comme un fichier, par exemple) par défaut ligne par ligne: il lit une ligne, il execute les différentes étape, puis recommence avec la ligne suivante... ceci pour dire que ta boucle for n'a pas lieu d'être. Ici ça peut fonctionner car tu redéfini la variable RS qui est le Record Separator (un record est une ligne entière, dont le séparateur par défaut est le newline ( \n ).
    Toi, ce qui t'interesse ce sont les champs (Fields) d'une ligne et la variable qui gère la séparation de champs est FS (Field Separator).

    Comme awk lit un fichier ligne par ligne (comme un grand), il est inutil de connaitre le nombre de ligne d'un fichier au préalable pour traiter chaque ligne une à une.

    De ce que je comprends, tu veux afficher les Field 3,4,5,6 de chaque ligne déterminée par la valeur du dernier Field.
    Et ce qui est bien en awk, c'est qu'il existe une variable qui contient le nombre de fields que possède la ligne en cours (variable NF)

    on peut donc le faire simplement (pas testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -vVAR=12 '$NF == VAR {print $3,":",$4,$5,":",$6}' fichier
    ou la méthode sauvage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -vVAR=12 '$NF == VAR && $0=$3" : "$4" "$5" : "$6' fichier
    Les 2 commandes awk traiteront la totalité du fichier mais la simplicité de l'algorithme considère que toutes les lignes du fichier ont exactement le même format.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Par défaut
    Salut,
    On peut aussi utiliser sed
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -E '/12$/!d;s/([^ ]* ){2}(([^ ]* ){4})(.*)/\2/' infile
    Mais dans le groupe 12, il y en a toujours 1 qui s'appelle Pierre Henry.
    Cordialement.

Discussions similaires

  1. Cherche Script PHP de gestion des Banniéres
    Par katouzo dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 7
    Dernier message: 19/12/2007, 20h35
  2. [Calendrier] Cherche script d'agenda : Gestion des disponibilités
    Par Wookai dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 12/04/2007, 10h15
  3. Cherche Script PHP de gestion de FAQ
    Par LaseLiep dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 28/03/2007, 14h46
  4. [Calendrier] recherche script pour la gestion de calendrier
    Par leclone dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 22/01/2007, 15h37
  5. [Noob] Script pour la gestion des dates
    Par Konrad Florczak dans le forum Langage
    Réponses: 19
    Dernier message: 02/10/2006, 18h24

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