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 :

Problème variable AWK


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 80
    Par défaut Problème variable AWK
    Bonjour,

    Dans une commane AWK, ma variable $14 correspond à une date.(jjmmaaaa)
    Je souhaiterai décomposer cette date dans trois variables $jj, $mm, $aa
    afin de pouvoir les mettre dans mon printf séparées par un ; pour qu'ils soient trois champs distincts.

    Commande faire la décomposition, j'ai essayé avec cut mais je n'y arrive pas, et sous quelle forme faut-ils les rajouter dans mon printf?

    D'avance merci pour votre aide!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    awk -F ';' -v out="$tabule/GF_PARCELLE_DATE.dat" '
    $14 ~ /3[0-1]02[0-9][0-9][0-9][0-9]/ {printf ("%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16) >> out;}' $tabule/GF_PARCELLE.dat

  2. #2
    Membre émérite 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 : 61
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Bonjour,

    La commande awk possède la fonction split:

    split(chaine, tab, exp-reg) --> cette fonction découpe chaine en morceaux et les place dans tab suivant les séparateurs exp-reg. Mais si exp-reg est vide, chaque lettre occupe une case de tab.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {split($14, tab, //); printf "%s%s;%s%s;%s%s%s%s\n", tab[1], tab[2], tab[3], tab[4], tab[5], tab[6], tab[7], tab[8]}
    Ce n'est sans doute pas la meilleure façon de faire, mais c'est la seule que j'ai trouvée pour l'instant...

    PS: c'est pour trouver les 30 et 31 février???

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 80
    Par défaut
    OK pour l'idée par contre, je n'ai pas de séparateur / entre les jours, mois , années. Ma date est sous la forme: 23102008 et non 23/10/2008.

    Y'a-t-il une autre commande?

  4. #4
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 30
    Par défaut
    Je ne comprends pas la remarque a propos du "/". C'est utile de connaître le format de ta date, mais il me semble que le code que l'on t'a donné est conforme à ton format.

    "//" définit un regex vide et non un caractère slash. Le regex est ce qui est écrit entre les deux slashs.

    Cyril.

  5. #5
    Membre confirmé
    Inscrit en
    Juillet 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 80
    Par défaut
    En fait, si je fait : split($14, tab, //) ,toute la date se met dans tab[1], il n'y rien dans tab[2] ni tab[3] ...tab[8]

  6. #6
    Membre émérite 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 : 61
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Les caractères '/' dans la fonction split sont des méta-caractères, ils ne sont pas pris pour eux-mêmes, ils ont une signification spéciale utilisée dans les patterns pour délimiter les expressions régulières. Donc // veut dire "rien du tout".

    Pour résoudre ton problème, il serait bon que tu mettes une ligne du fichier de départ et comment elle doit être à l'arrivée.

    Edit: Oops, merci mcoolive, pas vu toutes tes interventions.

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 30
    Par défaut
    Comme je connais mieux sed, et que la question est assez simple, je donne la solution avec sed :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    echo "23102008" | sed 's/\([0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9][0-9][0-9]\)/\1;\2;\3/'
    # ou encore
    echo "24102008" | sed -r 's,([0-9]{2})([0-9]{2})([0-9]{4}),\1;\2;\3,'
    L'option "-r" est bien sympa pour écrireun peu moins d'anti-slash. Mais je crois qu'elle ne fonctionne pas pour toutes les versions de sed, donc des problèmes possibles pour faire fonctionner ton script sur des machins comme Solaris.

  8. #8
    Membre confirmé
    Inscrit en
    Juillet 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 80
    Par défaut
    le fichier source est sous la forme suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PA67669;APA67669;0;;;045;;;;33;1002;000000640;H00630;31092005;05215;0255;
    je veux récupérer le champ $14 qui correspond à une date érronée car il n'existe pas de 31 septembre
    ensuite je voudrais faire un printf pour que le fichier destination soit sous la forme: (remplacement du 31092005 par 30092005)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    PA67669;APA67669;0;;;045;;;;33;1002;000000640;H00630;30092005;05215;0255;;
    Le code que j'utilise pour les essais est le suivant, mais il m'affiche la date entière (tab[1]=31092005)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    awk -F ';' -v out="$tabule/GF_PARCELLE_DATE.dat" '
    $14 ~ /3111[0-9][0-9][0-9][0-9]/ {
    split($14,tab, //);
    printf ("%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;%s;\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, tab[1], $15, $16) >> out;}' $tabule/GF_PARCELLE.dat

Discussions similaires

  1. Problème variable.
    Par deviante dans le forum MFC
    Réponses: 3
    Dernier message: 27/01/2006, 17h27
  2. Problème variable et objet
    Par Hacken dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 07/09/2005, 14h10
  3. [javascript] Problème variable globale !!!!
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 08/08/2005, 16h41
  4. [Rave report 5.1.3][delphi 7] Probléme variable PIVar
    Par GILLESKLEIN dans le forum Rave
    Réponses: 2
    Dernier message: 05/02/2005, 15h27
  5. problème variable extern
    Par HeKaz dans le forum C
    Réponses: 14
    Dernier message: 08/01/2003, 01h44

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