linux sort命令详解

功能说明:将文本文件内容加以排序,sort可针对文本文件的内容,以行为单位来排序。

语  法:sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件]

参  数:

 -b   忽略每行前面开始出的空格字符。

 -c   检查文件是否已经按照顺序排序。

 -d   排序时,处理英文字母、数字及空格字符外,忽略其他的字符。

 -f   排序时,将小写字母视为大写字母。

 -i   排序时,除了040至176之间的ASCII字符外,忽略其他的字符。

 -m   将几个排序好的文件进行合并。

 -M   将前面3个字母依照月份的缩写进行排序。

 -n   依照数值的大小排序。

 -o<输出文件>   将排序后的结果存入指定的文件。

 -r   以相反的顺序来排序。

 -t<分隔字符>   指定排序时所用的栏位分隔字符。

 +<起始栏位>-<结束栏位>   以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。

 --help   显示帮助。

 --version   显示版本信息。 

sort的-u选项

作用很简单,就是在输出行中去除重复行。

[root@geralt-workpc ~]# sort A.txt 

apple

gold

iron

orenge

silver

steel

steel

[root@geralt-workpc ~]# sort -u A.txt 

apple

gold

iron

orenge

silver

steel

sort的-r选项

sort默认的排序方式是升序,如果想改成降序,就加个-r就搞定。

[root@geralt-workpc ~]# sort A.txt    

apple

gold

iron

orenge

silver

steel

steel

[root@geralt-workpc ~]# sort -r A.txt  

steel

steel

silver

orenge

iron

gold

apple

sort的-o选项

把排序结果输出到原文件

[root@geralt-workpc ~]# sort B.txt   

carrot

cookies

gold

orenge

[root@geralt-workpc ~]# sort -r B.txt -o B.txt 

[root@geralt-workpc ~]# cat B.txt 

orenge

gold

cookies

carrot

sort的-t选项和-k选项

如果有一个文件的内容是这样:

[root@geralt-workpc ~]# cat facebook.txt

banana:30:5.5

apple:10:2.5

pear:90:2.3

orange:20:3.4

文件有三列,列与列之间用冒号隔开了,第一列表示水果类型,第二列表示水果数量,第三列表示水果价格。

以水果数量来排序,也就是以第二列来排序,如何利用sort实现?

[root@geralt-workpc ~]# sort -n -k 2 -t : facebook.txt

apple:10:2.5

orange:20:3.4

banana:30:5.5

pear:90:2.3

-k选项

[root@geralt-workpc ~]# cat facebook.txt 

google 110 5000

baidu 100 5000

guge 50 3000

sohu 100 4500

假设第一个域是公司名称,第二个域是公司人数,第三个域是员工平均工资

按公司的字母顺序排序

[root@geralt-workpc ~]# sort -t ' ' -k 1 facebook.txt 

baidu 100 5000

google 110 5000

guge 50 3000

sohu 100 4500

按照公司人数排序

[root@geralt-workpc ~]# sort -n -t ' ' -k 2 facebook.txt      

guge 50 3000

baidu 100 5000

sohu 100 4500

google 110 5000

按照公司人数排序,人数相同的按照员工平均工资升序排序

[root@geralt-workpc ~]# sort -n -t ' ' -k 2 -k 3 facebook.txt 

guge 50 3000

sohu 100 4500

baidu 100 5000

google 110 5000

按照员工工资降序排序,如果员工人数相同的,则按照公司人数升序排序

[root@geralt-workpc ~]# sort -n -t ' ' -k 3r -k 2 facebook.txt

baidu 100 5000

google 110 5000

sohu 100 4500

guge 50 3000

从公司英文名称的第二个字母开始进行排序

[root@geralt-workpc ~]# sort -t ' ' -k 1.2 facebook.txt          

baidu 100 5000

sohu 100 4500

google 110 5000

guge 50 3000

-u选项

[root@geralt-workpc ~]# sort -n -k 2 facebook.txt

guge 50 3000

baidu 100 5000

sohu 100 4500

google 110 5000

[root@geralt-workpc ~]# sort -n -k 2 -u facebook.txt

guge 50 3000

baidu 100 5000

google 110 5000

[root@geralt-workpc ~]# sort  -k 1.1,1.1 -u facebook.txt

baidu 100 5000

google 110 5000

sohu 100 4500

发现-u只识别用-k设定的域,发现相同,就将后续相同的行都删除。

[root@geralt-workpc ~]#  sort -n -k 2 -k 3 -u facebook.txt

guge 50 3000

sohu 100 4500

baidu 100 5000

google 110 5000

设置了两层排序优先级的情况下,使用-u就没有删除任何行。原来-u是会权衡所有-k选项,将都相同的才会删除,只要其中有一级不同都不会轻易删除的