Як сортувати UNIX лише за одним стовпцем?


47

Я знаю, що опція -k для сортування Unix дозволяє нам сортувати за певним стовпцем та всім наведеним нижче . Наприклад, враховуючи вхідний файл:

2 3
2 2
1 2
2 1
1 1

Використовуючи sort -n -k 1, я отримую вихід, відсортований за першим стовпцем, а потім за другим:

1 1
1 2
2 1
2 2
2 3

Однак я хочу зберегти впорядкування 2-ої колонки, як це:

1 2
1 1
2 3
2 2
2 1

Це можливо за допомогою sortкоманди?

Відповіді:


65

Спробуйте:

sort -s -n -k 1,1

-sВідключає «остання інстанція» сортування, який сортує на все , що не є частиною зазначеного ключа.

-k 1Чи не на самому ділі означає «це поле і все наступні» в контексті числового роду, як ви можете побачити , якщо ви спробуєте розібратися на другій колонці. Ви просто бачите зв’язки, порушені, перейшовши на решту лінії. Загалом, однак, вам потрібно вказати -k 1,1для сортування лише в одному полі.


Ти правий. Це саме те, що мені було потрібно. Дякую!

чи можна використовувати приєднання на виході такого роду?
MiNdFrEaK

@MiNdFrEaK: Вимога joinполягає в тому, щоб вхід був сортований по полях, до яких ви приєднуєтесь. Тому впевнений, що цей вихід відсортований за першим полем, і ви можете приєднатися до нього.
Каскабель

У мене 2 файли, один має 2 стовпчики, інший - 1 стовпчик. Другий файл сортується за допомогою сортування -u. Тепер завдання полягає в тому, що мені потрібно з’єднати цей стовпець із першим стовпцем першого файлу, який не відсортований, так що буде синтаксисом? це буде працювати? приєднати -j 1 файл2.txt сортувати -s -n -k 1 файл1.txt?
MiNdFrEaK

1
-k 1,1(Далі «1 » частина) не працює краще для мене. Що працює -s -k 1, -nякщо вам це потрібно.
Тотор

10

Щоб сортувати лише перший колонку, ви повинні зробити:

sort -n -s -k1,1

З посібника з адміністрування систем Unix та Linux

sort приймає специфікацію ключа -k3 (а не -k3,3), але він, ймовірно, не робить те, що ви очікуєте. Без номера закінчувального поля ключ сортування продовжується до кінця рядка


Не працює для мене, мені потрібно додати -sваріант, як вказував Каскабель.
Жан Пол

@JeanPaul Ви маєте рацію, в документації для -sнаписано "Цей параметр підтримує оригінальний порядок записів записів із рівним ключем".
tidbeck

2

Жодна із наданих відповідей, як правило, не працює для мене.

І те, sort -s -k 2 file1і sort -n -k1,1додаткове сортування з цим файлом:

# cat file1
 3 3 5
 3 2 3
 1 4 7
 0 1 2
 3 2 1

Я просто повинен був зробити цю точну річ і в кінцевому підсумку використовував оболонку. Це рішення може не працювати в дуже великому файлі, оскільки весь файл потрібно прочитати для кожного унікального значення в відсортованому стовпці.

Тут файл відсортований лише у колонці 2.

# awk '{print $2}' file1 | sort | uniq | while read index
do  
    awk -v var=$index '$2 == var { print $0}' file1 
done
 0 1 2
 3 2 3
 3 2 1
 3 3 5
 1 4 7

sort -s -k2,2 file1
plhn

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