10

GNU sort命令不是用公共前缀正确地对不同长度的单词进行排序,而是仅当使用字段分隔符对多个字段中的一个进行排序时。

以下是不使用字段分隔符的正确、预期的排序行为:

$cat/tmp/test0bc(c)蚂蚁bcd公司公元前中国$排序/tmp/test0蚂蚁b公元前bcd公司c(c)中国

请注意,对于所有具有公共字符串前缀的单词,较短的单词优先于较长的单词排序。例如。在之前蚂蚁,b在之前公元前在之前立方厘米这是公认的标准英语字符串排序方式,例如在字典中。

然而,当您尝试对表格数据(例如CSV文件)进行排序,并对其中一列进行排序时,这种排序行为会发生变化。下面是它的样子:

$cat/tmp/test1b、 foo公司c、 巴蚂蚁,巴兹a、 foo公司立方厘米,立方厘米bc、pe中国,中国$sort/tmp/test1-t,-k1a、 foo公司蚂蚁,巴兹bcd、tybc、peb、 foo公司c、 巴中国,中国

请注意,带有公共前缀的单词c(c)仍在正确处理,但具有公共前缀的字符串b不是;bcd公司在之前排序公元前在之前排序b,所有这些都不正确!这种行为是稳定的;你总是得到同样的结果。我在一个更大的CSV文件上遇到了同样的问题,如果有意义的话,那里的排序错误肯定是随机的。

我试过各种旗帜分类没有人能纠正这种行为。-d日-秒不行。这是GNU coreutils 9.4排序中的值。

那么,这只是一个错误吗分类命令?我是不是用错了?我能做的更好的事情是通过字典按第一列中的单词对CVS进行排序吗?

2
  • 2
    分类按照区域设置的排序顺序进行排序,在大多数区域设置中,这与您在字典中找到的类似,在字典中,第一遍忽略空格和标点符号(将ignore作为其主要权重)。尝试进入C类如果需要基于字节值的订单,请选择locale(LC_ALL=C排序。。。)或使用排序-t,-k1,1-k2,2如果要根据第一个逗号分隔的字段作为第一个键,第二个字段作为第二个键进行排序。-千1(对从第一个字段开始的那部分行进行排序,以便整行)是默认的,因此毫无意义。 评论 5月24日16:38
  • 2
    收件人分类CSV,看看最大似然比(米勒)实用程序。分类只能对最简单的CSV进行排序(没有标头、没有引号、单元格中没有换行符)。 评论 5月24日16:40

3个答案

重置为默认值
16

这是您当前区域设置定义排序规则/排序规则的方式导致的,以及如何-千牛使用字段N个在比较行时到行的末尾,而不仅仅是字段N个(一些区域设置将排序bc、pe之前b、 foo公司如果他们忽略逗号)。

使用-k1,1级只使用该特定字段,或指定“C”语言环境,您应该会得到预期的结果:

$LC_ALL=en_US.utf8排序-t,-k1 test.txta、 foo公司蚂蚁,巴兹bcd、tybc、peb、 foo公司c、 巴中国,中国$LC_ALL=en_US.utf8排序-t,-k1,1 test.txta、 foo公司蚂蚁,巴兹b、 foo公司bc、pe立方厘米,立方厘米c、 巴中国,中国$LC_ALL=C排序-t,-k1 test.txta、 foo公司蚂蚁,巴兹b、 foo公司bc、pebcd、tyc、 巴中国,中国
4
  • 谢谢你,我可以确认它与LC_ALL=C然而,我仍然不明白(让我困惑的是)为什么同一组字符串的排序顺序会因其中一个字符串是否为表格数据中的列而不同。如果裸非非法文件排序为bcd、bc、b而且,这要简单得多。奇怪的是这种不一致性,我可以看到很多人可能会被绊倒。 评论 5月24日16:58
  • 4
    这是因为,在以下位置排序c(c)具有LC_ALL=en_US.utf8和之前LC_ALL=C.
    – ctx公司
    评论 5月24日17:09
  • 4
    @BenMcIlwain我一直忘了-千牛顿在行尾使用字段N。尝试-k 1,1相反,您还可以得到预期的排序顺序。
    – 肖恩
    评论 5月24日17:13
  • 8
    哦,天哪,那才是真正的答案。-k 1,1.是的!LC_ALL=C由于所选分隔符的字节值,它只能意外工作,但不能与其他分隔符一起工作;-k 1,1将与所有人一起工作。 评论 5月24日17:25
14

答案是,尽管网上有一些相反的示例用法-k个标志接受两个参数,因此需要将其写入-k 1,1。否则,使用-k 1,它没有得到一个停止字段号,因此只通过了整行。因此,异常排序行为实际上是由,分隔符位于其他ASCII字符之间。

感谢Stéphane Chazelas的上述评论。

4

根据Stéphane Chazelas的评论,您正在对wohle行进行排序,而不仅仅是第一个字段。使用LC_ALL=C ,在之前排序c(c):

%LC_ALL=en_US.utf8排序-t,-k1,1测试--调试sort:使用“en_US.utf8”排序规则执行的文本排序a、 foo公司______蚂蚁,巴兹__________b、 foo公司______bc、pe_______bcd、ty_________c、 巴______中国,中国_______%LC_ALL=en_US.utf8排序-t,-k1测试-调试sort:使用“en_US.utf8”排序规则执行的文本排序a、 foo公司__________蚂蚁,巴兹______________bcd、ty____________不列颠哥伦比亚省__________b、 foo公司__________c、 巴__________中国,中国__________

你必须登录回答这个问题。

不是你想要的答案吗?浏览标记的其他问题.