Ubuntu “вид-k <n> <имя файла>”, не работающее на все столбцы в файле

Обзор:

Запускаю "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
1
задан 12 April 2020 в 14:39

2 ответа

Различие, вероятно, относится к локали по умолчанию для этих двух систем, конкретно вес сопоставления ведущего пробела.

Во-первых, важно отметить это 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
                                                 _____________________
______________________________________________________________________
0
ответ дан 25 April 2020 в 10:50

Сделал некоторое рытье и наблюдал, имеет ли файл на 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, чтобы обеспечить, чтобы я получал желаемые результаты. Спасибо все, кто смотрел на эту аномалию вида между двумя типами ОС.

0
ответ дан 25 April 2020 в 10:50

Другие вопросы по тегам:

Похожие вопросы: