Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/05/2011, 10h53   #1
Invité régulier
 
Inscription : avril 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 14
Points : 6
Points : 6
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
debutanta est déconnecté   Envoyer un message privé Réponse avec citation 03
Vieux 09/05/2011, 11h28   #2
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 534
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
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 : 3 534
Points : 7 743
Points : 7 743
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 :
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
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/05/2011, 11h48   #3
Membre Expert
 
Avatar de becket
 
Frédéric Brugmans
Informaticien multitâche
Inscription : février 2005
Messages : 661
Détails du profil
Informations personnelles :
Nom : Frédéric Brugmans

Informations professionnelles :
Activité : Informaticien multitâche

Informations forums :
Inscription : février 2005
Messages : 661
Points : 1 196
Points : 1 196
awk dispose d'une fonction printf ( similaire au C ) qui permet de formater l'affichage
becket est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 09/05/2011, 13h42   #4
Invité régulier
 
Inscription : avril 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 14
Points : 6
Points : 6
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 :
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
debutanta est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 09/05/2011, 13h44   #5
Invité régulier
 
Inscription : avril 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 14
Points : 6
Points : 6
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
debutanta est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/05/2011, 17h52   #6
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Donne un exemple concret, sinon, on y arrivera jamais...

Tu peux par exemple nous faire un truc du genre :

Fichier en entrée
Code :
1
2
3
NOM;AGE
TOTO;12.2248765457421
TUTU;59.54657531354657
Fichier en sortie
Code :
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 :
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
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/05/2011, 11h39   #7
Invité régulier
 
Inscription : avril 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 14
Points : 6
Points : 6
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
debutanta est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 11/05/2011, 12h22   #8
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
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 :
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
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/05/2011, 13h09   #9
Invité régulier
 
Inscription : avril 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 14
Points : 6
Points : 6
Je n'ai pas utilisé le printf.
debutanta est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 11/05/2011, 13h41   #10
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
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 :
1
2
3
4
P:\>gawk "{print $1/100}" test
0.00312751
0.0161875
0.00105837
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/05/2011, 16h01   #11
Invité régulier
 
Inscription : avril 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 14
Points : 6
Points : 6
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.
debutanta est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/05/2011, 16h35   #12
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Etrange, tu utilises quelle version de gawk ?

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

Code :
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 ?
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 16/05/2011, 17h44   #13
Invité régulier
 
Inscription : avril 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 14
Points : 6
Points : 6
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

Citation:
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.
debutanta est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/05/2011, 09h35   #14
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
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 :
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 :
1
2
3
4
P:\>gawk "{num=gsub(/,/,\".\",$1); print $num/100 }" test
0.00312751
0.0161875
0.00105837
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 19/05/2011, 16h01   #15
Invité régulier
 
Inscription : avril 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 14
Points : 6
Points : 6
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 :
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 :
1
2
3
4
P:\>gawk "{num=gsub(/,/,\".\",$1); print $num/100 }" test
0.00312751
0.0161875
0.00105837
debutanta est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/05/2011, 16h20   #16
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Peux-tu poster le résultat de la commande suivante stp :
Code :
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 :
gawk "{num=gsub(/\./,\",\",$1); print $num/100 }" test
Si elle ne marche pas, essaye de poster le résultat que l'on comprenne
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/05/2011, 11h20   #17
Invité régulier
 
Inscription : avril 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 14
Points : 6
Points : 6
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 :
1
2
3
4
5
6
awk{}
Begin {
 
  num=gsub(/\./,\",\",$70)
     print $num/100  > outfile 
}
debutanta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 14h10   #18
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
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 :
gawk "{gsub(/\./,\",\",$70); print $70/100 }" test
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/05/2011, 15h11   #19
Invité régulier
 
Inscription : avril 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 14
Points : 6
Points : 6
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 :
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
debutanta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 15h31   #20
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Damned...

Et si tu fais juste
Code :
gawk "{gsub(/\./,\",\",$70); print $70}" test
?
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h01.


 
 
 
 
Partenaires

Hébergement Web