[Shell Unix] division, arrondi

Fermé
renaud - 10 nov. 2006 à 20:55
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 22 mars 2008 à 11:07
Bonjour,

Je fais un script shell et dedans j'utilise une division res=$(expr $a / $b). Après recherche il semble qu'en fait cela correspond à la division entiere..
Or il se trouve que res varie entre 0 et 6. Je perds énormément en précision : si $a/$b = 1.9, j'ai comme résultat 1...
Comment peut on traiter les flottants avec un shell? Dans mon cas précis un arrondi à l'entier le plus proche me conviendrais, meme si ce n'est pas parfait ( 0.5 retourne 1, 0.7 retourne 1, 0.3 retourne 0...)

Y a t il une solution simple pour arriver à cela?
Merci

4 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
10 nov. 2006 à 21:34
Salut,
echo "scale=2; 5.7/3" | bc

man bc
man dc

lami20j
2
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896
21 mars 2008 à 11:33
Salut,

Tu peux poster un exemple concret s'il te plaît de ce que tu obtiens et de ce que tu aimerais obtenir.
1
Merci d'avoir regardé si rapidement,
Ce que je veux faire :
écrire un nombre au format scientifique dans un fichier .txt
je fais :

M=$((5/2));
printf "%E" $M >> in

avec ca j'obtient : 2.000000E+00
je veux obetinr 2.500000E+00
En plus je suis oblié de diviser des entiers alors que je voudrais diviser des réels.

J'ai donc essaié avec cette commande :

echo "scale=2; 5.7/3" | bc >> in

J'obtiens bien 1.90 mais je n'arrive pas à écrire ce nombre au format scientifique.

Voilà, je ne sais toujours pas si je suis clair mais n'hésite pas à me demander d'autres précisions si besoin.
Merci d'avance
Reg
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896 > reg
21 mars 2008 à 14:29
[tmpfs]$ M=$(echo "scale=2; 5/2" | bc)
[tmpfs]$ printf "%E\n" $M
-l: printf: 2.50: invalid number
0,000000E+00
[tmpfs]$ printf "%E\n" ${M/\./,}
2,500000E+00
[tmpfs]$
C'est une question de délimiteur de valeur décimale (le point par défaut) qu'il faut remplacer par une virgule...
0
Reg > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
22 mars 2008 à 00:19
Merci beaucoup pour ta réponse,
Ca marche bien
Mais j'ai un autre petit soucis maintenant :
j'ai besoin de rechercher une valeur max dans un fichier txt rempli de valeurs dans une colonne donnée et une plage de ligne donnée.
J'arrive à extraire certaines lignes du fichier dans un fichier temporaire grace aux commande head et tail mais je n'arrive pas à extraire une colonne.
Auriez vous une idée ?
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
22 mars 2008 à 07:05
Salut,

le fichier (les champs sont séparés par espace)
lami20j@debian:~/trash$ cat fic
0 8452 2844 180.88 22.81 0.09
1 8452 3137 180.62 2.28 0.14
2 8452 3430 149.66 -1.84 0.30
3 8452 3724 180.62 -28.81 0.15
4 8760 2942 118.56 -18.09 0.12
5 8760 3235 173.00 28.62 0.12
6 8760 3528 149.59 -1.97 0.17
7 8760 3821 149.75 -1.88 0.44
8 9067 3039 157.84 2.12 0.18
9 9067 3333 134.97 -5.31 0.17
10 9067 3626 149.50 -1.75 0.48
11 9375 2844 137.22 -0.03 0.13
12 9375 3137 179.19 9.19 0.14
13 9375 3430 149.38 -1.91 0.47
14 9375 3723 153.91 -19.97 0.10
15 9682 2942 125.97 26.34 0.17

prenons le cas de la colonne 5 (en gras),
je veux par exemple afficher le max pour la colonne 5 seulement entre les lignes numérotés 3 à 10
lami20j@debian:~/trash$ cat fic
0 8452 2844 180.88 22.81 0.09
1 8452 3137 180.62 2.28 0.14
2 8452 3430 149.66 -1.84 0.30
3 8452 3724 180.62 -28.81 0.15
4 8760 2942 118.56 -18.09 0.12
5 8760 3235 173.00 28.62 0.12
6 8760 3528 149.59 -1.97 0.17
7 8760 3821 149.75 -1.88 0.44
8 9067 3039 157.84 2.12 0.18
9 9067 3333 134.97 -5.31 0.17
10 9067 3626 149.50 -1.75 0.48
11 9375 2844 137.22 -0.03 0.13
12 9375 3137 179.19 9.19 0.14
13 9375 3430 149.38 -1.91 0.47
14 9375 3723 153.91 -19.97 0.10
15 9682 2942 125.97 26.34 0.17
lami20j@debian:~/trash$ sed '4,11!d' fic|cut -d" " -f5|sort -n
-28.81
-18.09
-5.31
-1.75
-1.88
-1.97
2.12
28.62
lami20j@debian:~/trash$ sed '4,11!d' fic|cut -d" " -f5|sort -n|tail -1
28.62
lami20j@debian:~/trash$
1
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 896
22 mars 2008 à 10:04
Hi,

Avec "awk" c'est peut être plus approprié, non ?
awk ' NR==3,NR==10 { print $5 }' fic | sort -n | tail -1
;-))
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
22 mars 2008 à 11:07
Oui, en effet ;-))
0
Salut à tous,

j'ai un problème similaire à celui de Renaud.
Dans mon script Shell, j'aimerais diviser deux réels ou entiers et obtenir un réel.

echo "scale=2; 5.7/3" | bc

Cette commande fonctionne mais j'ai besoin d'écrire la résultat dans un fichier .txt
J'utilise normalement :

printf "%E" $variable >> fichier.txt

Mais j'obtiens des valeures entières.
Comment faire ???

Merci d'avance
Reg
0