Как отсортировать строку, которая сочетается со строкой + цифрой, используя скрипт bash?

27

Это данные, которые я хочу отсортировать. Но sortобрабатывает число в строку, данные не сортируются, как я ожидал.

/ home / файлы / profile1
/ home / файлы / profile10
/ home / файлы / profile11
/ home / файлы / profile12
/ home / файлы / profile14
/ home / файлы / profile15
/ home / файлы / profile16
/ home / файлы / profile2
/ home / files / profile3
/ home / files / profile4
/ home / files / profile5
/ home / files / profile6
/ home / files / profile7
/ home / files / profile8
/ home / files / profile9

Я хочу отсортировать это,

/ home / файлы / profile1
/ home / файлы / profile2
/ home / файлы / profile3
/ home / файлы / profile4
/ home / файлы / profile5
/ home / файлы / profile6
/ home / файлы / profile7
/ home / файлы / profile8
/ home / files / profile9
/ home / files / profile10
/ home / files / profile11
/ home / files / profile12
/ home / files / profile14
/ home / files / profile15
/ home / files / profile16

Есть ли хороший способ сценария bash? Я не могу использовать Ruby или Python скрипт здесь.

user760548
источник
попробуйте использовать "sort -nd"
bobah
1
@bobah, "sort: опции` -dn 'несовместимы "
maxschlepzig
10
sort -Vсделал бы.
Тор
2
@Thor. Ваш комментарий будет хорошим ответом
Peter.O
stackoverflow.com/questions/13088370/sort-numerically
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

Ответы:

21

Вы можете использовать временный символ стража, чтобы разделить число:

$ sed 's/\([0-9]\)/;\1/' log | sort -n -t\; -k2,2 | tr -d ';'

Здесь сторожевой символ ';' - оно не должно быть частью какого-либо имени файла, который вы хотите отсортировать, но вы можете поменять ';' с любым персонажем, который вам нравится. Вы должны изменить sed, sortа trзатем часть соответственно.

Канал работает следующим образом: sedкоманда вставляет страж перед любым числом, sortкоманда интерпретирует страж как разделитель полей, сортирует со вторым полем как числовой ключ сортировки, и trкоманда снова удаляет страж.

И logобозначает входной файл - вы также можете направить свой вход в sed.

maxschlepzig
источник
Мне нравится, как вы решили проблему :)
SHW
44

Это очень похоже на этот вопрос . Проблема в том, что у вас есть алфавитно-цифровое поле, по которому вы сортируете, и -nэто не обрабатывается разумно, как это -Vделает версия sort ( ). Таким образом используйте:

sort -V

Обратите внимание, что эта функция в настоящее время поддерживается реализациями сортировки GNU, FreeBSD и OpenBSD.

Тор
источник
Вы знаете, насколько это портативно? Эта опция не является частью спецификации POSIX.
Эрнест А
@ErnestA: Вы правы, это решение для сортировки GNU. Добавлена ​​заметка.
Тор
@ErnestA: Похоже, что FreeBSD и OpenBSD добавили эту функцию.
Тор
И это не сработает, если номера имеют разные префиксы.
Данте
1
Для любых читателей: обратите внимание, что это капитальный V! Используйте sort -Vне sort -v. Трудно сказать с первого взгляда.
Габриэль Стейплс
7

Если все имена файлов имеют одинаковый префикс перед конечной числовой частью, игнорируйте его при сортировке:

sort -k 1.20n

(20 - позиция первой цифры. Это один плюс длина /home/files/profile.)

Если у вас есть несколько разных нечисловых частей, введите часовой .

Жиль "ТАК - перестань быть злым"
источник