rss
Shell UnixPlus
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Non résolu

[Shell Unix] division, arrondi

renaud, le vendredi 10 novembre 2006 à 20:55:35
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
Répondre à renaud  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
lami20j, le vendredi 10 novembre 2006 à 21:34:09
Salut,
echo "scale=2; 5.7/3" | bc

man bc
man dc

lami20j
Répondre à lami20j

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
reg, le vendredi 21 mars 2008 à 11:23:29
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
Répondre à reg

3


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
jipicy, le vendredi 21 mars 2008 à 11:33:25
Salut,

Tu peux poster un exemple concret s'il te plaît de ce que tu obtiens et de ce que tu aimerais obtenir.

Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.
Répondre à jipicy

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
reg, le vendredi 21 mars 2008 à 13:50:14
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
Répondre à reg

5


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
jipicy, le vendredi 21 mars 2008 à 14:29:22
[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...

Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.
Répondre à jipicy

6


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Reg, le samedi 22 mars 2008 à 00:19:02
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 ?
Répondre à Reg

7


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
lami20j, le samedi 22 mars 2008 à 07:05:51
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$

lami20j
Répondre à lami20j

8


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
jipicy, le samedi 22 mars 2008 à 10:04:59
Hi,

Avec "awk" c'est peut être plus approprié, non ?
awk ' NR==3,NR==10 { print $5 }' fic | sort -n | tail -1
;-))
Z'@+...che.

Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un pingouin.
Répondre à jipicy

9


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 lami20j, le samedi 22 mars 2008 à 11:07:16
Oui, en effet ;-))
lami20j
P.S. C'est déjà bien, n'oublie pas que je n'ai pas donnée une solution en perl ;-DDDD
Répondre à lami20j
Discussions pertinentes trouvées dans le forum
11/08 13h39Script shell unix22
Plus de discussions sur « [Shell Unix] division, arrondi »
Logiciels pertinents trouvés dans les téléchargements
Télécharger CygWin 1.5.24-2CygWin - Cygwin est un environnement UNIX pour Windows composé: d'un shell Unix d'une librairie dynamique (DLL) chargée de...Catégorie: Développement
Licence: Open Source
Télécharger WLM Universal Patcher++ 1.0.1WLM Universal Patcher++ - WLM Universal Patcher est un patch universel pour MSN (Windows Live Messenger) permettant : d'ouvrir plusieurs sessions...Catégorie: Messagerie instantanée
Licence: Freeware/gratuit
Télécharger SSH Secure Shell 3.0 build 203SSH Secure Shell - SSH secure shell for workstations est un client SSH flexible permettant de se connecter de façon sécurisée à des...Catégorie: Telnet/SSH
Licence: Open Source
Télécharger Unison 2.24.6Unison - Unison est un logiciel de synchronisation de répertoires. Il est capable de travailler de manière bidirectionnelle, c'est...Catégorie: Gestion de fichiers
Licence: Open Source
Plus de logiciels gratuits sur « [Shell Unix] division, arrondi »