您的位置:首页 > 其它

gnu sort命令的--general-numeric-sort选项与--numeric-sort选项区别

2017-03-11 15:44 295 查看
sort提供了两种数字排序方式:

-g, --general-numeric-sort
compare according to general numerical value
-n, --numeric-sort
compare according to string numerical value


这两种都是数字排序,有什么区别呢?

先来看看第一种general-numeric-sort,它是用标准C函数把数字转换成双精度浮点数进行比较,支持科学计数法,例如1.23e5。

所以,当序列中有科学计数法的数值时,也可以正确排序,例如:

$ cat test2.txt

1.23e2

1.23456

10.3

2.1

3.5e1

-1

数列中1.23e2代表123,3.5e1代表35,排序后:

$ sort -g test2.txt

-1

1.23456

2.1

10.3

3.5e1

1.23e2

排序顺序为负数->正数,从小到大排序。

那么,当序列中出现字符串时,怎么排序呢?,比如增加两行数字带有字符串

2a1

2,67

$ cat test2.txt
1.23e2
1.23456
10.3
2.1
2a1
2,67
3.5e1
-1

排序结果:

$ sort -g test2.txt
-1
1.23456
2,67
2a1
2.1
10.3
3.5e1
1.23e2

2,67和2a1可以看作2后面跟着字符串,而sort -g的排序规则是先字符串,然后数字,所以这两个都排在2.1之前。

再根据字符串的排序规则,ASCII码小的排在前面,所以","排在"a"前面。

一般情况下,不建议用-g选项对数字进行排序,因为浮点数的排序比较慢,而且在把数字转换成浮点数时会产生进位误差。

再来看看numeric-sort,按数字大小排序,如果一行中有非数字字符,则按照非数字字符前面的数字大小排序。

还是继续对上一步的test2.txt用-n排序

$ sort -n test2.txt
-1
1.23e2
1.23456
2a1
2.1
3.5e1
10.3
2,67

sort -n不支持科学计数法,因此1.23e2被作为数字1.23参与排序,3.5e1作为数字3.5参与排序。
2a1作为数字2参与排序,因此排在2.1之前。

值得注意的是2,67排在最后,这里我看了半天,显然-n选项没有把","看作是一般的字符串,而是看作了千分位的逗号,因此,2,67实际被作为267参与排序,因而排在最后。

如果把2,67改成2+67,因为“+”的ASCII值小于“a“,所以2+67排在2a1之前,它们两个都作为数字2排在2.1之前。

如果把2,67改成2}67,因为“}“的ASCII值大于“a“,所以2}67会排在2a1后面。

$ sort -n test2.txt
-1
1.23e2
1.23456
2+67
2a1
2.1
3.5e1
10.3

为了确认,对test2.txt进行修改,原文件改为:

$ cat test2.txt
2.1
2a1
2,67
25,00
249

用-n排序:

$ sort -n test2.txt
2a1
2.1
249
2,67
25,00

这里,2,67被作为267,25,00被作为2500,参与排序。

以上是个人对数字、字符混合排序的一点理解,

为了排序的准确性,建议还是对数字进行格式化,去掉字符变成纯数字后,再用-n进行比大小,这样就省心多了。

参考:
https://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: