Aquí hay una función que comprende prefijos binarios y decimales y es fácilmente ampliable para unidades grandes en caso de necesidad:
dehumanise() {
for v in "${@:-$(</dev/stdin)}"
do
echo $v | awk \
'BEGIN{IGNORECASE = 1}
function printpower(n,b,p) {printf "%u\n", n*b^p; next}
/[0-9]$/{print $1;next};
/K(iB)?$/{printpower($1, 2, 10)};
/M(iB)?$/{printpower($1, 2, 20)};
/G(iB)?$/{printpower($1, 2, 30)};
/T(iB)?$/{printpower($1, 2, 40)};
/KB$/{ printpower($1, 10, 3)};
/MB$/{ printpower($1, 10, 6)};
/GB$/{ printpower($1, 10, 9)};
/TB$/{ printpower($1, 10, 12)}'
done
}
ejemplo:
$ dehumanise 2K 2k 2KiB 2KB
2048
2048
2048
2000
$ dehumanise 2G 2g 2GiB 2GB
2147483648
2147483648
2147483648
2000000000
Los sufijos no distinguen entre mayúsculas y minúsculas.
Usa numfmt --from=iec
de GNU coreutils.