Ubuntu“sort -k “不适用于文件中的所有列

Ubuntu“sort -k “不适用于文件中的所有列

概述:

我在 Windows 10 下运行“Ubuntu 18.04.1 LTS”,下载自:

  https://docs.microsoft.com/en-us/windows/wsl/install-manual

当我尝试“sort -k ”,其中“-k”是-k [123456]”时,我得到了混合的结果:

  • “-k[12]”:排序按预期进行。

  • “-k[345]”:排序未发生

  • “-k6:排序发生在第 5 列(相对于第 6 列)

如果我在基于 Cisco UCS 的 RHEL RHEL 7.7(Maipo)服务器上运行相同的文件,则所有六种排序(“sort -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

差异可能与两个系统的默认语言环境有关,特别是前导空格的排序权重。

首先,需要注意的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 列排序,但是一旦考虑到前导空格,结果就是按从多到少的前导空格的顺序排序。

同样,当您使用时-k6,它实际上是在第 6 列上排序,然而巧合的是,它给出了与第 5 列地理区域按字母顺序排序相同的顺序(只是因为Asia 恰好很短,ortho_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'

IE

$ 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
                                                 _____________________
______________________________________________________________________

答案2

进行了一些挖掘并观察,如果 6 列文件的每一行字段之间只有一个空格,则“sort -k# [source_file]”(“#”:1-6)在 Ubuntu 和 RHEL 上都适用于对 1-6 列执行排序。使用“sort -k#,# [source_file]”进行排序也是如此(例如:sort -k1,1 ...,sort -k2,2 ...... sort -k6,6 ...”)。

如果六列文件的每一行字段之间有多个 [空格] 字符(例如:文件已使用“cat [source_file] | column -t > [target_file]”对齐),则“sort -k# [target_file]”(“#”:1-6)仅适用于 RHEL 上的 1-6 列。

对于 Ubuntu,我观察到“sort -k #[target_file]”对第 1 列和第 2 列有效,对第 3-5 列无效,“sort -k6 [target_file]”最终对第 5 列进行排序。

对于我的实用程序,我最终对排序输入文件进行了预处理,使其字段之间只有一个空格,然后在 RHEL 和 Ubuntu 上重新测试,以确保我获得了所需的结果。感谢大家关注这两种操作系统类型之间的这种排序异常。

相关内容