Запутался в GNU `sort (1)` числового подполя - PullRequest
3 голосов
/ 30 мая 2010

Я хочу отсортировать пробел, разделенный table, с числовым значением, найденным во 2-м поле. Я могу предположить, что 2-е поле всегда fooN, но длина N неизвестна:

antiq. foo11 girls
colleaguing foo2 Leinsdorf
Cousy foo0 Montgomeryville
bowlegged foo1 pollack
Chevrier foo10 ill-conceived
candlebomb foo3 seventieths
autochthony foo101 re-enable
beneficiate foo100 osteometric

Я прочитал man sort(1) и поиграл со всеми возможными вариантами. В моей системе я нашел строку:

sort -n -k2.5 table

на работу.

У меня вопрос почему?

Согласно справочной странице:

-k, --key=POS1[,POS2]
   start a key at POS1, end it at POS 2 (origin 1) 
...
POS is F[.C][OPTS], where F is the field number and C the characterposition in the
field. OPTS is one or more single-letter ordering options, which override global
ordering options for that key. If no key is given, use the entire line as the key. 

Так почему sort -n -k2.4 таблица не работает, а sort -n -k2.5 работает?

Ответы [ 2 ]

1 голос
/ 30 мая 2010

Ответ: начальные пробелы считаются частью поля , если:

sort -b -n -k2.4 table

или любопытно:

LC_ALL=C sort -t" " -n -k2.4 table

, что также дает правильный результат.


... и еще одна вещь ...

Похоже, что лучше использовать:

sort -b -n -k2.4,2 table

и, следовательно, ограничить сортировку до конца 2-го поля.

1 голос
/ 30 мая 2010

Не знаю, поможет ли это, но сортировка информации гласит следующее:

sort -t: -k 2,2n -k 5.3,5.4

 Note that if you had written `-k 2' instead of `-k 2,2' `sort'
 would have used all characters beginning in the second field and
 extending to the end of the line as the primary _numeric_ key.
 For the large majority of applications, treating keys spanning
 more than one field as numeric will not do what you expect.

Возможно, попробуйте добавить пробел между -k и 2 или попробуйте установить POS2?

...