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
Version imprimable
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
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
mais c'est spécifique au changement de "e r r t" en "r e t"Code:awk '{ print $2" "$1" "$4 }' fichier_entrée > fichier sortie
donc sans ton besoin exact on peut pas te répondre. :roll: j'insiste
awk dispose d'une fonction printf ( similaire au C ) qui permet de formater l'affichage
Donne un exemple concret, sinon, on y arrivera jamais... :roll:
Tu peux par exemple nous faire un truc du genre :
Fichier en entrée
Fichier en sortieCode:
1
2
3 NOM;AGE TOTO;12.2248765457421 TUTU;59.54657531354657
En bonus, voilà le script awk qui correspond (ça te donnera peut-être des idées ;))Code:
1
2 TOTO, 12 ans TUTU, 59 ans
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
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
:aie:
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
Je n'ai pas utilisé le printf.
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... :roll: 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
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.
Etrange, tu utilises quelle version de gawk ?
J'ai fait le test suivant sous Windows XP 32bits avec gawk 3.1.6 :
Tu ne pourrais pas mettre ton script awk directement pour voir s'il n'y a pas un problème d'écriture ?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
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.
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 :
Pour contourner ça, je peux modifier le séparateur avant de faire l'opération :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
Code:
1
2
3
4 P:\>gawk "{num=gsub(/,/,\".\",$1); print $num/100 }" test 0.00312751 0.0161875 0.00105837
Peux-tu poster le résultat de la commande suivante stp :
Afin de déterminer ton séparateur décimal...Code:gawk "BEGIN {print 10/3}"
Si tu obtiens 3,3333 par exemple (avec une virgule donc), cette commande devrait marcher :
Si elle ne marche pas, essaye de poster le résultat que l'on comprenne ;)Code:gawk "{num=gsub(/\./,\",\",$1); print $num/100 }" test
le résultat est 3,33333.Code:BEGIN {print 10/3}
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 }
Nan mais c'est n'importe quoi ce que j'ai écris... et personne pour me le dire :aie:
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
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
Damned...
Et si tu fais juste
?Code:gawk "{gsub(/\./,\",\",$70); print $70}" test