Création
d'entreprise
Posez votre question Signaler

[Shell Unix] division, arrondi

renaud - Dernière réponse le 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
Lire la suite 

[Shell Unix] division, arrondi »

Suggestions
9 réponses
Réponse
+1
moins plus
Salut,
echo "scale=2; 5.7/3" | bc

man bc
man dc

lami20j
Ajouter un commentaire
Réponse
+1
moins plus
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$
jipicy- 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
;-))
lami20j- 22 mars 2008 à 11:07
Oui, en effet ;-))
Ajouter un commentaire
Réponse
+0
moins plus
Salut,

Tu peux poster un exemple concret s'il te plaît de ce que tu obtiens et de ce que tu aimerais obtenir.
reg - 21 mars 2008 à 13:50
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
jipicy- 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...
Reg - 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 ?
Ajouter un commentaire
Réponse
-1
moins plus
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
Ajouter un commentaire
Ce document intitulé « [Shell Unix] division, arrondi » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?