Is there a standard tool which converts an integer count of Bytes into a human-readable count of the largest possible unit-size, while keeping the numeric value between 1.00 and 1023.99 ?
I have my own bash/awk script, but I am looking for a standard tool, which is found on many/most distros... something more generally available, and ideally has simple command line args, and/or can accept piped input.
Here are some examples of the type of output I am looking for.
1 Byt 173.00 KiB 46.57 MiB 1.84 GiB 29.23 GiB 265.72 GiB 1.63 TiB Here is the bytes-human script (used for the above output)
awk -v pfix="$1" -v sfix="$2" 'BEGIN { split( "Byt KiB MiB GiB TiB PiB", unit ) uix = uct = length( unit ) for( i=1; i<=uct; i++ ) val[i] = (2**(10*(i-1)))-1 }{ if( int($1) == 0 ) uix = 1; else while( $1 < val[uix]+1 ) uix-- num = $1 / (val[uix]+1) if( uix==1 ) n = "%5d "; else n = "%8.2f" printf( "%s"n" %s%s\n", pfix, num, unit[uix], sfix ) }' Update Here is a modified version of Gilles' script, as described in a comment to his answer ..(modified to suit my preferred look).
awk 'function human(x) { s=" B KiB MiB GiB TiB EiB PiB YiB ZiB" while (x>=1024 && length(s)>1) {x/=1024; s=substr(s,5)} s=substr(s,1,4) xf=(s==" B ")?"%5d ":"%8.2f" return sprintf( xf"%s\n", x, s) } {gsub(/^[0-9]+/, human($1)); print}'
standard toolin the making :)numfmtdoes this. Release in Gnu coreutils in 2013.