首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >unix sort -n -t",“给出意外的结果

unix sort -n -t",“给出意外的结果
EN

Stack Overflow用户
提问于 2013-10-07 15:41:10
回答 3查看 1.7K关注 0票数 5

即使当我指定分隔符时,unix数字排序也会产生奇怪的结果。

代码语言:javascript
复制
$ cat example.csv  # here's a small example
58,1.49270399401
59,0.000192136419373
59,0.00182092924724
59,1.49270399401
60,0.00182092924724
60,1.49270399401
12,13.080339685
12,14.1531049905
12,26.7613447051
12,50.4592437035

$ cat example.csv | sort -n --field-separator=,
58,1.49270399401
59,0.000192136419373
59,0.00182092924724
59,1.49270399401
60,0.00182092924724
60,1.49270399401
12,13.080339685
12,14.1531049905
12,26.7613447051
12,50.4592437035

对于本例,无论指定分隔符,排序都会提供相同的结果。我知道,如果设置了LC_ALL=C,那么排序就会再次给出预期的行为。但我不明白为什么默认环境设置(如下面所示)会导致这种情况发生。

代码语言:javascript
复制
$ locale
LANG="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL=

我从许多其他问题(如这里这里这里)中读到了如何避免这种行为,但这种行为仍然令人难以置信地怪异和不可预测,并使我心痛了一周。有人能解释一下为什么Mac (10.8.5)上的默认环境设置会出现这种情况吗?换句话说:排序正在做什么(局部变量设置为en_US.UTF-8)来获得这个结果?

我在用

代码语言:javascript
复制
 sort 5.93                        November 2005

 $ type sort
 sort is /usr/bin/sort

更新

我已经在gnu-coreutils列表中讨论了这一点,现在我理解了为什么使用英语unicode默认区域设置排序会给出它所做的输出。因为在英语unicode中,逗号",“被认为是数字(以便允许逗号作为千(或数百)个分隔符),并且在解释一行时,排序默认为”贪婪“,因此它将示例数字大致读为

代码语言:javascript
复制
581.491...
590.000...
590.001...
591.492...
600.001...
601.492...
1213.08...
1214.15...
1226.76...
1250.45...

虽然这不是我想要的,而且chepner是对的,为了得到我想要的实际结果,我需要指定我只想在第一个字段上进行排序。sort默认将行的更多内容解释为键,而不仅仅是将第一个字段解释为键。

在gnu-coreutil的常见问题中讨论了排序的这种行为,并在POSIX分类描述中作了进一步的说明。

因此,正如gnu-coreutil的名单上写着上的Eric一样,如果字段分隔符也是数字(逗号也是),那么“如果没有-k来停止事物,字段分隔符既是分隔符,也是数字字符--对跨越多个字段的数字进行排序。”

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-07 16:09:48

我不确定这是完全正确的,但已经接近了。

sort -n -t,将尝试按给定的键进行数字排序。在这种情况下,键是由整数和浮点数组成的元组。这类元组不能进行数值排序。

如果您显式地指定要对哪一个键排序

代码语言:javascript
复制
sort -k1,1n -k2,2n -t,

应该管用的。现在,您将显式地告诉sort对第一个字段(数字)进行排序,然后对第二个字段(也是数字字段)进行排序。

我怀疑,只有当输入的每一行都包含一个数值时,-n作为全局选项才是有用的。否则,您需要结合使用-n选项和-k选项来确切指定哪些字段是数字。

票数 7
EN

Stack Overflow用户

发布于 2013-10-08 23:05:30

使用排序--调试来找出发生了什么。我用它详细地解释了你在:http://lists.gnu.org/archive/html/coreutils/2013-10/msg00004.html上的问题

票数 1
EN

Stack Overflow用户

发布于 2013-10-07 16:01:23

如果您使用

代码语言:javascript
复制
cat example.csv | sort

而不是

代码语言:javascript
复制
cat example.csv | sort -n --field-separator=,

然后它会给出正确的输出。使用这个命令,希望这对你有帮助。

注意:我用“排序(GNU coreutils) 7.4”进行了测试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19228968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档