You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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
    }
}

使用方式

  1. 处理标准输入:
    echo "10.53TB" | awk '{...}'  # 替换为上面的脚本内容
    
  2. 处理文件:
    awk '{...}' 存储数据.txt
    

原错误原因

之前的AWK命令无法处理小数,大概率是正则仅匹配了整数(如^[0-9]+[GT]B$),未覆盖小数点及后续小数位的匹配规则。修正后的正则或自动提取数值的方式,可完整支持整数和小数场景。

内容的提问来源于stack exchange,提问作者user1400953

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 08:25:21