Используется awk
для создания дополнительных столбцов для ключей сортировки.Звонит du
только один раз.Вывод должен выглядеть точно так же, как du
.
. Я разбил его на несколько строк, но его можно объединить в одну строку.
du -h |
awk '{printf "%s %08.2f\t%s\n",
index("KMG", substr($1, length($1))),
substr($1, 0, length($1)-1), $0}' |
sort -r | cut -f2,3
Объяснение:
- BEGIN - создать строку для индексации, чтобы заменить 1, 2, 3 для K, M, G для группировки по единицам, если нет единицы (размер меньше 1 КБ), тогда совпадения нет, и возвращается ноль (идеально!)
- вывести новые поля - единица измерения, значение (для правильной работы альфа-сортировки она дополнена нулями, фиксирована)длина) и исходная строка
- индексировать последний символ поля размера
- вытащить числовую часть размера
- отсортировать результаты, отбросить лишние столбцы
Попробуйте без команды cut
посмотреть, что она делает.
Редактировать:
Вот версия, которая выполняет сортировку в скрипте AWK и ненужно сократить (требуется GNU AWK (gawk
) для поддержки asorti
):
du -h |
awk '{idx = sprintf("%s %08.2f %s",
index("KMG", substr($1, length($1))),
substr($1, 0, length($1)-1), $0);
lines[idx] = $0}
END {c = asorti(lines, sorted);
for (i = c; i >= 1; i--)
print lines[sorted[i]]}'