Rechercher : dans
Par :

[Shell Unix] division, arrondi

Dernière réponse le 22 mar 2008 à 11:07:16 renaud, le 10 nov 2006 à 20:55:35 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « [Shell Unix] division, arrondi » dans :
Exécuter un script shell VoirExécution d'un script Pour pouvoir exécuter un script ou un programme en ligne de commande il y a plusieurs possibilités : 1. Le chemin absolu 2. Le chemin relatif 3. Modifier la variable PATH Note: Le Sha...
Sed - Supprimer une ou plusieurs lignes d'un fichier VoirSupprimer une (ou plusieurs) ligne(s) d'un fichier Syntaxe sed '{[/]||[/]}d' sed '{[/][,][/]d' /.../ = délimiteurs n = le numéro de ligne chaîne = la chaîne contenue dans la...
Télécharger CygWin VoirCygwin est un environnement UNIX pour Windows composé: d'un shell Unix d'une librairie dynamique (DLL) chargée de fournir une couche d'émulation Unix pour le système Windows d'un ensemble de librairies, sources et exécutables adaptés à Cygwin...
Systèmes UNIX - Le shell VoirIntroduction au shell L'interpréteur de commandes est l'interface entre l'utilisateur et le système d'exploitation, d'où son nom anglais «shell», qui signifie «coquille». Le shell est ainsi chargé de faire l'intermédiaire entre le système...
Linux - Gestion des utilisateurs VoirPremier pas de l'administrateur Lorsque diverses personnes ont accès à un système, il est nécessaire que l'administrateur système gère les utilisateurs. Pour ceci, les commandes usuelles et les fichiers à configurer doivent être connus. Les...

1

lami20j, le 10 nov 2006 à 21:34:09

Salut,

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

man bc
man dc

lami20j

Répondre à lami20j

2

reg, le 21 mar 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

jipicy, le 21 mar 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

reg, le 21 mar 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

jipicy, le 21 mar 2008 à 14:29:22
  • +2

[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

Reg, le 22 mar 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

lami20j, le 22 mar 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

jipicy, le 22 mar 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

 lami20j, le 22 mar 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