[Shell Unix] division, arrondi

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

  1. Modérateur
    Salut,
    echo "scale=2; 5.7/3" | bc

    man bc
    man dc

    lami20j
    2
    1. Modérateur
      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
      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
      2. Modérateur
        @reg
        [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
      3. @jipicyMerci 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
    2. Modérateur
      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
      1. Modérateur
        Hi,

        Avec "awk" c'est peut être plus approprié, non ?
        awk ' NR==3,NR==10 { print $5 }' fic | sort -n | tail -1
        ;-))
        0
      2. Modérateur
        @jipicyOui, en effet ;-))
        0
    3. 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