Вот Perl версия:
perl -nle 'BEGIN {for (qw(k m g t)) {$m{$_}=1000**++$i}}; ($v,$u)=/([\d\.]+)([kmgt])?/; $v*=$m{$u} if $u; $t+=$v; END {print "Total $t Bytes\n"}' test_file
Или на нескольких строках для удобства чтения:
perl -nle '
BEGIN { for (qw(k m g t)) {$m{$_}=1000**++$i} }; # create multipliers hash
($v,$u) = /([\d\.]+)([kmgt])?/; # get value and optional unit
$v *= $m{$u} if $u; # multiply to get bytes (if unit was specified)
$t += $v;
END { print "Total $t Bytes\n"}' test_file
Это дает мегабайты как 1'000'000 байтов. Если ваши значения представляют двоичные числа Mebibytes et c., Замените 1000 на 1024.
Более читаемая версия инициализации множителя ha sh будет:
BEGIN { @m{ qw(k m g t) } = (1000, 1000**2, 1000**3, 1000**4) };
Если Ваши единицы также могут быть написаны в смешанном регистре, добавьте $_=lc;
перед регулярным выражением, чтобы сначала сделать все это строчными.