Это данные, которые я хочу отсортировать. Но 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
.)
Если у вас есть несколько разных нечисловых частей,вставить дозорный.