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 :

Probleme avec awk et type de variables


Sujet :

Linux

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Probleme avec awk et type de variables
    Bonjour à tous,

    Je suis actuellement en école d'ingénieur et on travaille sur des shells utilisant awk. Je bosse sur mandriva one 2007, voici mon problème :

    Nous avons un tableau de données et nous devons les corriger, une de ces données doit être convertie en négatif, nous avons donc écrit :

    .

    Le problème est le suivant : les variables sont des chaines de caractères (les données sont séparées par des "|" mais il y a des espaces au milieu; exemple : "| 12.5 | 13.7 |"). et lorsque je tape mon code, je reçois en retour une valeur négative entière (par exemple 1.27 devient -1 ...). Notre professeur nous a dit que linux faisait la conversion automatiquement, mais sur mon OS, cela ne marche pas ... Et je n'ai pas de réponses de sa part ... Dautres élèves m'ont dit que ça marchait sur leur distrib ...

    Comment faire pour demander à linux un float ou quelque chose comme ça ? Merci de votre aide.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Points : 329
    Points
    329
    Par défaut
    Quelque chose dans ce genre là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo "| 12.5 | 13.7 |" |awk -F'|' '{i=1; while(i<=NF){ if($i !~ /^$/) { printf -$i" ";} i++} printf "\n";}

    Vérifie aussi ta version de awk (mawk, gawk, ... etc)


    Que donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo "1.27" | awk '{$1=-$1; print $1}'
    ?

  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 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tamiel Voir le message
    Que donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "1.27" | awk '{$1=-$1; print $1}'
    ?
    Chez-moi (Fedora Core 7, gawk v3.1.5-15.fc7), ça donne "-1"
    Faut taper
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "1,27" | awk '{$1=-$1; print $1}'
    pour que ça marche...
    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 averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Points : 329
    Points
    329
    Par défaut
    Ok donc c'est au niveau de la locale LC_MONETARY je pense :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ~$ locale | grep LC_NUMERIC
    LC_NUMERIC="fr_FR@euro"
     
    ~$ LC_NUMERIC=POSIX echo "1.27" | awk '{print -$1}'
    -1.27
     
    ~$ LC_NUMERIC=POSIX echo "1,27" | awk '{print -$1}'
    -1

    Si je me souviens bien de l'environnement gnome, je crois que le séparateur décimale est une virgule en fr par défaut (et comme Fedora est sous gnome par défaut ...)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Points : 329
    Points
    329
    Par défaut
    Je me réponds moi même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ~# echo "1.27" |gawk '{print -$1}'
    -1
    ~# echo "1,27" |gawk '{print -$1}'
    -1,27
    ~# echo "1,27" |mawk '{print -$1}'
    -1
    ~# echo "1.27" |mawk '{print -$1}'
    -1.27
    Je viens de regarder dans le code source :
    mawk n'utilise pas la locale mais est codé en posix .
    Par contre gawk passe par la locale en cours dans le shell avec setlocale() .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ~$ export LC_NUMERIC=C
    ~$ echo "1,27" |gawk '{print -$1}'
    -1
    ~$ echo "1.27" |gawk '{print -$1}'
    -1.27

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Je n'ai pas tout compris à vos réponses, il faudrait donc que j'essaye avec une virgule plutôt qu'un point peut être ?

    Merci de votre aide, je vais essayer cela et je vous tiendrais au courant

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par canaboss Voir le message
    Je n'ai pas tout compris à vos réponses, il faudrait donc que j'essaye avec une virgule plutôt qu'un point peut être ?
    Ben en fait, Unix/Linux gère la notion d'internationalisation avec les variables citées par Tamiel. En norme latine, la décimale se code avec une virgule et le point est le séparateur des milliers mais en norme anglo-saxonne, c'est l'inverse.
    Et donc comme ton (et mon) système a été installé pour la France, les variables ont été positionnées pour la France.

    Donc soit tu positionnes les variables citées par Tamiel en position anglo-saxonne (ce qui peut te jouer des tours par ailleurs sur d'autres programmes), soit tu convertis tes points en virgule avant de les envoyer à awk

    Citation Envoyé par canaboss Voir le message
    Merci de votre aide, je vais essayer cela et je vous tiendrais au courant
    En fait, avec les pipes qu'on peut enchainer à volonté t'as jamais aucun problème.
    Si un flux entrant te convient pas, tu l"envoies par un pipe à un convertisseur tel que sed ou tr avant de le renvoyer au programme de traitement...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    flux_entrant |sed -e "s/\./,/g" |awk ...
    Le "flux_entrant" étant n'importe quelle commande qui t'affiche des infos
    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]

Discussions similaires

  1. probleme avec awk
    Par hunter99 dans le forum Linux
    Réponses: 2
    Dernier message: 28/10/2007, 14h19
  2. Enorme probleme avec modification de type de colonne
    Par tibere dans le forum Administration
    Réponses: 2
    Dernier message: 07/04/2007, 13h57
  3. Probleme avec base de données et variable !
    Par Sunseeker69 dans le forum Bases de données
    Réponses: 4
    Dernier message: 27/04/2006, 16h39
  4. Probleme avec les "input type="image" "
    Par khokho dans le forum Balisage (X)HTML et validation W3C
    Réponses: 9
    Dernier message: 26/03/2006, 17h12
  5. Probleme avec champ de type LONG
    Par Youby dans le forum Oracle
    Réponses: 11
    Dernier message: 17/01/2006, 16h26

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