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



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



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



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

567   7  

7 ответов:

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

однако будьте осторожны:

Если вы хотите отсортировать файл в первую очередь по полю 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)

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

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

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

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

(edit)

пример (все, что у меня есть, это 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

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

вот один для сортировки различных столбцов в 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

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

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

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

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

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

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

Comments

    Ничего не найдено.