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}'
这是对@starfry 答案的修改。
让我们分解一下:
函数 pp(p) { printf "%u\n", $0 * 1024^p }
定义一个名为的函数pp
,它接受一个参数p
并打印$0
乘以 1024 的p-th
幂。将%u
打印该数字的无符号十进制整数。
/[0-9]$/ { 打印 $0 }
匹配以数字$
结尾的行(匹配行尾),然后在{
and中运行代码}
。打印整行 ( $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
等等...对于G
和T
/[^0-9KMGT]$/ { 打印 0 }
不以数字或大写字母 K、M、G 或 T 结尾的行打印“0”。
例子:
$ 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