#1 Le 27/05/2014, à 22:00
- zackalucard
Modifier type de notation d'un fichier de valeurs
Bonsoir tout le monde,
Je viens de me mettre à la programmation Shell !
On peut faire beaucoup de chose, c'est vraiment bien, mais ce n'est pas forcément évident ><
Bref, voici mon prob : J'ai un fichier .csv de valeurs, chaque colonne étant séparée d'une virgule.
Certaines de ces valeurs sont soit en nombre décimale (pas de soucis), soit en notation scientifique.
Le hic, c'est que la fonction que j'utilise pour chercher le minimum de la colonne 4 n'a pas l'air de reconnaître les nombres scientifiques...
min=$(cut -d "," -f4 Position_Front$i.csv | sort -n | head -1)
Je pensais donc à passer toutes les valeurs de mon fichier .csv en notation décimale pour régler le problème.
Savez-vous comment je dois procéder ?
Bien à vous,
Zackalucard
Hors ligne
#2 Le 28/05/2014, à 04:53
- pingouinux
Re : Modifier type de notation d'un fichier de valeurs
Bonjour,
Essaye avec sort -g
Hors ligne
#3 Le 28/05/2014, à 07:40
- Postmortem
Re : Modifier type de notation d'un fichier de valeurs
Salut,
Sinon, montre une partie de ton fichier ; awk (du moins gawk) doit pouvoir convertir en décimal ou même te donner la valeur minimum sans passer par la convention.
Et merci pingouinux, j'avais pas fait gaffe au -g de sort. Elles sont vraiment bien les commandes GNU !
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#4 Le 28/05/2014, à 08:25
- tiramiseb
Re : Modifier type de notation d'un fichier de valeurs
Salut,
De mon côté, pour un traitement de ce genre, je le ferais en Python...
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#5 Le 28/05/2014, à 09:12
- zackalucard
Re : Modifier type de notation d'un fichier de valeurs
Bonjour et merci pour vos réponse !
Pingouinux, j'ai essayé ton option avec un exemple mais ielle trie de la façon suivante :
1
3.0e-4
1.0e0
1.0e1
donne
1
1.0e0
1.0e1
3.0e-4
C'est étrange
Postmortem, voici un exemple de mes fichiers .csv :
1.4191,-5e-05
1.4038,7.7665e-05
1.4063,8.3697e-05
1.4106,8.1899e-05
1.4159,9.6146e-05
1.4166,0.0001
1.4172,0.0001019
1.4118,0.00010688
J'espère que vous pourrez m'aider
Hors ligne
#6 Le 28/05/2014, à 10:01
- pingouinux
Re : Modifier type de notation d'un fichier de valeurs
Pingouinux, j'ai essayé ton option avec un exemple mais ielle trie de la façon suivante :
1
3.0e-4
1.0e0
1.0e1donne
1
1.0e0
1.0e1
3.0e-4
C'est bizarre, j'obtiens ceci
$ cat j
1
3.0e-4
1.0e0
1.0e1
$ sort -g j
3.0e-4
1
1.0e0
1.0e1
En revanche, ceci donne la même chose que ton résultat (oubli de -g ?)
$ sort j
1
1.0e0
1.0e1
3.0e-4
Ajouté :
Ton exemple en #5 contient 2 champs, alors que tu cherches le 4ème avec le cut en #1
Dernière modification par pingouinux (Le 28/05/2014, à 10:17)
Hors ligne
#7 Le 28/05/2014, à 10:38
- zackalucard
Re : Modifier type de notation d'un fichier de valeurs
Oui c'est bizarre car j'utilise bien le -g...
Il y a une option intrinsèque à activer peut-être ?
Effectivement, j'ai mis en #5 un exemple plus simple que ce que j'avais pour que ce soit clair.
Je cherche dans #5 à trouver le min et le max de ma deuxième colonne.
Hors ligne
#8 Le 28/05/2014, à 10:47
- zackalucard
Re : Modifier type de notation d'un fichier de valeurs
Alors, j'ai essayé une commande :
while read
do
sed 's/e/*10^/g;s/ /*/' | bc
done < test.dat
avec test.dat, le fichier qui contient les valeurs en #5/#6. Il me donne :
0
1.0
10.0
Il y a du progrès mais là il me sucre le 3.0e-4 >>
Hors ligne
#9 Le 28/05/2014, à 14:10
- claudius01
Re : Modifier type de notation d'un fichier de valeurs
Bonjour,
J'ai trouvé sur ce même forum, le fil de discussion LINUX : conversion nombre scientifique en nombre decimal (awk, printf) qui propose la commande:
$ echo "5.083E-5" | awk -F"E" 'BEGIN{OFMT="%10.10f"} {print $1 * (10 ^ $2)}'
0.0000508300
$ echo "3.0E-4" | awk -F"E" 'BEGIN{OFMT="%10.10f"} {print $1 * (10 ^ $2)}'
0.0003000000
$ echo "3.0E+4" | awk -F"E" 'BEGIN{OFMT="%10.10f"} {print $1 * (10 ^ $2)}'
30000
à adapter en terme de nombre de chiffres avant et après la virgule et qui permettrait de faciliter le classement souhaité...
Cordialement, A+
--
Claudius
Hors ligne
#10 Le 28/05/2014, à 19:52
- Postmortem
Re : Modifier type de notation d'un fichier de valeurs
Salut,
J'ai fait quelques tests avec ce fichier :
cat /tmp/test
1.4038,7.7665e-05
1.4063,8.3697e-05
1.4106,8.1899e-05
1.4191,-5e-05
1.4159,9.6146e-05
1.4166,0.0001
1.4172,0.0001019
1.4118,0.00010688
$ awk -F, 'NR==1{min=$2;next}$2<min{min=$2}END{print min}' /tmp/test
-5e-05
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#11 Le 02/06/2014, à 17:22
- zackalucard
Re : Modifier type de notation d'un fichier de valeurs
Merci infiniment Postmortem, ça marche nickel !!!!
Merci à tout les autres également pour vos réponses [je me suis mis entre temps au Python mais pas évident de slalomer entre les différents codes ]
Hors ligne
#12 Le 02/06/2014, à 17:33
- pingouinux
Re : Modifier type de notation d'un fichier de valeurs
Ton résultat curieux avec sort -g (messages #6 et #7) est peut-être un problème de locale. Que donne cette commande
locale
Hors ligne
#13 Le 09/06/2014, à 19:10
- zackalucard
Re : Modifier type de notation d'un fichier de valeurs
Saut pinguinux,
Désolé pour l'attente, j'étais pas mal occupé cette semaine.
Voici ce que donne ma commande :
LANG=fr_FR.UTF-8
LC_CTYPE="fr_FR.UTF-8"
LC_NUMERIC="fr_FR.UTF-8"
LC_TIME="fr_FR.UTF-8"
LC_COLLATE="fr_FR.UTF-8"
LC_MONETARY="fr_FR.UTF-8"
LC_MESSAGES="fr_FR.UTF-8"
LC_PAPER="fr_FR.UTF-8"
LC_NAME="fr_FR.UTF-8"
LC_ADDRESS="fr_FR.UTF-8"
LC_TELEPHONE="fr_FR.UTF-8"
LC_MEASUREMENT="fr_FR.UTF-8"
LC_IDENTIFICATION="fr_FR.UTF-8"
LC_ALL=
Hors ligne
#14 Le 09/06/2014, à 21:36
- pingouinux
Re : Modifier type de notation d'un fichier de valeurs
Avec LC_NUMERIC="fr_FR.UTF-8", le sort -g serait correct si le point décimal était remplacé par une virgule. Avec ton exemple en #5, ceci devrait faire un tri correct :
LC_NUMERIC=C sort -g ton_fichier_numérique_avec_point_décimal
Hors ligne