web-dev-qa-db-fra.com

Calculer le pourcentage arrondi dans Shell Script sans utiliser "bc"

J'essaie de calculer le pourcentage de certains éléments dans Shell Script. Je voudrais arrondir la valeur, c’est-à-dire que si le résultat est 59,5, je devrais en attendre 60 et non 59. 

item=30
total=70
percent=$((100*$item/$total))

echo $percent

Cela donne 42. 

Mais en réalité, le résultat est 42,8 et je voudrais arrondir à 43. "Bc" fait l'affaire, y at-il moyen de ne pas utiliser "bc"?

Je ne suis pas autorisé à installer de nouveaux paquets. "dc" et "bc" ne sont pas présents dans mon système . Ce devrait être purement Shell, vous ne pouvez pas utiliser de scripts Perl ou python 

12
user2354302

Utilisez AWK (no bash-isms):

item=30
total=70
percent=$(awk "BEGIN { pc=100*${item}/${total}; i=int(pc); print (pc-i<0.5)?i:i+1 }")

echo $percent
43
22
Michael Back

En prenant 2 * le calcul du pourcentage original et en obtenant le modulo 2, vous obtenez l’incrément d’arrondi.

item=30
total=70
percent=$((200*$item/$total % 2 + 100*$item/$total))

echo $percent
43

(testé avec bash, cendres, tiret et ksh)

Ceci est une implémentation plus rapide que de déclencher un coprocessus AWK:

$ pa() { for i in `seq 0 1000`; do pc=$(awk "BEGIN { pc=100*${item}/${total}; i=int(pc); print (pc-i<0.5)?i:i+1 }"); done; }
$ time pa

real    0m24.686s
user    0m0.376s
sys     0m22.828s

$ pb() { for i in `seq 0 1000`; do pc=$((200*$item/$total % 2 + 100*$item/$total)); done; }
$ time pb

real    0m0.035s
user    0m0.000s
sys     0m0.012s
7
Michael Back

Ce qui suit est basé sur ma deuxième réponse, mais avec expr et tiques de fond - qui (bien que peut-être abominable pour la plupart) peuvent être adaptés au travail même dans les coquilles les plus archaïques:

item=30
total=70
percent=`expr 200 \* $item / $total % 2 + 100 \* $item / $total`

echo $percent
43
0
Michael Back