Обзор:
Запускаю "Ubuntu 18.04.1 LTS" в соответствии с Windows 10, загруженным с:
https://docs.microsoft.com/en-us/windows/wsl/install-manual
Когда я пытаюсь "отсортировать-k, "где "-k" является-k[123456]", я получаю смешанные результаты:
"-k[12]": вид работает как ожидалось
"-k[345]": вид не происходит
"-k6: вид происходит на столбце 5 (по сравнению со столбцом 6)
Если я подготавливаю тот же файл, работающий на базирующемся сервере RHEL RHEL 7.7 Cisco UCS (Maipo), все шесть видов (работа "вида-k [123456]" как на обозначенном столбце.
Я встретился с ошибкой в Ubuntu, или виды должны быть выполнены по-другому на Ubuntu по сравнению с RHEL?
Демонстрационные виды:
LAPTOP-MOQUDB6E:/tmp $ lsb_release -d
Description: Ubuntu 18.04.1 LTS
LAPTOP-MOQUDB6E:/tmp $ cat members # {original file}
00013 Snow White Disney_Princess Europe Enchanted_Forest
00016 Wiley Coyote Roadrunner_Nemesis North_America La_Paz
00018 Jiminy Cricket Disney Europe Tuscon0y
00019 Speedy Gonzales Cats_Meow North_America Guadalajara
00017 Jasmine <tbd> Disney_Princess Asia Desert_Sands
LAPTOP-MOQUDB6E:/tmp $ sort -k2 members # {"-k2": Colum_2 sort works as expected}
00017 Jasmine <tbd> Disney_Princess Asia Desert_Sands
00018 Jiminy Cricket Disney Europe Tuscon0y
00013 Snow White Disney_Princess Europe Enchanted_Forest
00019 Speedy Gonzales Cats_Meow North_America Guadalajara
00016 Wiley Coyote Roadrunner_Nemesis North_America La_Paz
LAPTOP-MOQUDB6E:/tmp $ sort -k5 members # {"-k5": Col_5 sort doesn't work}
00018 Jiminy Cricket Disney Europe Tuscon0y
00019 Speedy Gonzales Cats_Meow North_America Guadalajara
00017 Jasmine <tbd> Disney_Princess Asia Desert_Sands
00013 Snow White Disney_Princess Europe Enchanted_Forest
00016 Wiley Coyote Roadrunner_Nemesis North_America La_Paz
LAPTOP-MOQUDB6E:/tmp $ sort -k6 members # {"-k6": anomoly (sort occurs on Col_5)}
00017 Jasmine <tbd> Disney_Princess Asia Desert_Sands
00013 Snow White Disney_Princess Europe Enchanted_Forest
00018 Jiminy Cricket Disney Europe Tuscon0y
00019 Speedy Gonzales Cats_Meow North_America Guadalajara
00016 Wiley Coyote Roadrunner_Nemesis North_America La_Paz
Различие, вероятно, относится к локали по умолчанию для этих двух систем, конкретно вес сопоставления ведущего пробела.
Во-первых, важно отметить это sort
разграничивает на непробеле для очищения перехода по умолчанию - не пробел для неочищения. Таким образом, когда у Вас есть колоночный файл, который использует несколько пробельных символов для выравнивания, те дополнительные символы выравнивания считаются частью следующего поля. Вы видите, как это влияет на Ваши результаты путем добавления --debug
флаг.
[ПРИМЕЧАНИЕ: я собираюсь использовать локаль C здесь, так как она показывает поведение, которое Вы видите, и я не знаю то, что Ваша фактическая локаль]
$ LC_COLLATE=C sort --debug -k5 file
sort: using simple byte comparison
sort: leading blanks are significant in key 1; consider also specifying 'b'
00018 Jiminy Cricket Disney Europe Tuscon0y
_____________________________________
________________________________________________________________________
00019 Speedy Gonzales Cats_Meow North_America Guadalajara
_____________________________________
___________________________________________________________________________
00017 Jasmine <tbd> Disney_Princess Asia Desert_Sands
________________________________
____________________________________________________________________________
00013 Snow White Disney_Princess Europe Enchanted_Forest
____________________________________
________________________________________________________________________________
00016 Wiley Coyote Roadrunner_Nemesis North_America La_Paz
_______________________
______________________________________________________________________
Здесь Вы видите, что то, что на самом деле происходит, - то, что это сортирует на столбце 5, однако после того как Вы принимаете во внимание ведущий пробел, результат состоит в том, что это сортирует в порядке most-least ведущий пробел.
Аналогично, когда Вы используете -k6
, это действительно сортирует на 6-м столбце, по совпадению однако, который дает то же распоряжение как алфавитный вид на столбце 5 географические регионы (просто, потому что Азия, оказывается, коротка, и North_America длинен),
$ LC_COLLATE=C sort --debug -k6 file
sort: using simple byte comparison
sort: leading blanks are significant in key 1; consider also specifying 'b'
00017 Jasmine <tbd> Disney_Princess Asia Desert_Sands
_______________________
____________________________________________________________________________
00013 Snow White Disney_Princess Europe Enchanted_Forest
_________________________
________________________________________________________________________________
00018 Jiminy Cricket Disney Europe Tuscon0y
_________________
________________________________________________________________________
00019 Speedy Gonzales Cats_Meow North_America Guadalajara
_____________
___________________________________________________________________________
00016 Wiley Coyote Roadrunner_Nemesis North_America La_Paz
________
______________________________________________________________________
Простое решение дано в выводе отладки:
sort: leading blanks are significant in key 1; consider also specifying 'b'
т.е.
$ LC_COLLATE=C sort --debug -b -k5 file
sort: using simple byte comparison
00017 Jasmine <tbd> Disney_Princess Asia Desert_Sands
___________________________
____________________________________________________________________________
00013 Snow White Disney_Princess Europe Enchanted_Forest
_______________________________
________________________________________________________________________________
00018 Jiminy Cricket Disney Europe Tuscon0y
_______________________
________________________________________________________________________
00019 Speedy Gonzales Cats_Meow North_America Guadalajara
__________________________
___________________________________________________________________________
00016 Wiley Coyote Roadrunner_Nemesis North_America La_Paz
_____________________
______________________________________________________________________
Сделал некоторое рытье и наблюдал, имеет ли файл на 6 столбцов только одиночный пробел между полями на каждой строке, то "вид-k# [source_file]" (" # ": 1-6), работает над обеими Ubuntu & RHEL для видов, выполненных на столбцах 1-6. То же верно для вида с помощью "вид-k#,# [source_file]" (исключая: вид-k1,1..., вид-k2,2...... вид-k6,6...").
Если файл на шесть столбцов имеет больше чем один [пробел] символ между полями на каждой строке (исключая: файл был выровненный использование "кошка [source_file] | столбец-t> [target_file]"), затем "вид-k# [target_file]" (" # ": 1-6), только работает над RHEL для столбцов 1-6.
Для Ubuntu я заметил, что "вид-k # [target_file]" работал на столбцы 1 и 2, ничего не сделал для столбцов 3-5, и "вид-k6 [target_file]" закончил тем, что сортировал на столбце 5.
Для моей утилиты я закончил тем, что предварительно обусловил входной файл вида, чтобы иметь только одиночный пробел между полями и затем повторно протестированный на обеих RHEL & Ubuntu, чтобы обеспечить, чтобы я получал желаемые результаты. Спасибо все, кто смотрел на эту аномалию вида между двумя типами ОС.