Сортировка нескольких ключей с помощью Unix sort

У меня есть потенциально большие файлы, которые нужно отсортировать по 1-n ключам. Некоторые из этих клавиш могут быть числовыми, а некоторые - нет. Это столбчатый файл с фиксированной шириной, поэтому разделителей нет.

Есть ли хороший способ сделать это с помощью сортировки Unix? С одним ключом это так же просто, как использовать '-n'. Я прочитал справочную страницу и немного поискал в Google, но не нашел хорошего примера. Как бы я пошел для достижения этой цели?

Примечание: я исключил Perl из-за потенциального размера файла. Это было бы последнее средство.

10.12.2008 20:48:39
Одна или две строки примера данных были бы действительно полезны для создания примера командной строки. Кроме того, ключи "1-n" означают, что вам нужно сортировать по переменному количеству ключей? Делать это без сценариев будет весело ...
Ken Gentle 10.12.2008 20:58:55
У меня есть PHP-оболочка для команды сортировки, чтобы включить функцию 1-n.
Chris Kloberdanz 10.12.2008 21:28:29
7 ОТВЕТОВ
РЕШЕНИЕ

Используйте -kопцию (или --key=POS1[,POS2]). Он может появляться несколько раз, и каждый ключ может иметь глобальные параметры (например, nдля числовой сортировки).

69
10.12.2008 20:54:59
На странице справки по сортировке: «POS - это F [.C] [OPTS], где F - номер поля, а C - позиция символа в поле; оба - начало 1». Смотрите man-страницу для полной документации.
Adam Rosenfield 10.12.2008 20:59:50
Также посмотрите ответ Андраса, если вы не хотите сойти с ума.
ron 30.08.2011 08:54:25
Оба комментария выше точны и аддитивны. Спасибо, господа.
Ken Gentle 11.12.2012 04:26:34

Опция -k - это то, что вы хотите.

-k 1.4,1.5n -k 1.14,1.15n

Использовал бы позиции символов 4-5 в первом поле (это все одно поле для фиксированной ширины) и сортировал бы численно в качестве первого ключа.

Второй ключ будет также символами 14-15 в первом поле.

(редактировать)

Пример (все, что у меня есть, это DOS / Cygwin Handy):

dir | \cygwin\bin\sort.exe -k 1.4,1.5n -k 1.40,1.60r

для данных:

12/10/2008  01:10 PM         1,564,990 outfile.txt

Сортирует список каталогов по номеру месяца (поз. 4-5) по номерам, а затем по имени файла (поз. 40-60) в обратном порядке. Поскольку вкладок нет, все поле 1 нужно отсортировать.

94
6.09.2013 11:12:17
Это только одно поле, если во входных данных нет пробелов. Тем не менее, ваш пример полезен.
Jonathan Leffler 11.12.2008 06:05:02
Исправление: если во входных данных нет / tabs /. В выводе команды DOS 'dir' нет вкладок.
Clinton Pierce 11.12.2008 16:24:40
Примеры того, как использовать опции (числовые, обратные), чрезвычайно полезны, так как практически невозможно узнать, как их использовать, просто на странице руководства, а другие ответы не упоминали об этом. Я бы хотел +2 за это. ;)
msb 21.10.2013 18:46:01

Я верю в вашем случае что-то вроде

sort -t@ -k1.1,1.4 -k1.5,1.7 ... <inputfile

будет работать лучше. @ - это разделитель полей, убедитесь, что это символ, который нигде не отображается. тогда ваш вход считается состоящим из одного столбца.

Редактировать: по-видимому, clintp уже дал аналогичный ответ, извините. Как он указывает, флаги 'n' и 'r' могут быть добавлены к каждой опции -k ....

12
10.12.2008 21:11:40
Даже если разделитель по умолчанию, соответствующий docs gnu.org/software/coreutils/manual/html_node/…, является пробелом, иногда количество полей не соответствует ожидаемому. Возможно, как уже говорили другие, из-за настройки языка LC_CTYPE. Если есть сомнения, считайте с начала строки!
Brad Dre 12.11.2019 19:10:30

Будьте осторожны, хотя:

Если вы хотите отсортировать файл в первую очередь по полю 3, а во вторую очередь по полю 2, вам нужно это:

sort -k 3,3 -k 2,2 < inputfile

Не это: sort -k 3 -k 2 < inputfile сортирует файл по строке от начала поля 3 до конца строки (что потенциально уникально).

-k, --key=POS1[,POS2]     start a key at POS1 (origin 1), end it at POS2
                          (default end of line)
309
20.01.2020 17:12:17
Жизнь меняется. Спасибо.
davidtbernal 6.08.2014 16:26:24
Упс! Теперь я должен исправить скрипт, потому что раньше я видел только первый ответ выше ... хорошо, что я еще не зависел от вывода скрипта ....
Wildcard 5.11.2015 06:22:03
Ницца! Теперь, что, если я хочу, чтобы fleld 3 был отсортирован по номерам и обратно, тогда как поле 2 должно быть отсортировано не по номерам, а в обычном порядке (по возрастанию)? :)
Arun 16.02.2017 13:46:27
@Arun POS объясняется в конце справочной страницы. Вы просто добавляете варианты заказа к номеру поля следующим образом:sort -k 3,3nr -k 2,2
andras 4.08.2017 15:03:00
Aargh. Какой -k2должен быть нелогичный интерфейс: -k2,2запятая -k2,должна быть «волшебный конец строки по умолчанию или что-то еще».
android.weasel 21.11.2017 08:35:11

Обратите внимание, что может также потребоваться стабилизировать сортировку с помощью -sпереключателя, чтобы строки с одинаковым ранжированием также сохраняли свой исходный относительный порядок в выходных данных.

5
30.08.2011 08:52:27

Я просто хочу добавить несколько советов, когда вы используете сортировку, будьте осторожны с вашей локалью, которая влияет на порядок сравнения ключей. Я обычно явно использую LC_ALL = C, чтобы сделать локаль, что я хочу.

2
30.12.2011 16:08:04
LC_ALL = C также может привести к значительному ускорению!
mat kelcey 11.02.2013 18:54:04

Здесь можно отсортировать различные столбцы в CSV-файле по числовому и словарному порядку, столбцы 5 и после как словарный порядок

~/test>sort -t, -k1,1n -k2,2n -k3,3d -k4,4n -k5d  sort.csv
1,10,b,22,Ga
2,2,b,20,F
2,2,b,22,Ga
2,2,c,19,Ga
2,2,c,19,Gb,hi
2,2,c,19,Gb,hj
2,3,a,9,C

~/test>cat sort.csv
2,3,a,9,C
2,2,b,20,F
2,2,c,19,Gb,hj
2,2,c,19,Gb,hi
2,2,c,19,Ga
2,2,b,22,Ga
1,10,b,22,Ga

Обратите внимание, что -k1,1n означает числовое значение, начинающееся в столбце 1 и заканчивающееся в столбце 1. Если бы я сделал это ниже, он бы объединял столбцы 1 и 2, в результате чего 1,10 сортировался бы как 110

~/test>sort -t, -k1,2n -k3,3 -k4,4n -k5d  sort.csv
2,2,b,20,F
2,2,b,22,Ga
2,2,c,19,Ga
2,2,c,19,Gb,hi
2,2,c,19,Gb,hj
2,3,a,9,C
1,10,b,22,Ga
22
16.10.2016 15:39:07
Это лучший ответ, потому что он показывает, как использовать разные переключатели для разных столбцов
xaxa 13.01.2016 15:58:31