Использование сортировки для ранжирования столбца по его размеру - PullRequest
0 голосов
/ 28 июня 2009

Мне нужна твоя помощь. Позвольте мне сказать вам, в чем моя проблема. У меня есть текстовый файл следующим образом:

Music 3.6G
Other 254.5M
Videos 4.6G
Games 1.3G
Apps 10.1G

Как видите, файл имеет два столбца, которые состоят из имен каталогов и их соответствующих размеров.

Что я хочу сделать, это отсортировать этот файл по размеру каталога в порядке убывания, например:

Apps 10.1G
Videos 4.6G
Music 3.6G
Games 1.3G
Other 254.5M

Есть ли способ достичь этого? Есть ли для этого однострочная команда?

СПАСИБО.

Ответы [ 5 ]

1 голос
/ 28 июня 2009

Вам необходимо нормализовать размер перед сортировкой. Самый простой способ сделать это - использовать язык программирования, такой как Perl или Python, но вы уже заявили, что это не вариант (хотя я нахожу странным, что Perl еще нет на компьютере). Вы можете использовать шелл-код для нормализации этих данных, но это неприятно:

#!/bin/bash

ECHO=/bin/echo
TR=/usr/bin/tr
BC=/usr/bin/bc

while read dir size; do
    bytes=`$ECHO $size | $TR -d "[A-Z]"`
    case $size in
        *B) bytes=$bytes                                      ;;
        *K) bytes=`$ECHO "$bytes * 1024" | $BC`               ;;
        *M) bytes=`$ECHO "$bytes * 1024 * 1024" | $BC`        ;;
        *G) bytes=`$ECHO "$bytes * 1024 * 1024 * 1024" | $BC` ;;
        *) $ECHO unknown size type                            ;;
    esac
    echo $bytes $dir $size
done < $1

Этот сценарий оболочки принимает имя файла в качестве аргумента и выводит нормализованный размер, имя каталога и размер. Это облегчает сортировку. Чтобы вернуть исходные поля, вы можете просто обрезать первое поле:

./mk_sortable.sh file_to_sort | sort -nr | cut -f2- -d" "

Для тех, кто обращает внимание, да, я только что написал преобразование Шварца в оболочке.

0 голосов
/ 28 июня 2009

По сути, вы должны дегуманизировать числа, отсортировать по нечеловеческим числам, а затем удалить нечеловеческие числа из выходных данных. Хотя вы, вероятно, можете сделать это в одну строку (особенно если вы пишете скрипт, который сделает это за вас), я думаю, что для понимания понадобятся несколько строк.

Как отметил Дракоша, Как я могу отсортировать вывод 'du -h' по размеру , довольно неплохо решает проблемы.

0 голосов
/ 28 июня 2009

Использование Perl:

perl -nle'$G{$2}=$1 if/(\w+) (\d+\.?\d*)G/;$M{$2}=$1 if/(\w+) (\d+\.?\d*)M/;$K{$2}=$1 if/(\w+) (\d+\.?\d*)K/;END{print"$G{$_} ${_}G"for sort{$b<=>$a}keys%G;print"$M{$_} ${_}M"for sort{$b<=>$a}keys%M;print"$K{$_} ${_}K"for sort{$b<=>$a}keys%K;}' filename

Здесь filename - файл, который содержит вышеуказанные данные. Вышеуказанный однострочный блок заботится о единицах G, M и K.

Еще одна более короткая реализация, использующая eval:

perl -nle'/(\w+) (\d+\.?\d*)(\w)/;eval"\$\$3{$2} = $1";END{for$u qw(G M K){eval"print\"\$\$u{$_} $_$u\""for sort{$b<=>$a}keys%{$u}}}' filename
0 голосов
/ 28 июня 2009
sort -n -r -k 2,2 file.txt

-k 2,2 означает использование второго поля в файле в качестве поля сортировки. По умолчанию сортировка использует пробелы для разделения полей. Это может не сработать, если суффиксы в полях (G в вашем примере для гигабайт) отличаются.

0 голосов
/ 28 июня 2009

Проверьте справочную страницу сортировки.

Для сортировки файла ниже по третьему полю (код города):
Джим Алчин 212121 Сиэтл
Билл Гейтс 404404 Сиэтл
Стив Джобс 246810 Невада
Скотт Нелли 212277 Лос-Анджелес
$ sort -k 3,3 people.txt> sorted.txt

Сортировка по убыванию (обратному) порядку:
$ sort -nr

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...