#1 Le 24/07/2014, à 11:51
- zackalucard
Lecture de plusieurs colonnes avec while read
Bonjour tout le monde,
J'ai un petit problème en Shell : sur un fichier à deux colonnes (séparées par une virgule), je désire effectuer une opération (transformer mes nombres scientifiques en nombres décimaux) sur ces deux colonnes.
J'ai un début de script mais, qui réalise simplement l'opération sur la 1ere colonne (avec une erreur puisqu'il ne réalise pas la conversion pour la toute première ligne) :
while read col1 col2
do
awk -F"E" 'BEGIN{OFMT="%10.13f"} {print $1 * (10 ^ $2)}'
done < test.csv
Voici mon fichier test.csv :
-9.999999747e-05,0.0001958218927
-7.438573448e-06,0.0001999999949
-7.500000356e-05,0.0001969738078
-4.999999874e-05,0.0001981092501
-2.499999937e-05,0.0001992274629
0,0.0002003163099
-0.0001250000059,0.0001946542325
0.0001250000059,0.0002051966731
-0.0001500000071,0.0001934715401
0.0001500000071,0.0002060870174
-0.0001749999938,0.0001922745723
0.0001749999938,0.0002069565235
Pourquoi faire tout ceci ? Parce que je souhaite réaliser un
sort -n
qui ne fonctionne pas bien (le tri se fait en ne prenant pas en compte le signe négatif et range les nombre curieusement).
Merci beaucoup d'avance. J'espère que vous pourrez m'aider !
Hors ligne
#2 Le 24/07/2014, à 11:59
- pingouinux
Re : Lecture de plusieurs colonnes avec while read
Bonjour,
sort -g
devrait te donner un tri correct.
Voici un extrait de man sort :
-g, --general-numeric-sort
compare according to general numerical value
Ajouté : Pour transformer les nombres en format fixe
awk -F, '{printf("%16.13f %16.13f\n",$1,$2)}' test.csv
Dernière modification par pingouinux (Le 24/07/2014, à 12:05)
Hors ligne
#3 Le 24/07/2014, à 12:07
- zackalucard
Re : Lecture de plusieurs colonnes avec while read
Bonjour pingouinux,
Voilà ce que me donne sort -g (ou -n, puisque j'ai le même résultat avec les deux) :
-9.999999747e-05,0.0001958218927
-7.438573448e-06,0.0001999999949
-7.500000356e-05,0.0001969738078
-4.999999874e-05,0.0001981092501
-2.499999937e-05,0.0001992274629
0,0.0002003163099
-0.0001250000059,0.0001946542325
0.0001250000059,0.0002051966731
-0.0001500000071,0.0001934715401
0.0001500000071,0.0002060870174
-0.0001749999938,0.0001922745723
0.0001749999938,0.0002069565235
Donc pas du tout correct
Dernière modification par zackalucard (Le 24/07/2014, à 12:08)
Hors ligne
#4 Le 24/07/2014, à 12:12
- zackalucard
Re : Lecture de plusieurs colonnes avec while read
Ta commande
awk -F, '{printf("%16.13f %16.13f\n",$1,$2)}' test.csv
fonctionne super bien !
Cependant, elle remplace la virgule qui sépare les deux colonnes par un espace.
Hors ligne
#5 Le 24/07/2014, à 12:16
- pingouinux
Re : Lecture de plusieurs colonnes avec while read
J'ai déjà répondu à cette question dans la discussion que tu as initiée le 27 mai 2014.
C'est vraisemblablement un problème de locale. Essaye ceci :
LC_NUMERIC=C sort -g test.csv
Édité : Si tu veux conserver la virgule
awk -F, '{printf("%.13f,%.13f\n",$1,$2)}' test.csv
Dernière modification par pingouinux (Le 24/07/2014, à 12:18)
Hors ligne
#6 Le 24/07/2014, à 12:18
- zackalucard
Re : Lecture de plusieurs colonnes avec while read
Oui oui, j'avais bien essayé cette solution la dernière fois, mais ça ne fonctionne pas.
J'ai toujours le même résultat qu'en #3...
Hors ligne
#7 Le 24/07/2014, à 12:21
- zackalucard
Re : Lecture de plusieurs colonnes avec while read
Ahhhhhh, je viens de trouver !
Le LC_NUMERIC=C, je le mets dans mon .sh et apparemment il ne l’interprète pas.
En revanche, quand j''écris ta commande dans le terminal directement, là je n'ai pas de problème.
Comment dois-je faire pour l'écrire dans le .sh ?
Hors ligne
#8 Le 24/07/2014, à 12:31
- zackalucard
Re : Lecture de plusieurs colonnes avec while read
En fait, tout va bien, c'est simplement que j'écrivais
LC_NUMERIC=C
sort -g test.csv
au lieu de
LC_NUMERIC=C sort -g test.csv
Tout marche maintenant, merci bcp pingouinux !
Hors ligne