概述:
我在 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 上重新测试,以确保我获得了所需的结果。感谢大家关注这两种操作系统类型之间的这种排序异常。