这是对@starfry答案的修改。
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}'
让我们来解释一下:
function pp(p) { printf "%u\n", $0 * 1024^p }
定义一个名为pp
的函数,它接受一个参数p
,并打印$0
乘以1024的p次方
。 %u
将打印该数字的无符号十进制整数。
/[0-9]$/ { print $0 }
匹配以数字结尾的行($
匹配行尾),然后运行{
和}
中的代码。 打印整行($0
)
/K$/ { pp(1) }
匹配以大写字母K结尾的行,调用函数pp()并将1作为参数传递给它(p == 1)。注意:当$0(例如“1.43K”)在数学方程中使用时,仅使用开头的数字(即“1.43”)。示例中$0 =“1.43K”。
$0 * 1024^p == 1.43K * 1024^1 == 1.43K * 1024 = 1.43 * 1024 = 1464.32
/M$/ { pp(2) }
匹配以大写字母 M
结尾的行,调用函数 pp() 并将 2 传递给它(p == 2)。例如,当 $0 == "120.3M" 时。
$0 * 1024^p == 120.3M * 1024^2 == 120.3M * 1024^2 == 120.3M * 1024*1024 = 120.3 * 1048576 = 126143692.8
等等... for G
和T
/ [^ 0-9KMGT] $ / {打印0}
以数字或大写字母K、M、G或T结尾的行将打印"0"。
Example:
$ cat dehumanise
937
1.43K
120.3M
5G
933G
12.2T
bad
<>
结果:
$ 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