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