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

<p>у меня есть потенциально большие файлы, которые нужно отсортировать по 1-n ключам. некоторые из этих ключей могут быть числовыми, а некоторые - нет. это столбчатый файл с фиксированной шириной, поэтому разделителей нет.</p><p>есть ли хороший способ сделать это с сортировкой unix? с одним ключом это так же просто, как с помощью '-n'. я прочитал справочную страницу и немного поискал в google, но не нашел хорошего примера. как бы я пошел для достижения этой цели?</p><p>примечание: я исключил perl из-за потенциального размера файла. это было бы последнее средство.</p>

<p>используйте параметр <code>-k</code> (или <code>--key=pos1[,pos2]</code>). он может появляться несколько раз, и каждый ключ может иметь глобальные параметры (например, <code>n</code> для числовой сортировки)</p>

<p>будьте осторожны, хотя:</p><p>если вы хотите отсортировать файл в основном по полю 3, а затем по полю 2, вам не нужно:</p><pre><code>sort -k 3 -k 2 < inputfile </code></pre><p>вы хотите это вместо этого:</p><pre><code>sort -k 3,3 -k 2,2 < inputfile </code></pre><p>первый сортирует файл по строке от начала поля 3 до конца строки (которая потенциально уникальна).</p><pre><code>-k, --key=pos1[,pos2] start a key at pos1 (origin 1), end it at pos2 (default end of line) </code></pre>

<p>опция -k - это то, что вы хотите.</p><pre><code>-k 1.4,1.5n -k 1.14,1.15n </code></pre><p>использовать позиции символов 4-5 в первом поле (это все одно поле для фиксированной ширины) и сортировать численно в качестве первого ключа.</p><p>второй ключ будет также символами 14-15 в первом поле.</p><p>(правка)</p><p>пример (все, что у меня есть, это dos/cygwin handy):</p><pre><code>dir | \cygwin\bin\sort.exe -k 1.4,1.5n -k 1.40,1.60r </code></pre><p>для данных:</p><pre><code>12/10/2008 01:10 pm 1,564,990 outfile.txt </code></pre><p>сортирует список каталогов по номеру месяца (поз. 4-5) по номерам, а затем по имени файла (поз. 40-60) в обратном порядке. поскольку вкладок нет, все поле 1 нужно отсортировать.</p>

<p>здесь можно отсортировать различные столбцы в csv-файле по числовому и словарному порядку, столбцы 5 и после по словарному порядку.</p><pre><code>~/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 </code></pre><p>обратите внимание, что -k1,1n означает числовое значение, начинающееся в столбце 1 и заканчивающееся в столбце 1. если бы я сделал это ниже, он бы объединял столбцы 1 и 2, в результате чего 1,10 сортировался бы как 110</p><pre><code>~/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 </code></pre>

<p>я верю в вашем случае что-то вроде</p><pre><code>sort -t@ -k1.1,1.4 -k1.5,1.7 ... <inputfile </code></pre><p>будет работать лучше. @ - это разделитель полей, убедитесь, что это символ, который нигде не отображается. тогда ваш вход считается состоящим из одного столбца.</p><p>правка: по-видимому, clintp уже дал аналогичный ответ, извините. как он указывает, флаги 'n' и 'r' могут быть добавлены к каждому параметру -k ....</p>

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

<p>я просто хочу добавить несколько советов, когда вы используете сортировку, будьте осторожны с вашим языком, который влияет на порядок сравнения ключей. я обычно явно использую lc\_all = c, чтобы сделать локаль того, что я хочу.</p>