Text-Processing

將字節數轉換為人類 KiB MiB 等的標準工具;像杜,LS1

  • November 3, 2021

是否有一個標準工具可以將字節的整數計數轉換為最大可能單位大小的人類可讀計數,同時將數值保持在 1.00 和 1023.99 之間?

我有自己的 bash/awk 腳本,但我正在尋找一個標準工具,該工具可在許多/大多數發行版中找到……更普遍可用的東西,理想情況下具有簡單的命令行參數,和/或可以接受管道輸入。

以下是我正在尋找的輸出類型的一些範例。

   1    Byt  
 173.00 KiB  
  46.57 MiB  
   1.84 GiB  
  29.23 GiB  
 265.72 GiB  
   1.63 TiB  

這是bytes-human腳本(用於上述輸出)

awk -v pfix="$1" -v sfix="$2" 'BEGIN { 
     split( "Byt KiB MiB GiB TiB PiB", unit )
     uix = uct = length( unit )
     for( i=1; i<=uct; i++ ) val[i] = (2**(10*(i-1)))-1
  }{ if( int($1) == 0 ) uix = 1; else while( $1 < val[uix]+1 ) uix--
     num = $1 / (val[uix]+1)
     if( uix==1 ) n = "%5d   "; else n = "%8.2f"
     printf( "%s"n" %s%s\n", pfix, num, unit[uix], sfix ) 
  }'

更新  這裡是Gilles腳本的修改版本,如對他的回答的評論中所述..(已修改以適合我的首選外觀)。

awk 'function human(x) {
        s=" B   KiB MiB GiB TiB EiB PiB YiB ZiB"
        while (x>=1024 && length(s)>1) 
              {x/=1024; s=substr(s,5)}
        s=substr(s,1,4)
        xf=(s==" B  ")?"%5d   ":"%8.2f"
        return sprintf( xf"%s\n", x, s)
     }
     {gsub(/^[0-9]+/, human($1)); print}'

不,沒有這樣的標準工具。

由於 GNU coreutils 8.21(2013 年 2 月,因此尚未出現在所有發行版中),在非嵌入式 Linux 和 Cygwin 上,您可以使用numfmt. 它不會產生完全相同的輸出格式(從 coreutils 8.23 開始,我認為你不能得到小數點後的 2 位數字)。

$ numfmt --to=iec-i --suffix=B --padding=7 1 177152 48832200 1975684956
    1B
173KiB
 47MiB
1.9GiB

許多較舊的 GNU 工具可以生成這種格式,並且自 coreutils 7.5(2009 年 8 月,現代非嵌入式 Linux 發行版中出現)以來, GNU sort 可以使用單位對數字進行排序。


我發現你的程式碼有點複雜。這是一個更簡潔的 awk 版本(輸出格式並不完全相同):

awk '
   function human(x) {
       if (x<1000) {return x} else {x/=1024}
       s="kMGTEPZY";
       while (x>=1000 && length(s)>1)
           {x/=1024; s=substr(s,2)}
       return int(x+0.5) substr(s,1,1)
   }
   {sub(/^[0-9]+/, human($1)); print}'

轉自更專業的問題

引用自:https://unix.stackexchange.com/questions/44040