即使当我指定分隔符时,unix数字排序也会产生奇怪的结果。
$ 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,那么排序就会再次给出预期的行为。但我不明白为什么默认环境设置(如下面所示)会导致这种情况发生。
$ 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)来获得这个结果?
我在用
sort 5.93 November 2005
$ type sort
sort is /usr/bin/sort更新
我已经在gnu-coreutils列表中讨论了这一点,现在我理解了为什么使用英语unicode默认区域设置排序会给出它所做的输出。因为在英语unicode中,逗号",“被认为是数字(以便允许逗号作为千(或数百)个分隔符),并且在解释一行时,排序默认为”贪婪“,因此它将示例数字大致读为
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来停止事物,字段分隔符既是分隔符,也是数字字符--对跨越多个字段的数字进行排序。”
发布于 2013-10-07 16:09:48
我不确定这是完全正确的,但已经接近了。
sort -n -t,将尝试按给定的键进行数字排序。在这种情况下,键是由整数和浮点数组成的元组。这类元组不能进行数值排序。
如果您显式地指定要对哪一个键排序
sort -k1,1n -k2,2n -t,应该管用的。现在,您将显式地告诉sort对第一个字段(数字)进行排序,然后对第二个字段(也是数字字段)进行排序。
我怀疑,只有当输入的每一行都包含一个数值时,-n作为全局选项才是有用的。否则,您需要结合使用-n选项和-k选项来确切指定哪些字段是数字。
发布于 2013-10-08 23:05:30
使用排序--调试来找出发生了什么。我用它详细地解释了你在:http://lists.gnu.org/archive/html/coreutils/2013-10/msg00004.html上的问题
发布于 2013-10-07 16:01:23
如果您使用
cat example.csv | sort而不是
cat example.csv | sort -n --field-separator=,然后它会给出正确的输出。使用这个命令,希望这对你有帮助。
注意:我用“排序(GNU coreutils) 7.4”进行了测试。
https://stackoverflow.com/questions/19228968
复制相似问题