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

来源:互联网 发布:mac没有host 编辑:程序博客网 时间:2024/05/21 21:43

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


0 0