У вас есть поля в правильном порядке, но ваш первый оператор печати добавляет новую строку (разделитель выходной записи), поэтому ваши данные есть, но просто неожиданно упакованы.
Вторая проблема заключается в том, что вы указываете printf использовать ширину 4; который включает десятичную точку и две цифры после нее, оставляя только одну для ведущей цифры и ни одной для любого заполнения. Попробуйте использовать ширину 5, чтобы ваши данные были дополнены до четырех общих чисел. Если вы хотите, чтобы перед десятичной точкой было 4 цифры , вместо этого измените ширину на 7.
Это самое короткое изменение, которое я внес в вашу программу в то, что, как мне кажется, вы хотите:
awk -F"|" '{
format = "%05.2f,%05.2f,%05.2f";
print $1","$2","$3","$4"," sprintf(format, $5,$6,$7)}' filename
Я объединил несколько блоков {}
в один, а также объединил операторы печати в один.
Если бы мне пришлось написать ваш оператор awk с нуля, я мог бы сделать что-то вроде этого:
awk -v FS=\| -v OFS=, '{
$5=sprintf("%05.2f", $5);
$6=sprintf("%05.2f", $6);
$7=sprintf("%05.2f", $7);
print $1,$2,$3,$4,$5,$6,$7}' filename
Он явно устанавливает разделитель входных полей, разделитель выходных полей, явно преобразует каждое из полей отдельно, а затем печатает желаемые поля с разделением OFS.
Мое предположение будет следующим.
В какой-то момент вы уменьшили файловую систему NTFS, представленную здесь как /dev/sda5, чтобы у вас было место для установки Linux. Эта файловая система NTFS не была уменьшена правильно, и ее эквивалент суперблока все еще считает, что ей доступны все 440 ГБ.
Вам нужно запустить как минимум CHKDSK
или TESTDISK
, чтобы проверить и исправить несоответствие между размером файловой системы и размером раздела.
У меня точно такая же проблема, как у вас.
И я нашел решение:
Идея состоит в том, чтобы отключить том linux из Windows 10 с помощью команды diskpart.
Подробный ответ здесь: