如何用Bash/AWK将GB、TB转为TiB?解决小数匹配问题
GB/TB 转 TiB 的 Bash/AWK 实现
核心转换逻辑
先明确单位换算关系(十进制存储单位转二进制TiB):
- 1 GB(10^9字节)= 10^9 / 2^40 TiB ≈ 0.0009094947 TiB
- 1 TB(10^12字节)= 10^12 / 2^40 TiB ≈ 0.9094947018 TiB
如果是二进制单位(GiB/TiB)转换,直接用1024进制:
- 1 GiB = 1/1024 TiB
- 1 TiB = 1 TiB
修正后的AWK脚本
针对整数、小数格式的输入(如6TB、10.53TB),以下脚本可正确匹配并计算:
方法一:自动提取数值(简洁版)
利用AWK自动转换字符串为数值的特性,直接提取整数/小数部分:
awk '{ val = $0 + 0 unit = substr($0, length(val) + 1) if (unit == "GB") { tib = val * 1000^3 / 1024^4 } else if (unit == "TB") { tib = val * 1000^4 / 1024^4 } else { print "无效输入: " $0 next } printf "%.2f TiB\n", tib }'
方法二:正则精确匹配(更严谨)
通过正则严格校验输入格式,确保仅处理合法的数值+单位组合:
{ if ($0 ~ /^[0-9]+(\.[0-9]+)?[GT]B$/) { value = gensub(/([0-9]+\.?[0-9]*)([GT]B)/, "\\1", 1, $0) unit = gensub(/([0-9]+\.?[0-9]*)([GT]B)/, "\\2", 1, $0) if (unit == "GB") { tib = value * 1000^3 / 1024^4 } else if (unit == "TB") { tib = value * 1000^4 / 1024^4 } printf "%.2f TiB\n", tib } else { print "无效输入: " $0 } }
使用方式
- 处理标准输入:
echo "10.53TB" | awk '{...}' # 替换为上面的脚本内容 - 处理文件:
awk '{...}' 存储数据.txt
原错误原因
之前的AWK命令无法处理小数,大概率是正则仅匹配了整数(如^[0-9]+[GT]B$),未覆盖小数点及后续小数位的匹配规则。修正后的正则或自动提取数值的方式,可完整支持整数和小数场景。
内容的提问来源于stack exchange,提问作者user1400953
相关产品推荐
相关产品推荐

