Как отсортировать строку, которая сочетается со строкой + цифрой, используя скрипт 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 скрипт здесь.


попробуйте использовать "sort -nd"
bobah

1
@bobah, "sort: опции` -dn 'несовместимы "
maxschlepzig

10
sort -Vсделал бы.
Тор

2
@Thor. Ваш комментарий будет хорошим ответом
Peter.O

Ответы:


21

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

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

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

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

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


Мне нравится, как вы решили проблему :)
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.)

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.