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 :

formatage dans awk


Sujet :

Shell et commandes GNU

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 14
    Par défaut formatage dans awk
    Bonjour,

    Je voudrais faire un formatage pour une des colonnes de données pour un fichier ensuite reproduire un nouveau fichier avec ces données formatées. Quel genre de syntaxe faudrait-il utiliser?

    Merci d'avance,

    Clément

  2. #2
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    tout dépend du format d'entrée et du format de sortie attendue... donc on peut pas répondre.

    e r r t
    en entree pour
    r e t
    en sortie par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{ print $2" "$1" "$4 }' fichier_entrée > fichier sortie
    mais c'est spécifique au changement de "e r r t" en "r e t"
    donc sans ton besoin exact on peut pas te répondre. j'insiste

  3. #3
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Par défaut
    awk dispose d'une fonction printf ( similaire au C ) qui permet de formater l'affichage

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 14
    Par défaut
    Je voudrais juste formater une colonne par exemple $10 à %15f qu'était %13f en gardant les même formats pour les restes.

    Merci d'avance

    Citation Envoyé par frp31 Voir le message
    tout dépend du format d'entrée et du format de sortie attendue... donc on peut pas répondre.

    e r r t
    en entree pour
    r e t
    en sortie par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{ print $2" "$1" "$4 }' fichier_entrée > fichier sortie
    mais c'est spécifique au changement de "e r r t" en "r e t"
    donc sans ton besoin exact on peut pas te répondre. j'insiste

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 14
    Par défaut
    Oui, je connais printf, mais comme il y a tellement de colonnes dans le fichiers et je ne voulais pas toucher les autres à part de la colonne qui m'intéresse.En plus, je connais pas le format d'entrées du fichier original.



    Citation Envoyé par becket Voir le message
    awk dispose d'une fonction printf ( similaire au C ) qui permet de formater l'affichage

  6. #6
    Membre très actif

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

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

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Donne un exemple concret, sinon, on y arrivera jamais...

    Tu peux par exemple nous faire un truc du genre :

    Fichier en entrée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    NOM;AGE
    TOTO;12.2248765457421
    TUTU;59.54657531354657
    Fichier en sortie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TOTO, 12 ans
    TUTU, 59 ans
    En bonus, voilà le script awk qui correspond (ça te donnera peut-être des idées )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ cat test
    NOM;AGE
    TOTO;12.2248765457421
    TUTU;59.54657531354657
    $ awk -F';' '{if (NR>1) printf ("%s, %d ans\n",$1,$2)}' test
    TOTO, 12 ans
    TUTU, 59 ans

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 14
    Par défaut
    Merci pour votre réponse, et pour l'info, je travaille dans win32 en utilisant gawk. Je veux faire des calculs pour les données dans un fichier d'entrée, les données sont sous forme de 3.3810830896328
    0.3127507145763
    1.6187476662371
    0.1058373280992.
    mais mon système, il ignore les chiffres après le point. par exemple
    3.3810830896328/100, ça donne 0.03

  8. #8
    Membre très actif

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

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

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Citation Envoyé par debutanta Voir le message
    mais mon système, il ignore les chiffres après le point. par exemple
    3.3810830896328/100, ça donne 0.03


    3.3810830896328/100 = 0.033810830896328

    donc si tu utilises printf %.2f là dessus, c'est normal qu'il affiche 0.03 !!

    Edit:
    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
    16
    17
    P:\>cat test
    0.3127507145763
    1.6187476662371
    0.1058373280992
     
     
    P:\>gawk "{printf \"%.2f\n\", $1/100}" test
    0.00
    0.02
    0.00
    0.00
     
    P:\>gawk "{printf \"%.2f\n\", $1*100}" test
    31.28
    161.87
    10.58
    0.00

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 14
    Par défaut
    Je n'ai pas utilisé le printf.

  10. #10
    Membre très actif

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

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

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Tu veux pas plutôt dire ce que tu fais et ce qui ne marche pas plutôt que de nous dire ce que tu n'as pas fait ?

    Ça ira plus vite je pense... pour le moment, tout ce qu'on sait, c'est que tu utilises awk, que tu n'utilises pas printf, que ton système "ignore les chiffres après le ." et que tu ne "connais pas le format d'entrée du fichier original"... mis à part le fait que ce dernier point me semble assez compliqué à contourner (comment veux-tu traiter un fichier si tu ne connais pas son format et si -extrapolation de ma part- ce format peut-être amené à changer ?!), depuis le début, on fait des propositions, mais on n'a aucune explication sur ce qui ne marche pas ou ce que tu cherches à faire exactement...

    pour info, print sans f prend aussi en compte les décimales, donc on est pas rendu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    P:\>gawk "{print $1/100}" test
    0.00312751
    0.0161875
    0.00105837

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 14
    Par défaut
    Le fichier à traiter contient des données comme

    0.3127507145763
    1.6187476662371
    0.1058373280992
    J'écris un gawk, ensuite je l'ai mis dans un batch.
    dans gawk, j'écris print $1 > outfile, ça nous génère un fichier même que le fichier d'origine. ça c'est normal.

    Mais quand j'écris $1/100 > outfile, la sortie est 0, 1 , 0
    par contre, je voudrais bien les résultats corrects et précises.

    J'ai testé avec print 3.5 > outfile dans gawk, ça me donne 3 au lieu de 3.5.
    Je l'ai trouvé incompréhensible.

  12. #12
    Membre très actif

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

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

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Etrange, tu utilises quelle version de gawk ?

    J'ai fait le test suivant sous Windows XP 32bits avec gawk 3.1.6 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    P:\>gawk --version
    GNU Awk 3.1.6
    P:\>cat test
    0.3127507145763
    1.6187476662371
    0.1058373280992
    P:\>gawk "{print $1/100 > \"outfile\" }" test
     
    P:\>cat outfile
    0.00312751
    0.0161875
    0.00105837
    Tu ne pourrais pas mettre ton script awk directement pour voir s'il n'y a pas un problème d'écriture ?

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 14
    Par défaut
    Après quelques tests, j'ai trouvé le problème d'origine qui est exactement pareil que un sur internet.
    http://objectmix.com/awk/26958-lc_numeric-windows.html
    Il a réussi à la fin en changeant sa version de awk. Mais pour moi, j'ai pas de droit de changer ma version de gawk. Saviez vous un autre moyen qui permet de faire la même chose?

    Merci d'avance

    Is there a way to specify the variable LC_NUMERIC in gawk and Windows XP
    environment?

    Problem:
    in a localized version of Windows, the instruction "3.2"+1 gives 4, and
    "3,2"+1 gives 4,2. I need to switch this behaviour.

    Windows seems to ignore variable LC_NUMERIC, but any other way should be ok!
    (w/o changing settings in Control Panel or using the sub instruction to
    change "." in "," )

    Regards,
    Claudio.

  14. #14
    Membre très actif

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

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

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Si c'est un problème de mauvais séparateur décimal, tu peux essayer de modifier ton texte en entrée.

    Par exemple, chez moi, le séparateur décimal est le point comme on l'a vu dans mon exemple. Donc si mon fichier comporte des virgules en entrée, ça ne marche plus vraiment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    P:\>cat test
    0,3127507145763
    1,6187476662371
    0,1058373280992
     
    P:\>gawk "{print $1/100 }" test
    0
    0.01
    0
    Pour contourner ça, je peux modifier le séparateur avant de faire l'opération :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    P:\>gawk "{num=gsub(/,/,\".\",$1); print $num/100 }" test
    0.00312751
    0.0161875
    0.00105837

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 14
    Par défaut
    Merci pour tous votre aide, c'est une bonne idée. malheuresement, ça ne marche pas dans mon système.



    Citation Envoyé par Alek-C Voir le message
    Si c'est un problème de mauvais séparateur décimal, tu peux essayer de modifier ton texte en entrée.

    Par exemple, chez moi, le séparateur décimal est le point comme on l'a vu dans mon exemple. Donc si mon fichier comporte des virgules en entrée, ça ne marche plus vraiment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    P:\>cat test
    0,3127507145763
    1,6187476662371
    0,1058373280992
     
    P:\>gawk "{print $1/100 }" test
    0
    0.01
    0
    Pour contourner ça, je peux modifier le séparateur avant de faire l'opération :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    P:\>gawk "{num=gsub(/,/,\".\",$1); print $num/100 }" test
    0.00312751
    0.0161875
    0.00105837

  16. #16
    Membre très actif

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

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

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Peux-tu poster le résultat de la commande suivante stp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gawk "BEGIN {print 10/3}"
    Afin de déterminer ton séparateur décimal...

    Si tu obtiens 3,3333 par exemple (avec une virgule donc), cette commande devrait marcher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gawk "{num=gsub(/\./,\",\",$1); print $num/100 }" test
    Si elle ne marche pas, essaye de poster le résultat que l'on comprenne

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 14
    Par défaut
    le résultat est 3,33333.

    Mon code original est sous forme de celui-ci, du coup, j'ai mis votre code dedans et ça rend mon système KO, aucun résultat généré.
    Il y a encore un bat qui appelle le .awk, et le paramètre pour le fichier est listé dans .bat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    awk{}
    Begin {
     
      num=gsub(/\./,\",\",$70)
         print $num/100  > outfile 
    }

  18. #18
    Membre très actif

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

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

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Nan mais c'est n'importe quoi ce que j'ai écris... et personne pour me le dire

    Dans mes exemples d'avant, je ne devrais pas avoir écrit ni num=gsub(...) ni print $num/100.

    Premièrement, gsub ne renvoie pas la chaîne modifiée mais modifie directement la chaîne passée en troisième argument (il renvoie le nombre de modifications).
    De deux, une variable awk ne se préfixe pas avec un $ mis à part pour les variables représentant une colonne.
    Cela marchait dans mon cas, car num prenait 1 pour valeur (un seul remplacement de "," vers ".") et que du coup, le print $num devenait un print $1 une fois num remplacé par sa valeur. Comme en plus, gsub modifie bien $1 en paramètre, le résultat était celui attendu, mais c'était un coup de pot (ou pas puisque j'aurais vu mon erreur plus tôt !).

    A force de mélanger les scripts, j'ai écrit vraiment n'importe quoi ici désolé.

    Bref, pour en revenir à ton problème, si j'ai bien compris, ta colonne 70 contient ton numéro avec un ".", mais ton système attend une "," en séparateur.

    Donc ceci devrait transformer le "." en "," dans la colonne 70 ce qui devrait permettre le calcul $70/100 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gawk "{gsub(/\./,\",\",$70); print $70/100 }" test

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 14
    Par défaut
    Bonjour,
    Bizarrement, le code modifié a rendu mon système à nouveau KO, c'est à dire pas de résultat. Pour vous donner plus d'informations, voici quelques tests effectués dans mon système :

    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
    print "10,69" /100                  0,1069 ( résultat attendu )
    print "10.69"/100                   0,1
    print 3/10
     
    0,33333
    print $70/100 
    0,03
    0
    0,01
     
    print $70
     
    3.3810830896328
    0.3127507145763
    1.6187476662371

  20. #20
    Membre très actif

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

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

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Damned...

    Et si tu fais juste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gawk "{gsub(/\./,\",\",$70); print $70}" test
    ?

Discussions similaires

  1. Fonction dans awk
    Par ech363 dans le forum Linux
    Réponses: 5
    Dernier message: 04/12/2006, 17h36
  2. [VBA-W] Garder le formatage dans un TextBox
    Par Blackfox dans le forum VBA Word
    Réponses: 5
    Dernier message: 06/11/2006, 12h30
  3. Cut dans Awk
    Par lili_bzh dans le forum Linux
    Réponses: 3
    Dernier message: 24/01/2006, 10h12
  4. Commange Grep dans Awk
    Par lili_bzh dans le forum Linux
    Réponses: 1
    Dernier message: 10/01/2006, 11h49
  5. Problème formatage dans balise title / alt
    Par jflebegue dans le forum Mise en page CSS
    Réponses: 9
    Dernier message: 09/12/2004, 15h18

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