use strict; use warnings; my %scale = (K => 1024, M => 1024**2, G => 1024 ** 3); print map {$_->[1]} sort {$a->[0] <=> $b->[0]} map {/^(\d+)(\w)/; [$1 * $scale{$2}, $_];} ; __DATA__ 33G /data/A 37M /data/B 44G /data/C 46G /data/D 68G /data/E 114G /data/F 148G /data/G 169M /data/H 17K /data/I #### $ perl sort_du.pl 17K /data/I 37M /data/B 169M /data/H 33G /data/A 44G /data/C 46G /data/D 68G /data/E 114G /data/F 148G /data/G