2009-08-31 16:20:22 +0000 2009-08-31 16:20:22 +0000
48
48
Advertisement

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

Advertisement

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

Однако, я хочу сохранить порядок со 2-ым столбцом, вот так:

1 2
1 1
2 3
2 2
2 1

Это возможно с помощью команды sort?

Advertisement
Advertisement

Ответы (3)

68
68
68
2009-08-31 16:28:27 +0000

Попробуй:

sort -s -n -k 1,1

-s отключает сортировку ‘lastt-resort’, которая сортирует все, что не являлось частью указанного ключа.

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

10
10
10
2012-10-16 13:59:28 +0000

Чтобы сортировать только по первой колонке, нужно сделать это:

sort -n -s -k1,1

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

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

2
Advertisement
2
2
2016-12-30 17:47:12 +0000
Advertisement

Ни один из предоставленных ответов не подходит мне в целом.

И 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
Advertisement

Похожие вопросы

10
37
7
14
3
Advertisement
Advertisement