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

116109
ssn

Я знаю, что опция -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команды?

43

3 ответа на вопрос

59
Cascabel

Попробуйте это:

sort -s -n -k 1,1 

-sОтключает «последняя инстанция» сортировка, который сортирует на все, что не является частью указанного ключа.

-k 1Не на самом деле означает «это поле и все следующие» в контексте числового рода, как вы можете увидеть, если вы попытаетесь разобраться на второй колонке. Вы просто видите разрыв связей, переходя к остальной части линии. В общем, однако, вам нужно указать -k 1,1сортировку только по первому полю.

Вы правы. Это именно то, что мне было нужно. Спасибо! 14 лет назад 0
Можно ли использовать соединение на выходе такого рода? MiNdFrEaK 11 лет назад 0
@MiNdFrEaK: Требование `join` состоит в том, чтобы входные данные сортировались по полям, к которым вы присоединяетесь. Так что этот вывод отсортирован по первому полю, и вы можете присоединиться к нему. Cascabel 11 лет назад 0
У меня есть 2 файла, один из которых имеет 2 столбца, другой имеет 1 столбец. Второй файл отсортирован с помощью сортировки -u. Теперь задача состоит в том, чтобы соединить этот столбец с первым столбцом первого файла, который не отсортирован, так какой будет синтаксис? это будет работать? объединить -j 1 file2.txt sort -s -n -k 1 file1.txt? MiNdFrEaK 11 лет назад 0
@MiNdFrEaK: Если у вас есть совершенно отдельный вопрос, задавайте его отдельно. Этот вопрос касается сортировки файла определенным образом, а не о том, как работает `join`. Cascabel 11 лет назад 0
Ваш ответ правильный при использовании числовой сортировки. Но это вводит в заблуждение иначе. Пожалуйста, обновите его следующим образом, чтобы ни у кого не возникало проблем `-s -n -k 1,1`. palindrom 10 лет назад 0
`-K 1,1` (часть" **, 1 ** ") не работает для меня лучше. То, что работает, это `-s -k 1`, с` -n`, если вам это нужно. Totor 10 лет назад 1
10
tidbeck

Для сортировки только по первому столбцу вы должны сделать:

sort -n -k1,1 

Из Руководства по системному администрированию Unix и Linux

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

2
user680341

Ни один из приведенных ответов не работает вообще для меня.

Оба 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 '' 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 7 лет назад 0