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

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

42 голоса | спросил ssn 31 PM00000080000002231 2009, 20:20:22

3 ответа


58

Попробуйте:

sort -s -n -k 1,1

-s отключает сортировку «last-resort», которая сортирует все, что не было частью указанного ключа.

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

ответил Cascabel 31 PM00000080000002731 2009, 20:28:27
10

Чтобы отсортировать только первый столбец, выполните следующие действия:

sort -n -k1,1

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

  

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

ответил tidbeck 16 +04002012-10-16T17:59:28+04:00312012bEurope/MoscowTue, 16 Oct 2012 17:59:28 +0400 2012, 17:59:28
2

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

Оба sort -s -k 2 file1 и sort -n -k1,1 do дополнительная сортировка с этим файлом:

# 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
ответил user680341 30 FriEurope/Moscow2016-12-30T20:47:12+03:00Europe/Moscow12bEurope/MoscowFri, 30 Dec 2016 20:47:12 +0300 2016, 20:47:12

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132