Czy istnieje standardowe narzędzie, które konwertuje liczbę całkowitą bajtów na czytelną dla człowieka liczbę największej możliwej wielkości jednostki, przy zachowaniu wartości liczbowej między 1,00 a 1023,99?
Mam swój własny skrypt bash / awk, ale szukam standardowego narzędzia, które można znaleźć w wielu / większości dystrybucji ... coś bardziej ogólnie dostępnego i idealnie ma proste argumenty wiersza poleceń i / lub może przyjąć dane potokowe.
Oto kilka przykładów rodzaju wyników, których szukam.
1 Byt
173.00 KiB
46.57 MiB
1.84 GiB
29.23 GiB
265.72 GiB
1.63 TiB
Oto skrypt bajty-człowiek (używany do powyższego wyniku)
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 )
}'
Aktualizacja Oto zmodyfikowana wersja skryptu Gillesa , opisana w komentarzu do jego odpowiedzi .. (zmodyfikowana w celu dopasowania do mojego preferowanego wyglądu).
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}'
text-processing
utilities
units
Peter.O
źródło
źródło
standard tool
:)Odpowiedzi:
Nie, nie ma takiego standardowego narzędzia.
Ponieważ GNU coreutils 8.21 (luty 2013, więc nie jest jeszcze obecny we wszystkich dystrybucjach), w niewbudowanym systemie Linux i Cygwin możesz używać
numfmt
. Nie generuje dokładnie tego samego formatu wyjściowego (jak w Coreutils 8.23, nie sądzę, że można uzyskać 2 cyfry po przecinku).Wiele starszych narzędzi GNU może wytwarzać ten format, a sortowanie GNU może sortować liczby za pomocą jednostek od coreutils 7.5 (sierpień 2009, więc obecne w nowoczesnych, niewbudowanych dystrybucjach Linuksa).
Twój kod jest nieco zawiły. Oto czystsza wersja awk (format wyjściowy nie jest dokładnie identyczny):
( Przesłane z bardziej specjalistycznego pytania )
źródło
s
powinien być prowadzącyB
. Również ten ciąg znaków można łatwo zmienić na zapis binarny IEC. (2) Pomija zakres 1000-1023 na korzyść 1 <następny rozmiar> (łatwo zmienić) (3) Nie ma wartości dziesiętnych (których chcę). Znowu łatwo to zmienić. Podczas wyświetlania 2 miejsc po przecinku%f
format powoduje around-up
do <następnego rozmiaru> dla wartości 1019-1023 ; ale nie warto tego obejść. W mojej odpowiedzi zamieściłem zmodyfikowaną wersję w celach informacyjnych.du
liczby na format czytelny dla człowieka, pamiętaj, że konieczne może być dodanie--block-size=1
dodu
polecenia.Począwszy od v.
8.21
,coreutils
Obejmujenumfmt
:na przykład
Różne inne przykłady (w tym filtrowanie, przetwarzanie wejścia / wyjścia itp.) Są przedstawione TUTAJ .
Ponadto, począwszy od
coreutils
v.8.24
,numfmt
Może przetwarzać wiele pól ze specyfikacjami zakresu pól podobnymicut
i obsługuje ustawianie dokładności wyjściowej za pomocą--format
opcjinp.
źródło
Oto opcja tylko bash, brak
bc
innych wbudowanych funkcji, format dziesiętny i jednostki binarne.Przykłady:
Powinien działać dobrze na dowolnej wersji Bash (w tym Bash MSYSGit dla Windows).
źródło
Jest to kompletne przepisanie zainspirowane zmodyfikowaną wersją skryptu awk Gillesa autorstwa Peter.O.
Zmiany:
Kod:
Przypadki testowe (jeśli chcesz spojrzeć na wynik):
Cieszyć się!
źródło
perl
CPAN ma kilka modułów: Format :: Human :: Bytes i Number :: Bytes :: Human , ten ostatni jest nieco bardziej kompletny:I odwrotnie:
UWAGA: funkcja
parse_bytes()
została dodana w wersji 0.09 (2013-03-01)źródło
Via linux - Czy istnieje kalkulator linii poleceń do obliczeń bajtów? - Przepełnienie stosu , znalazłem informacje o jednostkach GNU - choć bez przykładów na stronie SO; a ponieważ nie widziałem go tutaj wymienionego, tutaj jest mała notka na ten temat.
Najpierw sprawdź, czy urządzenia są obecne:
Biorąc pod uwagę, że tak, wykonaj konwersję -
printf
specyfikatory formatu są akceptowane w celu sformatowania wyniku liczbowego:źródło
W rzeczywistości istnieje narzędzie, które właśnie to robi. Wiem, bo to ja nie napisałem tego. Został napisany dla * BSD, ale powinien zostać skompilowany w systemie Linux, jeśli masz biblioteki BSD (które moim zdaniem są powszechne).
Właśnie wydałem nową wersję, opublikowaną tutaj:
http://blog.frankleonhardt.com/2015/freebsd-hr-utility-human-readable-number-filter-man-page/
Nazywa się hr i pobiera standardowe wejście (lub pliki) i konwertuje liczby na format czytelny dla człowieka w sposób, który jest (teraz) dokładnie taki sam jak ls -h itd., I może wybierać pojedyncze kanały w liniach, skalować wstępnie skalowane jednostki (np. jeśli są w blokach 512-bajtowych, konwertują je na Mb itp.), dostosuj wypełnienie kolumn i tak dalej.
Napisałem to kilka lat temu, ponieważ myślałem, że próba napisania skryptu powłoki, chociaż interesująca intelektualnie, była również kompletnym szaleństwem.
Na przykład za pomocą hr możesz łatwo uzyskać posortowaną listę rozmiarów katalogów (które wychodzą w jednostkach 1Kb i wymagają konwersji przed konwersją) w następujący sposób:
du -d1 | sort -n | hr -sK
Podczas gdy du wytworzy wyjście -h, sortowanie nie będzie sortować według niego. Dodanie -h do istniejących narzędzi to klasyczny przypadek nieprzestrzegania filozofii unixowej: proste narzędzia wykonują określone zadania naprawdę dobrze.
źródło
Oto sposób na zrobienie tego prawie wyłącznie w bashu, po prostu potrzebuje „bc” dla matematyki zmiennoprzecinkowej.
Stosowanie:
Wynik:
źródło
Daje:
Niestety nie mogę wymyślić, jak uzyskać dokładność dwóch miejsc po przecinku. Testowane na Ubuntu 14.04.
źródło
Pierwsza odpowiedź @ don_crissti jest dobra, ale może być jeszcze krótsza przy użyciu Here Strings , np
lub nawet
jeśli
<<<
nie jest dostępny, możesz użyć npźródło
Istnieją narzędzia Python
Nie widzę flagi --binary :(, więc będziesz musiał użyć Pythona bezpośrednio do reprezentacji binarnej:
źródło
Miałem ten sam problem i szybko wyszedł z prostego rozwiązania, używając
awk
„slog()
funkcję:A precyzja utracona przy użyciu liczb zmiennoprzecinkowych nie jest taka zła, ponieważ i tak zostanie utracona.
źródło
Odpowiedź na twoje pytanie brzmi: tak.
Chociaż format wyjściowy nie jest dokładnie zgodny ze specyfikacją, samą konwersję można łatwo wykonać za pomocą bardzo standardowego narzędzia (lub dwóch) . Te, do których się odnoszę, to
dc
ibc
. Możesz uzyskać raport podzielony na segmenty, zmieniając ich wyjściowe wartości wyjściowe. Lubię to:... które drukuje ...
Używam
dc
powyżej, ponieważ jest to osobisty faworyt, alebc
może zrobić to samo z inną składnią i przestrzega tych samych reguł formatowania, które określono w POSIX, takich jak:bc
obasebc
należy wpisać dwucyfrowe liczby dziesiętne; dla zasad od 101 do 1000, trzycyfrowych ciągów dziesiętnych i tak dalej. Na przykład liczba dziesiętna 1024 w podstawie 25 byłaby zapisana jako:01 15 24
oraz w podstawie 125 jako:
008 024
źródło
Krótkie i słodkie rozwiązanie tylko w skorupkach:
Nie pokazuje mikstury dziesiętnej.
To
let VAR=expression
jest Korn-ish. ZamieńVAR=$(( expression ))
na Born-again-ish.źródło
AFAIK nie ma takiego standardowego narzędzia, do którego można przekazywać tekst, i zwraca postać czytelną dla człowieka. Być może będziesz w stanie znaleźć paczkę, aby wykonać wspomniane zadanie dla swojej dystrybucji.
Nie rozumiem jednak, dlaczego możesz potrzebować takiego narzędzia. Większość pakietów, które dają powiązane dane wyjściowe, zwykle ma przełącznik -h lub równoważny dla danych wyjściowych czytelnych dla człowieka.
źródło