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}'
This is a modification on @starfry's answer.
Let's break it down:
function pp(p) { printf "%u\n", $0 * 1024^p }
Define a function named pp
that takes a single parameter p
and prints the $0
multiplied by 1024 raised to the p-th
power. The %u
will print the unsigned decimal integer of that number.
/[0-9]$/ { print $0 }
Match lines that end with a digit (the $
matches the end of the line), then run the code inside the {
and }
. Print the entire line ($0
)
/K$/ { pp(1) }
Match lines that end with the capital letter K
, call the function pp() and pass 1 to it (p == 1). NOTE: When $0 (e.g. "1.43K") is used in a math equation only the beginning numbers (i.e. "1.43") will be used below. Example with $0 = "1.43K"
$0 * 1024^p == 1.43K * 1024^1 == 1.43K * 1024 = 1.43 * 1024 = 1464.32
/M$/ { pp(2) }
Match lines that end with the capital letter M
, call the function pp() and pass 2 to it (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 the 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