[Shell Unix] division, arrondi

renaud -  
lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
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. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,
    echo "scale=2; 5.7/3" | bc

    man bc
    man dc

    lami20j
    2
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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. reg
       
      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
      1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > 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
      2. Reg > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        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
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Hi,

      Avec "awk" c'est peut être plus approprié, non ?
      awk ' NR==3,NR==10 { print $5 }' fic | sort -n | tail -1
      ;-))
      0
      1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571 > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Oui, en effet ;-))
        0
  4. reg
     
    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