awk中拆分变量的数字与单位:为何ex未获取到单位MB?
问题拆解与解决办法
咱们来一步步看你为啥拿不到想要的单位值:
首先,你的脚本里substr($1, length($1))这个操作,只会取输入字符串的最后一个字符——比如输入139506MB的话,它拿到的是B,而不是完整的MB。然后你用这个单个字符去index("KMGTPEZY", ...)里找,B根本不在这个字符串里,所以index自然返回0啦。
其次,就算你取对了字符,index函数返回的是字符在目标字符串中的位置数字,不是字符本身,它本来就不会直接返回MB哦。
修正后的实用脚本
如果你的需求是拆分出数值和两位单位,同时还想拿到单位首字母在KMGTPEZY中的位置,可以这么写:
echo 139506MB | awk '{ # 取最后两个字符作为单位 unit = substr($1, length($1)-1) # 取前面所有字符作为数值 val = substr($1, 1, length($1)-2) # 找单位首字母在序列中的位置(从1开始计数) ex = index("KMGTPEZY", substr(unit, 1, 1)) print ex " " val " " unit }'
运行后会输出:2 139506 MB(因为M在KMGTPEZY里是第2位)。
要是你只需要拆分数值和单位,不需要位置值,直接简化成下面的版本就行:
echo 139506MB | awk '{ unit = substr($1, length($1)-1) val = substr($1, 1, length($1)-2) print val " " unit }'
这个会直接输出139506 MB。
小知识点补充
substr函数的语法是substr(字符串, 起始位置, [长度]),如果省略长度参数,会自动取到字符串末尾,所以substr($1, length($1)-1)就能直接拿到最后两个字符,不用特意写长度2。index函数的返回规则是:找到匹配字符就返回它的起始索引(从1开始),找不到就返回0,这也是你之前一直得到0的核心原因。
内容的提问来源于stack exchange,提问作者Sandra Schlichting
相关产品推荐
相关产品推荐

