Linux文件排序工具 sort 命令详解(3)

[root@linuxidc tmp]# sort -t $'\t' -k3n -k2r 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列按默认规则降序排序,因此只能对每个字段单独分配选项。注意,虽然"r"选项是降序结果,但它不影响排序过程,只影响最终排序结果。也就是说,在按照升序排序结束得到最终结果后,再反转第2列顺序,也就是得到了降序的结果。同样也说明,sort在排序的时候,一定且只能按照升序排序,只有排序动作结束了"r"选项才开始工作。

紧跟在字段后的选项(如"-k3n"的"n"和"-k2r"的"r")称为私有选项,使用短横线写在字段外的选项(如"-n"、"-r")为全局选项。当没有为字段分配私有选项时,该排序字段将继承全局选项。当然,只有像"-n"、"-r"这样的排序性的选项才能继承和分配给字段,"-t"这样的选项则无法分配。

因此,"-n -k3 -k4"、"-n -k3n -k4"和"-k3n -k4n"是等价的,"-r -k3n -k4"和"-k3nr -k4r"是等价的。

实际上,上面的命令写法并不严谨。更标准的写法应该如下:

sort -t $'\t' -k3n -k2,2r system.txt

"-k2,2"表示排序对象从第2个字段开始到第2个字段结束,也就是限定了只对第二个字段排序。它的格式为"POS1,POS2",如果省略POS2,将自动扩展到行尾,即"-k2"等价于"-k2,4",也就是说,对整个第2列到第4列进行排序。

需要注意,由于上面的"-k2"继承了全局默认的排序规则,即按字符排序而非按数值排序,此时它能够等价于"-k2,4",但如果是"-k2n"按照数值排序的话,它不等价于"-k2,4n"或"-k2n,4n"或"-k2n,4"(这3者为等价写法),之所以不等价,是因为按数值排序时只能识别数字和负号"-",当排序时遇到其他所有字符,都将立即结束此次排序。所以"-k2n"等价于"-k2,2n"或"-k2n,2"或"-k2n,2n"。

这些理论性的知识点,请参照下一小节sort的理论内容。后文也不再解释理论性的内容,只是介绍命令使用方法。

(6).在对第3列按数值排序规则排序的基础上,使用第2列的第2个字符作为决胜属性,且以默认排序规则对此列升序排序。

[root@linuxidc tmp]# sort -t $'\t' -k3n -k2.2,2.2 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

其中"-k2.2,2.2"表示从第2个字段的第2个字符开始,到第2个字段的第2个字符结束,即严格限定为第2个字段第2个字符。如果需要对此字符降序排序,则"-k2.2,2.2r"。

(7).使用"-u"去除重复字段所在的行。例如第3列有两行1000,两行4000,去除字段重复的行时,将只保留排在前面的第一行。

[root@linuxidc tmp]# sort -t $'\t' -k3n -u system.txt 6 Debian 600 200 3 bsd 1000 600 1 mac 2000 500 2 winxp 4000 300

由于需要去除重复字段的行,因此使用"-u"时将禁止sort做"最后一次排序"。至于字段重复的行中,如何判断哪一行是排在最前面的行,需要搞懂sort的整个工作机制,请通读本文。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/13538.html