Сортуйте дані у порядку зменшення першого стовпця, для рівних значень використовуйте другий стовпчик у порядку зростання


22

Дозвольте мені уточнити:

Припустимо, у мене є кілька ключових слів з частотою їх використання:

12 Hi
7  Hash
7  C++  
9  Superuser
17 Stackoverflow
9  LaTeX  
42 Life
9  Ubuntu

Що я хочу, це сортувати ці дані на основі частоти у порядку зменшення, і якщо є деякі рівні значення, він повинен використовувати другий стовпчик у порядку зростання.

sort -n -r foo.txt

Чи є також перша частина, а потім друга колонка reversed:

42 Life
17 Stackoverflow
12 Hi
9  Ubuntu
9  Superuser
9  LaTeX  
7  Hash
7  C++

Як я можу досягти таких результатів?

42 Life
17 Stackoverflow
12 Hi
9  LaTeX  
9  Superuser
9  Ubuntu
7  C++ 
7  Hash

Я думаю, що я повинен використовувати -kаргумент, але я не можу зрозуміти, як!

Я хочу знати, як це можна зробити, використовуючи виключно sortкоманду bash. Однак якщо досягти цього неможливо лише sortіншими командами, має бути сумісна оболонка Bourne.


[Дещо OT]: хоча еквівалентний для даних конкретних даних, використання параметра GNU-сортування -g(загальне числове) замість -nчислових порівнянь безпечніше: воно працює правильно як для плаваючої точки, так і для цілих чисел.
аріельф

Відповіді:


32

Вкажіть ключі сортування окремо з критеріями:

sort -k1,1nr -k2,2 inputfile

Це вказує, що перша клавіша сортується чисельно у зворотному порядку, а друга сортується за порядком сортування за замовчуванням .

Цитування з типу POSIX :

-k keydef

Аргумент keydef - це обмежене визначення ключового поля сортування. Формат цього визначення:

field_start [ type ] [ , field_end [ type ]]

де field_start і field_end визначають ключове поле, обмежене частиною рядка (див. розділ ДОПОВНЕНОГО ОПИСАННЯ ), а тип - модифікатор зі списку символів 'b', 'd', 'f', 'i', ' n ',' r '. Модифікатор 'b' поводиться як -bопція, але застосовується лише до field_start або field_end, до якого він приєднаний. Інші модифікатори поводяться як відповідні параметри, але застосовуються лише до ключового поля, до якого вони приєднані; вони матимуть цей ефект, якщо вказано з field_start , field_end або обома.жоден варіант не застосовується до жодного. Реалізація повинна підтримувати щонайменше дев'ять випадків -kвибору, що має бути важливим для порядку командного рядка. Якщо -kпараметр не вказаний, використовується ключ сортування за замовчуванням для всього рядка.

Якщо є кілька ключових полів, пізніші ключі порівнюються лише після того, як всі попередні ключі порівнюються рівними. За виключення випадків, коли -uзазначений параметр, рядки, в іншому випадку порівняння одно повинні бути замовлені як якщо жоден з варіантів -d, -f, -i, -n, або -kбули присутні (але все -r ще в силі, якщо він був вказаний) і з усіма байтами в лініях , які є значущими для порівняння. Порядок, в якому записуються рядки, які все ще порівнюють рівні, не визначений.

Це призведе до:

42 Life
17 Stackoverflow
12 Hi
9  LaTeX
9  Superuser
9  Ubuntu
7  C++
7  Hash

Спасибі. Зробив трюк. Доведеться почекати 10 хвилин, щоб прийняти!
Пуя

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