використовувати сортування GNU для сортування за однією клавішею / запобігання небажаного сортування інших клавіш


9

У мене є файл, який містить уже впорядковані дані, і я хотів би повторно замовити файл відповідно до значень однієї клавіші, не руйнуючи порядок даних в інших клавішах.

Як я можу запобігти сортуванню GNU виконувати сортування рядків на основі значень ключових даних, які я не вказав, або як вказати для сортування GNU, щоб ігнорувати діапазон клавіш при сортуванні?

Файл data.txt:

1 Don't
2 C 
1 Sort
2 B
1 Me
2 A

Очікуваний вихід:

1 Don't
1 Sort
1 Me
2 C
2 B
2 A

Команда:

sort -k 1,1 <data.txt

Результат: небажане сортування: я не просив:

1 Don't
1 Me
1 Sort
2 A
2 B
2 C

Відповіді:


21

Вам потрібен стабільний сорт . Від man sort:

-s, --stable
       stabilize sort by disabling last-resort comparison

саме:

$ sort -sk 1,1 <data.txt
1 Don't
1 Sort
1 Me
2 C 
2 B
2 A

Зверніть увагу , що ви , ймовірно , також хочете -nабо --numeric-sortякщо ваш ключ Числовий (наприклад, ви можете отримати несподівані результати при порівнянні 10 до 2 з за замовчуванням - лексико - порядок сортування). У такому випадку це просто питання:

sort -sn <data.txt

Не потрібно витягувати перше поле, оскільки числова інтерпретація всього рядка буде такою ж, як і першого поля.



Я читав документи, але правильне визначення поняття "стабільний" ухилявся від моєї уваги. Дякуємо за швидку, лаконічну та добре цитовану відповідь. Перший ключ реальних даних - це локалізований рядок, тому числовий для мене не працює.
Віл

4

Для (не GNU) sortреалізації, у яких відсутній -sваріант, ви завжди можете зробити:

<data.txt awk '{print NR "\t" $0}' | sort -n -k 2,2 -k 1,1 | cut -f 2-

Тобто, додайте номер рядка, щоб він став другим ключем сортування, і зніміть його після цього.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.