44

Я знаю, что опция -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 ответа3

60

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

sort -s -n -k 1,1

Параметр -s отключает сортировку «в крайнем случае», которая сортирует все, что не является частью указанного ключа.

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

10

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

sort -n -s -k1,1

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .