У меня есть потенциально большие файлы, которые нужно отсортировать по 1-n ключам. Некоторые из этих ключей могут быть числовыми, а некоторые - нет. Это столбчатый файл с фиксированной шириной, поэтому разделителей нет.
Есть ли хороший способ сделать это с помощью сортировки Unix? С одним ключом это так же просто, как использовать '-n'. Я прочитал справочную страницу и немного поискал в Google, но не нашел хорошего примера. Как бы я пошел для достижения этой цели?
Примечание: я исключил Perl из-за потенциального размера файла. Это было бы последнее средство.
Ответы:
Используйте
-k
опцию (или--key=POS1[,POS2]
). Он может появляться несколько раз, и каждый ключ может иметь глобальные параметры (например,n
для числовой сортировки).источник
Будьте осторожны, хотя:
Если вы хотите отсортировать файл в основном по полю 3, а во вторую очередь по полю 2, вы хотите это:
Не это:
sort -k 3 -k 2 < inputfile
сортирует файл по строке от начала поля 3 до конца строки (что потенциально уникально).источник
sort -k 3,3nr -k 2,2
-k2
должен быть нелогичный интерфейс:-k2,2
запятая-k2,
должна быть «магический конец строки по умолчанию или что-то еще».Опция -k - это то, что вы хотите.
Будет использовать позиции символов 4-5 в первом поле (это все одно поле для фиксированной ширины) и числовой сортировки в качестве первого ключа.
Второй ключ будет также символами 14-15 в первом поле.
(редактировать)
Пример (все, что у меня есть, это DOS / Cygwin Handy):
для данных:
Сортирует список каталогов по номеру месяца (поз. 4-5), а затем по имени файла (поз. 40-60) в обратном порядке. Поскольку вкладок нет, все поле 1 нужно отсортировать.
источник
Здесь можно отсортировать различные столбцы в CSV-файле по числовому и словарному порядку, столбцы 5 и после по словарному порядку.
Обратите внимание, что -k1,1n означает числовое значение, начинающееся в столбце 1 и заканчивающееся в столбце 1. Если бы я сделал это ниже, он бы объединял столбцы 1 и 2, в результате чего 1,10 сортировался бы как 110
источник
Я верю в вашем случае что-то вроде
будет работать лучше. @ - это разделитель полей, убедитесь, что это символ, который нигде не отображается. тогда ваш вход считается состоящим из одного столбца.
Редактировать: по-видимому, clintp уже дал аналогичный ответ, извините. Как он указывает, флаги 'n' и 'r' могут быть добавлены к каждой опции -k ....
источник
Обратите внимание, что может также потребоваться стабилизировать сортировку с помощью
-s
переключателя, чтобы строки с одинаковым ранжированием также сохраняли свой исходный относительный порядок в выходных данных.источник
Я просто хочу добавить несколько советов, когда вы используете сортировку, будьте осторожны с локалью, которая влияет на порядок сравнения ключей. Я обычно явно использую LC_ALL = C, чтобы сделать локаль тем, что я хочу.
источник