Як сортувати рядок, який поєднується з рядком + числовим за допомогою bash script?


27

Це дані, які я хочу сортувати. Але sortтрактує числовий рядок, дані його не сортували, як я очікував.

/ Головна / файли / profile1
/ головна / файли / profile10
/ головна / файли / profile11
/ головна / файли / profile12
/ головна / файли / profile14
/ головна / файли / profile15
/ головна / файли / profile16
/ головна / файли / PROFILE2
/ будинку / файли / profile3
/ home / файли / 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 / files / profile6
/ home / files / profile7
/ home / files / profile8
/ home / файли / profile9
/ головна / файли / profile10
/ головна / файли / profile11
/ головна / файли / profile12
/ головна / файли / profile14
/ головна / файли / profile15
/ головна / файли / profile16

Чи є хороший спосіб за допомогою сценарію bash? Я не можу тут використовувати сценарій рубіну чи пітона.


спробуйте скористатись "сортувати

1
@bobah, "сортування: параметри` -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не розглядаєте це розумно, як би не було версія sort ( -V). Таким чином використовуйте:

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.