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
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
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
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