Apakah ada alat standar yang mengubah bilangan integer Bytes menjadi jumlah 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 sedang mencari alat standar , yang ditemukan di banyak / kebanyakan distro ... sesuatu yang lebih umum tersedia, dan idealnya memiliki args baris perintah sederhana, dan / atau dapat menerima input pipa.
Berikut adalah beberapa contoh tipe output yang saya cari.
1 Byt
173.00 KiB
46.57 MiB
1.84 GiB
29.23 GiB
265.72 GiB
1.63 TiB
Berikut ini skrip byte-manusia (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%s\n", pfix, num, unit[uix], sfix )
}'
Pembaruan Berikut ini adalah versi modifikasi dari skrip Gilles , seperti yang dijelaskan dalam komentar atas jawabannya .. (dimodifikasi agar sesuai dengan tampilan yang saya sukai).
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}'
sumber
standard tool
dalam pembuatan :)Jawaban:
Tidak, tidak ada alat standar seperti itu.
Karena GNU coreutils 8.21 (Feb 2013, jadi belum ada di semua distribusi), di Linux dan Cygwin yang tidak tertanam, Anda dapat menggunakannya
numfmt
. Itu tidak menghasilkan format output yang persis sama (pada coreutils 8.23, saya tidak berpikir Anda bisa mendapatkan 2 digit setelah titik desimal).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 ada pada distribusi Linux non-embedded modern).
Saya menemukan kode Anda agak berbelit-belit. Ini versi awk yang lebih bersih (format output tidak persis sama):
( Di-posting ulang dari pertanyaan yang lebih khusus )
sumber
s
harus memimpinB
. String ini juga mudah diubah menjadi notasi IEC Binary. (2) Melompati rentang 1000-1023 dan mendukung 1 <ukuran berikutnya> (mudah diubah) (3) Tidak memiliki nilai desimal (yang saya inginkan). Sekali lagi ini mudah diubah. Saat menampilkan 2 tempat desimal,%f
format menyebabkan around-up
ke <ukuran berikutnya> untuk nilai 1019-1023 ; tapi tidak ada solusinya .. Saya telah mengirim versi yang dimodifikasi dalam jawaban saya, untuk referensi umum.du
angka ke format yang dapat dibaca manusia, perhatikan bahwa Anda mungkin perlu menambahkan--block-size=1
untukdu
perintah.Pada v.
8.21
,coreutils
Meliputinumfmt
:misalnya
Berbagai contoh lain (termasuk pemfilteran, pemrosesan input / output dll) disajikan di SINI .
Selain itu, pada
coreutils
v.8.24
,numfmt
Dapat memproses beberapa bidang dengan spesifikasi rentang bidang yang mirip dengancut
, dan mendukung pengaturan presisi keluaran dengan--format
opsimisalnya
sumber
Berikut adalah opsi bash-only, tidak ada
bc
atau non-builtin lainnya, format + desimal dan unit biner.Contoh:
Seharusnya berkinerja baik di semua versi Bash di luar sana (termasuk Bash untuk Windows MSYSGit).
sumber
Ini adalah penulisan ulang lengkap yang terinspirasi oleh skrip awk Gilles yang dimodifikasi versi Peter.O.
Perubahan:
Kode:
Uji Kasus (jika Anda ingin melihat output):
Nikmati!
sumber
Ada beberapa
perl
modul di CPAN: Format :: Manusia :: Bytes dan Number :: Bytes :: Human , yang terakhir menjadi sedikit lebih lengkap:Dan sebaliknya:
CATATAN: fungsi
parse_bytes()
ini ditambahkan dalam versi 0.09 (2013-03-01)sumber
Via linux - Apakah ada kalkulator baris perintah untuk perhitungan byte? - Stack Overflow , saya temukan tentang Unit GNU - walaupun tanpa contoh di halaman SO; dan karena saya tidak melihatnya tercantum di sini, ini adalah catatan kecil tentangnya.
Pertama, periksa apakah unit ada:
Karena begitu, lakukan konversi -
printf
penentu format diterima untuk memformat hasil numerik:sumber
Sebenarnya, ada utilitas yang melakukan hal ini. Aku tahu karena aku yang menulisnya. Itu ditulis untuk * BSD tetapi harus dikompilasi di Linux jika Anda memiliki perpustakaan BSD (yang saya percaya adalah umum).
Saya baru saja merilis versi baru, diposting di sini:
http://blog.frankleonhardt.com/2015/freebsd-hr-utility-human-readable-number-filter-man-page/
Ini disebut jam, dan itu akan mengambil stdin (atau file) dan mengonversi angka ke format yang dapat dibaca manusia dengan cara yang (sekarang) persis sama dengan ls -h dan seterusnya, dan dapat memilih umpan individu dalam garis, skala unit pra-skala (misalnya jika mereka berada di blok 512-byte mengubahnya menjadi Mb dll), sesuaikan bantalan kolom, dan sebagainya.
Saya menulisnya beberapa tahun yang lalu karena saya pikir mencoba menulis skrip shell, meskipun secara intelektual menarik, juga sangat gila.
Menggunakan jam, misalnya, Anda dapat dengan mudah mendapatkan daftar ukuran direktori yang diurutkan (yang keluar dalam satuan 1Kb dan perlu digeser sebelum mengonversi) dengan yang berikut ini:
du -d1 | sort -n | jam -sK
Sementara du akan menghasilkan -h output, sort tidak akan mengurutkannya. Penambahan -h ke utilitas yang ada adalah kasus klasik tidak mengikuti filosofi unix: memiliki utilitas sederhana melakukan pekerjaan yang didefinisikan dengan sangat baik.
sumber
Berikut adalah cara untuk melakukannya hampir murni di bash, hanya perlu 'bc' untuk matematika floating point.
Pemakaian:
Keluaran:
sumber
Memberi:
Sayangnya saya tidak tahu bagaimana cara mendapatkan akurasi dua desimal. Diuji pada Ubuntu 14.04.
sumber
@ don_crissti Jawaban pertama adalah baik, tetapi bisa lebih pendek menggunakan Here Strings , mis
atau bahkan
jika
<<<
tidak tersedia Anda dapat menggunakan missumber
Ada alat python
Saya tidak melihat flag --binary :(, jadi Anda harus menggunakan python langsung untuk representasi biner:
sumber
Aku punya masalah yang sama dan saya cepat datang dengan solusi sederhana menggunakan
awk
'slog()
fungsi:Dan presisi yang hilang dalam menggunakan angka float tidak terlalu buruk karena presisi itu akan hilang.
sumber
Jawaban atas pertanyaan Anda adalah ya.
Meskipun format output tidak sesuai dengan spesifikasi Anda, konversi itu sendiri mudah dilakukan oleh alat yang sangat standar (atau dua) . Yang saya maksud adalah
dc
danbc
. Anda bisa mendapatkan laporan tersegmentasi dengan mengubah radies output mereka. Seperti ini:... yang mencetak ...
Saya menggunakan di
dc
atas karena ini adalah favorit pribadi, tetapibc
dapat melakukan hal yang sama dengan sintaks yang berbeda dan mematuhi aturan format yang sama seperti yang ditentukan oleh POSIX seperti:bc
Obasebc
harus menulis angka desimal dua digit; untuk basis dari 101 hingga 1000, string desimal tiga digit, dan sebagainya. Misalnya, angka desimal 1024 dalam basis 25 akan ditulis sebagai:01 15 24
dan dalam basis 125, sebagai:
008 024
sumber
Solusi singkat dan manis, hanya shell:
Itu tidak menunjukkan ramuan desimal.
Ini
let VAR=expression
adalah Korn-ish. Pengganti denganVAR=$(( expression ))
untuk Born-again-ish.sumber
AFAIK tidak ada alat standar yang dapat digunakan untuk mengirim teks dan mengembalikan formulir yang dapat dibaca manusia. Anda mungkin dapat menemukan paket untuk menyelesaikan tugas tersebut untuk distro Anda.
Namun, saya tidak mengerti mengapa Anda membutuhkan alat seperti itu. Sebagian besar paket yang memberikan output terkait, biasanya memiliki saklar -h atau setara untuk output yang dapat dibaca manusia.
sumber