Runden und Formatieren von Zahlen in der bash
Aus BraLUG-Wiki
(Unterschied zwischen Versionen)
(neu...) |
Version vom 29. Mai 2006, 13:03 Uhr
Es bestand in einem Script der Wunsch Zahlen in ein lesbares Format umzuwandeln und auszugeben. Speziell handelte es sich um die Anzahl von Bytes, die über die Netzwerkschnittstelle gehen. Ab einer Zahl > 1000000 kann das dann schon mal leicht unübersichtlich werden.
Aus diesem Grund hier mal ein kleines Shell-Script, innerhalb dessen die Funktion my_format eine Umformatierung (und die damit eventuell notwendige Rundung) des Wertes vornimmt. Als Ausgabeformat soll ungefähr soetwas rauskommen:
- Wert < 1000: xxx
- Wert >= 10000: xxx.xK
- Wert >= 1000000: xxx.xM
- Wert >= 1000000000: xxx.xG
#!/bin/bash #******************************************************************* # my_format # Uwe Berger; 2006 # # Rundet und formatiert eine uebergebene Zahl in ein besser lesbares # Format um -> Format: xxx.x<G|M|K| > # (G=Giga, M=Mega, K=Kilo) #******************************************************************* function my_format () { # 1.Uebergabeparameter ist die Zahl zahl=$1 # Vorsatzzeichen und Teiler bestimmen if [ $zahl -gt 999999999 ] ; then t=1000000000 e=G else if [ $zahl -gt 999999 ] ; then t=1000000 e=M else if [ $zahl -gt 999 ] ; then t=1000 e=K else # gleich ausgeben, es muss nichts formatiert werden printf "%5d " $zahl return fi fi fi # Zwischenvars. zum Runden berechnen tr=`expr $t / 20`; tt=`expr $t / 10`; # Runden und ganzzahligen Teil berechnen zr=`expr $zahl + $tr` z1=`expr $zr / $t` # Rest auf eine Stelle berechnen z2=`expr $zr % $t` z2=`expr $z2 / $tt` # und ausgeben printf "%3d.%1d%s" $z1 $z2 $e return } # ... und Funktion mal testen... my_format 298 echo my_format 2980 echo my_format 29800 echo my_format 298000 echo my_format 2980000 echo my_format 29800000 echo my_format 298000000 echo my_format 2980000000 echo my_format 29800000000 echo my_format 298000000000 echo my_format 1000
Als Ergebnis erhält man:
298 3.0K 29.8K 298.0K 3.0M 29.8M 298.0M 3.0G 29.8G 298.0G 1.0K