Apakah ada alat standar yang mengubah hitungan bilangan bulat Bytes menjadi hitungan yang dapat dibaca manusia dari ukuran unit terbesar yang mungkin, sambil menjaga nilai numerik antara 1,00 dan 1023,99 ?
Saya memiliki skrip bash/awk saya sendiri, tetapi saya mencari standar alat, yang ditemukan di banyak/sebagian besar distro… sesuatu yang lebih umum tersedia, dan idealnya memiliki argumen baris perintah sederhana, dan/atau dapat menerima input yang disalurkan.
Berikut adalah beberapa contoh jenis keluaran yang saya cari.
1 Byt
173.00 KiB
46.57 MiB
1.84 GiB
29.23 GiB
265.72 GiB
1.63 TiB
Ini byte-manusia script (digunakan untuk output di atas)
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%sn", pfix, num, unit[uix], sfix )
}'
Perbarui Ini adalah versi modifikasi dari Gilles' skrip, seperti yang dijelaskan dalam komentar untuk jawabannya ..(dimodifikasi agar sesuai dengan tampilan pilihan saya).
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"%sn", x, s)
}
{gsub(/^[0-9]+/, human($1)); print}'
Jawaban yang Diterima:
Tidak, tidak ada alat standar seperti itu.
Sejak GNU coreutils 8.21 (Feb 2013, jadi belum ada di semua distribusi), di Linux dan Cygwin non-embedded, Anda dapat menggunakan numfmt
. Itu tidak menghasilkan format output yang persis sama (pada coreutils 8.23, saya rasa Anda tidak bisa mendapatkan 2 digit setelah titik desimal).
$ numfmt --to=iec-i --suffix=B --padding=7 1 177152 48832200 1975684956
1B
173KiB
47MiB
1.9GiB
Banyak alat GNU yang lebih tua dapat menghasilkan format ini dan pengurutan GNU dapat mengurutkan angka dengan unit sejak coreutils 7.5 (Agustus 2009, jadi hadir pada distribusi Linux non-embedded modern).
Saya menemukan kode Anda agak berbelit-belit. Ini versi awk yang lebih bersih (format keluaran tidak persis sama):
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}'
(Diposting ulang dari pertanyaan yang lebih khusus)
Terkait:Mengapa tidak ada yang menggunakan shell Bourne yang sebenarnya sebagai /bin/sh?