加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

排序 – unix排序-n -t“,”给出意想不到的结果

发布时间:2020-12-15 21:59:26 所属栏目:安全 来源:网络整理
导读:即使我指定了分隔符,unix数字排序也会产生奇怪的结果. $cat example.csv # here's a small example58,1.4927039940159,0.00019213641937359,0.0018209292472459,1.4927039940160,0.0018209292472460,1.4927039940112,13.08033968512,14.153104990512,26.7613
即使我指定了分隔符,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,50.4592437035

对于此示例,无论是否指定分隔符,sort都会给出相同的结果.我知道如果我设置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=

我从许多其他问题(例如here,here和here)中读到了如何避免这种行为,但是,这种行为令人难以置信的奇怪和不可预测,并且让我心痛了一周.有人可以解释为什么Mac OS X(10.8.5)上的默认环境设置排序会这样吗?换句话说:什么是排序(使用局部变量设置为en_US.UTF-8)来获得该结果?

我正在使用

sort 5.93                        November 2005

 $type sort
 sort is /usr/bin/sort

UPDATE

我已经在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的FAQ中讨论过,并在the POSIX description of sort中进一步说明.

因此,正如gnu-coreutil’s list put it上的Eric Blake所说,如果字段分隔符也是数字(逗号是),那么“没有-k来阻止事情,[字段分隔符]同时充当分隔符和数字字符 – 你正在对跨越多个领域的数字进行排序.“

解决方法

我不确定这是完全正确的,但它很接近.

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

如果您明确指定要排序的单个键

sort -k1,1n -k2,2n -t,

它应该工作.现在你明确告诉排序首先对第一个字段进行排序(数字),然后在第二个字段(也是数字)上排序.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读