方便解析带有单位后缀的数字?

bea*_*ans 11 bash command-line-interface perl command utility

假设您拥有人类可读格式的数量数据,例如 的输出du -h,并且想要进一步对这些数字进行操作。假设您想通过 grep 传输数据以对该数据的子集进行求和。您可以在许多以前从未见过的系统上临时执行此操作,并且只有最少的实用程序。您需要对所有标准 10^n 后缀进行后缀转换。

是否存在一个 gnu-linux 实用程序来将后缀数转换为管道内的实数?您是否编写了一个 bash 函数来执行此操作,或者一些可能容易记住的 perl,而不是一段正则表达式替换或几个 sed 步骤?

38M     /var/crazyface/courses/200909-90147
2.7M    /var/crazyface/courses/200909-90157
1.1M    /var/crazyface/courses/200909-90159
385M    /var/crazyface/courses/200909-90161
1.3M    /var/crazyface/courses/200909-90169
376M    /var/crazyface/courses/200907-90171
8.0K    /var/crazyface/courses/200907-90173
668K    /var/crazyface/courses/200907-90175
564M    /var/crazyface/courses/200907-90178
4.0K    /var/crazyface/courses/200907-90179
Run Code Online (Sandbox Code Playgroud)

| grep 200907 | <amazing suffix conversion> | awk '{s+=$1} END {print s}'


相关参考资料:

Den*_*son 15

根据我对您链接到的问题之一的回答:

awk '{
    ex = index("KMGTPEZY", substr($1, length($1)))
    val = substr($1, 0, length($1) - 1)

    prod = val * 10^(ex * 3)

    sum += prod
}
END {print sum}'
Run Code Online (Sandbox Code Playgroud)

使用的另一种方法:

sed 's/G/ * 1000 M/;s/M/ * 1000 K/;s/K/ * 1000/; s/$/ +\\/; $a0' | bc
Run Code Online (Sandbox Code Playgroud)


Der*_*rfK 5

就我个人而言,我一开始就不会使用 -h 标志。“人类可读”版本对数字进行四舍五入,当您转换回来时需要再次四舍五入,从而变得更加不准确。(例如,2.7MiB 是 2831155.2 字节。您对另外 0.8 个字节做了什么??!)

否则,您可以要求units将 MiB/GiB/KiB 转换为“B”,它会处理这个问题,但您必须执行类似的操作(假设您的输出是选项卡式的,否则cut适当)

{your output} | cut -f1 '-d{tab}' | xargs -L 1 -I {} units -1t {}iB B | awk '{s+=$1}END{printf "%d\n",s}'
Run Code Online (Sandbox Code Playgroud)