Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 ! smile

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 hmm

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