Как UNIX сортировать только по одному столбцу?


47

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

2 3
2 2
1 2
2 1
1 1

Используя sort -n -k 1, я получаю вывод, отсортированный по 1-му столбцу, а затем по 2-му:

1 1
1 2
2 1
2 2
2 3

Тем не менее, я хочу сохранить порядок второго столбца, например:

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 file2.txt sort -s -n -k 1 file1.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сказано: «Эта опция поддерживает исходный порядок записей записей с одинаковым ключом».
Тидбек

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.