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

Linux Discussion :

[AWK-BASH] Vérification dans un fichier


Sujet :

Linux

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Points : 84
    Points
    84
    Par défaut [AWK-BASH] Vérification dans un fichier
    Bonjour ,

    Venant de découvrir AWK, j'aimerai réaliser le programme suivant avec une interaction avec BASH (SHELL) et cela afin de récupérer un argument qui est le "fichier".

    Alors il faut écrire en AWK un script qui vérifie pour chaque fichier passé en paramètre, si toutes ses lignes ont le même nombre de champs.

    voilà le code que j'ai écris, il ne marche pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #!/bin/bash
    awk BEGIN { fichier=$1    #récuperation du 1er parametre du shell(fichier)
    	}
    NFP=NF
    NF!=$NFP         #si une ligne n'est pas égale à $NFP
    {
    verification=1       #alors verification=1
    }
    #afficher la vérification à l'écran
    Merci !

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

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

    les variables du shell ne sont valables que dans le shell, et
    les variables de awk ne sont valables que dans awk !

    pour que la variable `fichier' de awk vaille le premier argument donné au script ($1), il faut utiliser l'option -v de awk.

    et puis, il faut des guillemets autour des commandes awk :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #!/bin/bash
     
    #par exemple
    awk -v fichier="$1" 'BEGIN { print fichier }'
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par seanbean Voir le message
    voilà le code que j'ai écris, il ne marche pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #!/bin/bash
    awk BEGIN { fichier=$1    #récuperation du 1er parametre du shell(fichier)
    Salut

    La remarque de N_BaH est très importante car elle permet de passer des éléments shell au programme awk (qui est un autre programme donc qui ne voit rien de ce qu'il y a dans le shell).

    Toutefois, dans ton cas, passer le nom du fichier à awk ne sert à rien car awk prend déjà en paramètre le fichier que tu lui passes. Tout comme (suite à un autre topic), essayer de dire à cmp que tu lui as passé tel fichier ne sert à rien vu que cmp le prend en tant qu'argument.

    Donc la syntaxe à appliquer dans ton shell est
    Tout comme tu aurais, pour cmp, utilisé la syntaxe

    Citation Envoyé par seanbean Voir le message
    Venant de découvrir AWK, j'aimerai réaliser le programme suivant avec une interaction avec BASH (SHELL) et cela afin de récupérer un argument qui est le "fichier".

    Alors il faut écrire en AWK un script qui vérifie pour chaque fichier passé en paramètre, si toutes ses lignes ont le même nombre de champs.
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/sh
    result=`awk '{if (NR == 1) {verif=NF; next} if (NF != verif) {print NR":"verif":"NF; exit}}' $1`
    if test -n "$result"
    then
            lig=`echo $result |cut -f1 -d:`
            need=`echo $result |cut -f2 -d:`
            find=`echo $result |cut -f3 -d:`
            echo "Pb ligne $lig - Nb champs attendus: $need - Nb champs trouvés: $find"
    else
            echo "Tout ok"
    fi

    Principe: je bâtis un programme awk qui, comme cmp, affiche la première ligne (NR=ligne en cours) dont le nombre de champs (NF) ne correspond pas au nombre de champs pris dans la première ligne. Dans ce cas, j'affiche "ligne:nb champs attendus:nb champs trouvés" et je quitte awk.
    Puis, ce script construit, je m'en sers comme de tout programme quand je veux récupérer ce qu'il affiche, via les backquottes `...`. On aurait pu utiliser la syntaxe bash et mettre result=$(awk '{...}').
    Donc je stocke ce qu'il affiche dans une variable.

    Puis, une fois revenu au shell, je regarde simplement si la variable est vide (ok) ou pas (erreur)...

    A noter: j'ai tenté de faire passer via awk un code statut en mettant exit 1 et en espérant que ce 1 remonterait au $? du shell... mais ça n'a pas fonctionné. D'où la solution n° 2 de passer par ce qu'affiche awk au lieu de passer par son code retour.
    Donc tant qu'à passer par un affichage récupéré dans une variable, autant afficher alors un maximum de trucs dans un formalisme bien défini (séparés par des ":") puis traiter cet affichage dans le shell pour en extraire les infos utiles...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Points : 84
    Points
    84
    Par défaut
    Merci beaucoup Sve@r et N_BaH !

    Maintenant je commence à comprendre !

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

Discussions similaires

  1. Recherche dans un fichier CSV en bash ?
    Par kueisaho dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 19/04/2007, 17h02
  2. [Bash]:Afficher une boucle dans un fichier ?
    Par byloute dans le forum Linux
    Réponses: 2
    Dernier message: 03/04/2007, 12h12
  3. Ecrire dans un fichier a partir du bash
    Par jamesleouf dans le forum Linux
    Réponses: 1
    Dernier message: 20/03/2006, 17h00
  4. Réponses: 21
    Dernier message: 29/09/2005, 20h33
  5. Ecriture dans un fichier avec la fonction AWK
    Par tux2005 dans le forum Linux
    Réponses: 2
    Dernier message: 21/07/2005, 11h58

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