Как отсортировать строку, объединенную со строкой + числом, с помощью скрипта bash?

Как отсортировать строку, объединенную со строкой + числом, с помощью скрипта bash?

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

/home/files/profile1
/home/files/profile10
/home/files/profile11
/home/files/profile12
/home/files/profile14
/home/files/profile15
/home/files/profile16
/home/files/profile2
/home/files/profile3
/home/files/profile4
/home/files/profile5
/home/files/profile6
/home/files/profile7
/home/files/profile8
/home/files/profile9

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

/home/files/profile1
/home/files/profile2
/home/files/profile3
/home/files/profile4
/home/files/profile5
/home/files/profile6
/home/files/profile7
/home/files/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 здесь.

решение1

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

sort -V

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

решение2

Для разделения числа можно использовать временный символ-ограничитель:

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

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

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

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

решение3

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

sort -k 1.20n

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

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

Связанный контент