Из страницы справочника:
-x Two-byte hexadecimal display. Display the input offset in hexa‐
decimal, followed by eight, space separated, four column, zero-
filled, two-byte quantities of input data, in hexadecimal, per
line.
...
If no format strings are specified, the default display is equivalent to
specifying the -x option.
Ваш вывод является прямым порядком байтов (младший значащий байт сначала), который является также порядком байтов x86 и x86_64 архитектуры, которую Вы, вероятно, используете.
awk
имеет функцию sprintf, которая предоставляет Вам доступ к printf "f" спецификатор формата.
echo .123456 | awk '{ print sprintf("%.9f", $1); }'
производит
0.123456000
Для управления форматированием вывода, можно использовать printf
любой непосредственно от awk
или непосредственно через оболочку.
Однако можно также управлять выводом непосредственно с помощью du
. Например, можно указать -h
производить результаты в человекочитаемых форматах.
$ du -h --max-depth=1 /home/saml/apps | tail -1
9.0G /home/saml/apps
$ du -h --max-depth=1 /home/saml/apps/gCAD3D | tail -1
1.1M /home/saml/apps/gCAD3D
Но поскольку Вы заметили потерю разрешения с этим методом. Таким образом, если Вы действительно хотите сохранить более высокую степень разрешения, Вы вынуждены принять значения от du
на более низком уровне, и затем форматируют вывод для установки, какие еще высокоуровневые единицы Вы хотите.
В использовании МБ du
.
$ du -m --apparent-size --max-depth=1 /home/saml/apps | tail -1
8916 /home/saml/apps
Используя awk
+ printf
.
$ DIVISOR=10487600
$ du --apparent-size --max-depth=1 /home/saml/apps | \
tail -1 | awk -v D=$DIVISOR '{printf "%.9f\n", $1/D}'
0.870499638
Можно управлять суммой точности, которую Вы хотите путем изменения аргумента printf
. Вот 5 мест.
$ DIVISOR=10487600
$ du --apparent-size --max-depth=1 /home/saml/apps | \
tail -1 | awk -v D=$DIVISOR '{printf "%.5f\n", $1/D}'
0.87050
Заметьте, что это заботится раунду он правильно, где когда-либо Вы решаете отключить точность.