[root@linuxidc tmp]# sort -t $'\t' -k3 system.txt 4 linux 1000 200 3 bsd 1000 600 1 mac 2000 500 2 winxp 4000 300 5 SUSE 4000 300 6 Debian 600 200
结果中虽然1000<2000<4000的顺序是对了,但600却排在最后面,因为这是按照默认字符集排序规则进行排序的,字符6大于4,所以排最后一行。
(3).对第三列按数值排序规则进行排序。
[root@linuxidc tmp]# sort -t $'\t' -k3 -n system.txt 6 Debian 600 200 3 bsd 1000 600 4 linux 1000 200 1 mac 2000 500 2 winxp 4000 300 5 SUSE 4000 300
结果中600已经排在第一行。结果中第2行、第3行的第三列值均为1000,如何决定这两行的顺序?
(4).在对第3列按数值排序规则排序的基础上,使用第四列作为决胜属性,且是以数值排序规则对第四列排序。
[root@linuxidc tmp]# sort -t $'\t' -k3 -k4 -n system.txt 6 Debian 600 200 4 linux 1000 200 3 bsd 1000 600 1 mac 2000 500 2 winxp 4000 300 5 SUSE 4000 300
如果想在第3列按数值排序后,以第2列作为决胜列呢?由于第2列为字母而非��值,所以下面的语句是错误的,虽然得到了期望的结果。
[root@linuxidc tmp]# sort -t $'\t' -k3 -k2 -n system.txt 6 Debian 600 200 3 bsd 1000 600 4 linux 1000 200 1 mac 2000 500 2 winxp 4000 300 5 SUSE 4000 300
之所以最终得到了正确的结果,是因为默认情况下,在命令行中指定的排序行为结束后,sort还会做最后一次排序,这最后一次排序是对整行按照完全默认规则进行排序的,也就是按字符集、升序排序。由于1000所在的两行中的第一个字符3小于4,所以3排在前面。
之所以说上面的语句是错误的,是因为第2列第一个字符是字母而不是数值,在按数值排序时,字母是不可识别字符,一遇到不可识别字符就会立即结束该字段的排序行为。可以使用"--debug"选项来查看排序的过程和排序时所使用的列。注意,该选项只有CentOS 7上的sort才有。
[root@linuxidc tmp]# sort --debug -t $'\t' -k3 -k2 -n system.txt sort: using ‘en_US.UTF-8’ sorting rules sort: key 1 is numeric and spans multiple fields sort: key 2 is numeric and spans multiple fields 6>Debian>600>200 ___ # 第1次排序行为,即对"-k3"排序,此次用于排序的字段为第3列 ^ no match for key # 第2次排序行为,即对"-k2"排序,但显示无法匹配排序key ________________ # 默认sort总会进行最后一次排序,排序对象为整行 3>bsd>1000>600 ____ ^ no match for key ______________ 4>linux>1000>200 ____ ^ no match for key ________________ 1>mac>2000>500 ____ ^ no match for key ______________ 2>winxp>4000>300 ____ ^ no match for key ________________ 5>SUSE>4000>300 ____ ^ no match for key _______________
(5).在对第3列按数值排序规则排序的基础上,使用第2列作为决胜属性,且以默认排序规则对此列降序排序。