Ответ 1
Используйте параметр -k
(или --key=POS1[,POS2]
). Он может появляться несколько раз, и каждый ключ может иметь глобальные параметры (например, n
для числовой сортировки)
У меня есть потенциально большие файлы, которые нужно сортировать с помощью 1-n ключей. Некоторые из этих ключей могут быть числовыми, а некоторые из них могут отсутствовать. Это столбчатый файл с фиксированной шириной, поэтому нет разделителей.
Есть ли хороший способ сделать это с помощью Unix? С одним ключом это так же просто, как использовать '-n'. Я прочитал справочную страницу и вкратце искал Google, но не нашел хорошего примера. Как я могу это сделать?
Примечание. Я исключил Perl из-за потенциала размера файла. Это будет последнее средство.
Используйте параметр -k
(или --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 в первом поле.
(редактировать)
Пример (у меня есть DOS/cygwin):
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 сортируется.
Здесь вы можете отсортировать различные столбцы в файле 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 [email protected] -k1.1,1.4 -k1.5,1.7 ... <inputfile
будет работать лучше. @- разделитель полей, убедитесь, что это символ, который нигде не появляется. то ваш вход считается состоящим из одного столбца.
Изменить: очевидно, клинт уже дал аналогичный ответ, извините. Как он указывает, флаги "n" и "r" могут быть добавлены к каждой опции -k....
Обратите внимание, что также может потребоваться стабилизация сортировки с помощью переключателя -s
, так что одинаково ранжированные строки также сохраняют свой исходный относительный порядок на выходе.
Я просто хочу добавить несколько советов, когда вы используете сортировку, будьте осторожны с вашей локалью, которая влияет на порядок сравнения ключей. Я обычно явно использую LC_ALL = C, чтобы сделать локаль тем, что я хочу.