Сортировка нескольких ключей с помощью Unix sort - PullRequest
125 голосов
/ 10 декабря 2008

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

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

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

Ответы [ 7 ]

293 голосов
/ 15 июля 2011

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

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

sort -k 3 -k 2 < inputfile

вы хотите это вместо:

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

Первый сортирует файл по строке от начала поля 3 до конца строки (которая потенциально уникальна).

-k, --key=POS1[,POS2]     start a key at POS1 (origin 1), end it at POS2
                          (default end of line)
91 голосов
/ 11 декабря 2008

Опция -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.

66 голосов
/ 10 декабря 2008

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

21 голосов
/ 08 марта 2014

Здесь можно отсортировать различные столбцы в 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
11 голосов
/ 11 декабря 2008

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

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

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

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

5 голосов
/ 30 августа 2011

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

2 голосов
/ 30 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...