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

Applications et environnements graphiques Discussion :

awk et les opérateurs < et >


Sujet :

Applications et environnements graphiques

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 12
    Points : 11
    Points
    11
    Par défaut awk et les opérateurs < et >
    bonjour,

    je suis confronté à un problème qui me dépasse complètement
    si je fais tourner cette commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gawk '{ if ($2 == %y2%) print $1,$2}' coord2.txt > coord4.txt
    avec %y2% une variable définie précédemment telle que y2=46 (par ex.)
    (je fais tourner mes commandes awk dans un fichier batch. par forcément très joli mais je ne sais pas faire autrement pour de tels scripts)

    j'ai bien en sortie un fichier avec une seule ligne
    si je le fais avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gawk '{ if ($2 != %y2%) print $1,$2}' coord2.txt > coord4.txt
    j'ai en sortie un fichier avec (n-1) lignes

    mais si je le fais avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gawk '{ if ($2 <= %y2%) print $1,$2}' coord2.txt > coord4.txt
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gawk '{ if ($2 >= %y2%) print $1,$2}' coord2.txt > coord4.txt
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gawk '{ if ($2 < %y2%) print $1,$2}' coord2.txt > coord4.txt
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gawk '{ if ($2 > %y2%) print $1,$2}' coord2.txt > coord4.txt
    alors ça ne marche pas du tout. tout se passe comme si Cygwin ne reconnait pas les signes < ou >. car il m'affiche la ligne suivante à l'exécution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gawk '{ if ($2 print $1,$2}' coord2.txt > coord4.txt
    quelqu'un a une idée?
    merci d'avance
    seb

  2. #2
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    Aucune idée du pourquoi du comment, visiblement un problème d'interprétation sous Cygwin... ça marche évidemment bien sous Linux

    Si tu n'as que des nombres positifs, tu peux éventuellement contourner avec une formulation du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gawk '{ if (int($2 / %y2%)) print $1,$2}' coord2.txt > coord4.txt
    int($2 / %y2%) valant 0 (donc faux) si $2 < %y2% et un nombre positif (donc vrai) si $2 >= %y2%
    à adapter en fonction du besoin :
    int(%y2% / $2) donne le résultat inverse (attention au zéro)
    int(($2-1) / %y2% correspond si $2 > %y2% cette fois (avec des nombres entiers)
    etc...

    C'est un peu du bricolage mais bon

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 483
    Points
    19 483
    Par défaut


    awk ne connaît pas y2, si cette variable est définie dans l'interpréteur courant; il faut utiliser l'option -v de gawk.

    Je n'ai pas de CygWin, mais en gros :
    Code interpréteur GNU/linux : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ y2=42
    $ gawk 'BEGIN{print y2}'
     
    $ gawk -v awkVar="$y2" 'BEGIN{print awkVar}'
    42

  4. #4
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    Citation Envoyé par N_BaH Voir le message


    awk ne connaît pas y2, si cette variable est définie dans l'interpréteur courant; il faut utiliser l'option -v de gawk.

    Je n'ai pas de CygWin, mais en gros :
    Code interpréteur GNU/linux : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ y2=42
    $ gawk 'BEGIN{print y2}'
     
    $ gawk -v awkVar="$y2" 'BEGIN{print awkVar}'
    42
    D'après son post, il utilise un fichier batch et %y2% ressemble d'ailleurs beaucoup à une variable DOS... De plus, cela semble marcher avec "==" mais pas avec "<" ou ">"... donc je ne pense pas que le problème vienne de ça.

    Exemple avec gawk pour windows (sans Cygwin donc) :
    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
    P:\>more test.bat
    @echo off
    set y2=42
    gawk "{if ($1 < %y2%) print \"ok\"}"
     
    P:\>test.bat
    41
    ok
    42
    43
    0
    ok
    15
    ok
    Terminer le programme de commandes (O/N)*? o
    Ce qui est d'ailleurs étonnant, c'est que ça fonctionne mieux sous Windows que sous Cygwin... alors que c'est souvent galère pour gérer les caractères sous Windows...

  5. #5
    Membre à l'essai
    Inscrit en
    Janvier 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Merci Alek-C! ca marche en passant avec "int"!
    je pense aussi que c'est un problème d'interprétation par Cygwin d'une commande awk dans un fichier batch. mais je ne sais pas encore comment faire autrement. un jour...

  6. #6
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    En évitant de passer par Cygwin ? Il existe un port de awk (et d'autres outils gnu) pour windows qui marche très bien :
    http://gnuwin32.sourceforge.net/

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 04/08/2006, 15h14
  2. Réponses: 24
    Dernier message: 09/05/2006, 00h12
  3. Problème avec les opérateurs
    Par jules_lenoir dans le forum Langage
    Réponses: 4
    Dernier message: 26/01/2006, 17h56
  4. Réponses: 1
    Dernier message: 21/01/2006, 19h00
  5. question sur les opérateurs
    Par isidore dans le forum C++
    Réponses: 10
    Dernier message: 25/02/2005, 19h46

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