GNU сортирует противоречивое поведение для пустых столбцов - PullRequest
0 голосов
/ 15 февраля 2019

Я использую утилиту sort (GNU coreutils, версия 8.4), чтобы отсортировать файл по первым пяти столбцам, все из которых являются числовыми и разделены вкладкой.Для этого я использую следующий вызов:

sort --field-separator=$'\t' -nk1 -nk2 -nk3 -nk4 -nk5 myFileUnsorted.bcp >  myFileSorted.bcp

По большей части это работает нормально, но при некоторых пустых значениях я получаю некоторое (на вид) противоречивое поведение.В моем конкретном случае записи в третьем (и четвертом) столбце пусты, и я ожидаю, что отсортированный результат будет выглядеть так:

...
1   2           0   ...
1   2           84  ...
1   2           168 ...
...

В моем выходном файле я, однако, получаюследующий порядок:

1   2           0   ...
1   2   1       0   ...
1   2   1       84  ...
...
1   2   64      168 ...
1   2           84  ...
1   2           168 ...

Независимо от того, следует ли размещать записи, содержащие пустые значения в третьем (/ четвертом) столбце, в начале или в конце, я ожидаю, что они будут помещены вместе.

Глядя на эти три строки в шестнадцатеричном редакторе (vim версия 7.4 с :%!xxd), я получаю следующее:

31 09 32 09 09 09 30 09        ...
31 09 32 09 09 09 38 34 09     ...
31 09 32 09 09 09 31 36 38 09  ...

Это наводит меня на мысль, что не существует специальных,невидимые символы в пустых столбцах, которые могут быть ответственны за их сортировку отдельно друг от друга.

Кто-нибудь знает, почему sort упорядочивает строки так, как это делает?Возможно ли, чтобы они были расположены так, как они есть в моем первом примере / ожидаемом результате?Заранее спасибо!

Я использую bash (GNU bash, версия 4.1.2 (1) -релиз (x86_64-redhat-linux-gnu)) и попробовал ksh (версия AJM 93u +), оба дали один и тот же результат, если это имеет какое-либо значение.

1 Ответ

0 голосов
/ 15 февраля 2019

Используя -nk3, вы сказали sort отсортировать значения , начиная с третьего столбца , но не указали, где они заканчиваются, поэтому он использовал всю оставшуюся строку какзначение.

Чтобы использовать только определенный столбец, используйте

-nk3,3

На самом деле, я бы использовал одну и ту же запись для всех столбцов, где я не хочу включать остальныелинии.

sort --field-separator=$'\t' -nk1,1 -nk2,2 -nk3,3 -nk4,4 -nk5,5 \
    myFileUnsorted.bcp > myFileSorted.bcp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...