gnu sort命令的--general-numeric-sort选项与--numeric-sort选项区别
2017-03-11 15:44
295 查看
sort提供了两种数字排序方式:
这两种都是数字排序,有什么区别呢?
先来看看第一种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
-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
相关文章推荐
- 《sort命令的k选项大讨论》-linux命令五分钟系列之二十七
- 了解 sort 和 uniq 命令 (包括 uniq 的 -u 和 -d 选项)
- GNU sort命令详解
- 理解cut,awk,sort三个命令的分隔符选项
- 了解sort和uniq命令(包括uniq的-u和-d选项)
- Linux命令长选项和短选项区别
- 《sort命令的k选项大讨论》-linux命令五分钟系列之二十七
- 《sort命令的k选项大讨论》-linux命令五分钟系列之二十七
- linux系统下的命令sort与uniq的参数选项详解
- linux 中双横杠和单横杠命令选项的区别
- sort命令的k选项大讨论
- linux命令选项的单双连字符('-'和'--')使用上的区别
- gnu sort命令多列排序
- sort命令K选项
- sort命令的k选项大讨论
- sort命令k选项
- sort命令的k选项大讨论【转】
- 理解cut,awk,sort三个命令的分隔符选项
- iptables的常用命令和选项
- Linux操作系统中排序命令Sort的使用方法