Я получил файл с именем test, его содержимое похоже

111 222
11 22
111 223
12 22 33
11 2 25
222 331
11 2
33 2 1
33
33 22 33

Я использовал:

sort -bk2.3 test

Но результат смутил меня, те строки, у которых нет k2.3, довольно случайны. Я ожидаю, что все целевые линии перечислены в начале или в конце, но это не так. Это как:

11 2
11 22
33
222 331
33 2 1
111 222
11 2 25
111 223
12 22 33
33 22 33

Итак, каков внутренний механизм сортировки для ранжирования этих строк без требуемой области ключа?

1 ответ1

1

Я настоятельно рекомендую эту тему переполнения стека на ту же тему. Такое поведение сортировки не является интуитивно понятным, и, несмотря на изучение как этого потока, так и официальной документации сортировки GNU, я не могу точно определить, что происходит, когда индекс сортировки выходит за пределы.

  1. Тем не менее, я должен указать, что вы можете использовать модификатор "b" в качестве опции выбора ключа сортировки, которая игнорирует пробелы в этом ключе, т.е. пустые ключи, например

    $ sort -k 2.3nb test

  2. Также из документации сортировки GNU ясно, что опция -k принимает аргумент формата start pos, end pos и, если не указан end pos, она сравнивает ключи от вашей начальной позиции до конца текущей строки. Это, вместе со следующей осторожностью, приводит к неопределенному поведению.

    Finally, as a last resort when all keys compare equal, 
    sort compares entire lines as if no ordering options other 
    than --reverse (-r) were specified. 
    
  3. Вы также можете указать несколько ключей, которые будут действовать в качестве тай-брейка, хотя это не решает проблему для вашего случая использования, поскольку это первый ключ, который вызывает неинтуитивное поведение.

  4. Наконец, если у вас есть опция --debug, доступная в вашей системе в соответствии с сортировкой GNU, это очень поможет при поиске и устранении неисправностей, поскольку она показывает, что соответствует шаблону ключа. К сожалению, я этого не сделал, и поэтому пришлось экспериментировать в темноте.

Я не знаю, какой именно у вас сценарий использования, но я нашел довольно приятный набор результатов со следующим. Это поведение, вероятно, не задокументировано, но, по-видимому, очевидно, работает в соответствии с моей интуицией и вашим запросом:

$ sort -k 2.3nb,2 test
11 2
11 2 25
11 22
12 22 33
33
33 2 1
33 22 33
222 331
111 222
111 223

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .