-2

私はいつも噛まれます(4521564 b)

if the result is > 1 YB - print result in YB
if the result is > 1 ZB and < 1 YB - print result in ZB
if the result is > 1 EB and < 1 ZB - print result in EB
if the result is > 1 PB and < 1 EB - print result in PB
if the result is > 1 TB and < 1 PB - print result in TB
if the result is > 1 GB and < 1 TB - print result in GB
if the result is > 1 MB and < 1 GB - print result in MB
if the result is > 1 KB and < 1 MB - print result in KB

計算できるbashについて知りませんか?

4

2 に答える 2

3

awk の使用:

f.awk 内容:

$ cat f.awk
function calc(num,i)
{
        if (num>=1024)
            calc(num/1024,i+1);
        else
           printf "%.2f %s\n", num,a[i+1];
}

BEGIN{
        split("b KB MB GB TB PB EB ZB YB",a);
        calc(val,0)
}

上記の awk プログラムを次のように実行します。

$ awk -v val=4521564  -f f.awk
4.31 MB

ここで使用されるロジックは、元の数値が 1024 未満になるまで数値を 1024 ずつ割り続けることです。カウントは最終的にユニットにマップされ、適切なユニットが取得されます。関数 calc は再帰的に呼び出されます。

例: I/p: 1000bytes: この場合、no. が 1024 未満の場合、除算は行われず、カウンターは 0 です。カウンターはバイト インデックスにマップされます。

I/p : 2050 : 1024 で除算し、count を 1 増やします。が 1024 未満の場合、カウンターが指す単位 (この場合は Kb) で出力されます。

于 2012-11-30T04:59:13.617 に答える
1

シェルはヘルパーなしでは浮動小数点を実行しないため、このシェル関数は丸められます

byteme(){
v=$1
i=0
s=" KMGTPEZY"
while [ $v -gt 1024 ]; do
    i=$((i+1))
    v=$((v/1024))
done
echo $v${s:$i:1}b
}

byteme 1234567890
1Gb
于 2012-11-30T05:44:26.600 に答える