Function awk 'pp (p) {printf "% u \ n", $ 0 * 1024 ^ p} / [0-9] $ / {print $ 0} / K $ / {pp (1)} / M $ / {pp (2)} / G $ / {pp (3)} / T $ / {pp (4)} / [^ 0-9KMGT] $ / {print 0} '
This is a modification of @starfry's answer.
Let's figure it out:
function pp (p) {printf "% u \ n", $ 0 * 1024 ^ p}
Define a function called pp that takes one parameter p and prints $0 times 1024, raised to the p-th degree. %u print an unsigned decimal integer for that number.
/ [0-9] $ / {print $ 0}
Match the lines ending with a digit ( $ matches the end of the line), then run the code inside { and } . Print the entire line ( $0 )
/ K $ / {pp (1)}
Match the lines that end with the capital letter K , call the pp () function, and pass it 1 (p == 1). NOTE. When $ 0 is used in the mathematical equation (for example, "1.43 KB"), only the starting numbers will be used below (i.e., "1.43"). Example with $ 0 = "1.43K"
$0 * 1024^p == 1.43K * 1024^1 == 1.43K * 1024 = 1.43 * 1024 = 1464.32
/ M $ / {pp (2)}
Match the lines ending with the capital letter M , call the pp () function, and pass it 2 (p == 2). Example with $ 0 == "120.3M"
$0 * 1024^p == 120.3M * 1024^2 == 120.3M * 1024^2 == 120.3M * 1024*1024 = 120.3 * 1048576 = 126143692.8
etc ... for G and T
/ [^ 0-9KMGT] $ / {print 0}
Lines that do not end with a digit or capital letters K, M, G or T print "0".
Example:
$ cat dehumanise 937 1.43K 120.3M 5G 933G 12.2T bad <>
Results:
$ awk 'function pp(p){printf "%u\n",$0*1024^p} /[0-9]$/{print $0}/K$/{pp(1)}/M$/{pp(2)}/G$/{pp(3)}/T$/{pp(4)}/[^0-9KMGT]$/{print 0}' dehumanise 937 1464 126143692 5368709120 1001801121792 13414041858867 0 0