首页 >> 学习 >> Linux常用命令 >> sort
sort命令

本节重要性:★★★★★    本节难度:★★★★★

在处理文本时,经常需要对文本进行排序。在Linux下排序不用自己写程序,Linux为我们提供了一个功能强大的排序工具sort命令,利用sort的选项,可以完成各种各样的排序任务。

命令用途

按行排序文本

命令格式

sort [option] [file]

常用选项

-b		忽略每行前面开始处的空格字符
-c		检查文件是否已经排序,若已排序就不再排序
-f		排序时,忽略大小写字母
-n		依照数值的大小排序
-g		依照科学计数法数值的大小排序(-n不能识别科学计数法)
-r		以降序来排序(默认是升序)
-t <分隔字符>	指定排序时所用的栏位分隔字符
-k		选择以哪个区间进行排序

常见用法

不带参数的sort是按ASCII表的顺序升序进行排序:

[peter@ibi98 sort]$ cat sort_demo_1
5
1
8
10
[peter@ibi98 sort]$ sort sort_demo_1
1
10
5
8

使用了-n参数,则按照数字的大小进行排序:

[peter@ibi98 sort]$ sort -n sort_demo_1
1
5
8
10

-r参数表示按照降序进行排序:

[peter@ibi98 sort]$ sort -nr sort_demo_1
10
8
5
1

如果有多个字段,还可以用-k选项指定参与排序的字段范围。-k选项的语法格式为:

-k Fstart.Cstart,Fend.Cend

其中:
Fstart	开始参与排序的字段
Cstart	开始参与排序的字符
Fend	最后一个参与排序的字段
Cend	最后一个参与排序的字符

注意:
第二个字段开始,第一个字符是字段分隔符,而不是该字段的第一个字符
若省略Fend(包括后面的Cend),则参与排序的内容到行尾
若省略Cstart(或Cend),则参与排序的内容到Fstart或Fend字段最后一个字符

如下面的文件包含3个字段(制表符分隔的),若按第2个字段开始到行尾进行排序:

[peter@ibi98 sort]$ cat sort_demo_2
bca     ccd     abh
dag     aeh     bgi
aea     bhg     gaa
gfb     bhg     aee
iaa     cia     aah
[peter@ibi98 sort]$ sort -k2 sort_demo_2
dag     aeh     bgi
gfb     bhg     aee
aea     bhg     gaa
bca     ccd     abh
iaa     cia     aah

若只按第2个字段排序:

[peter@ibi98 sort]$ sort -k2,2 sort_demo_2
dag     aeh     bgi
aea     bhg     gaa
gfb     bhg     aee
bca     ccd     abh
iaa     cia     aah

注意第2行和第3行的第三个字段与上面的区别。

如果按第二个字段的第2个和第3个字符排序:

[peter@ibi98 sort]$ sort -k2.3,2.4 sort_demo_2
bca     ccd     abh
dag     aeh     bgi
aea     bhg     gaa
gfb     bhg     aee
iaa     cia     aah

注意上面-k2.3表示从第二个字段第2个字符,而不是从第二个字段的第3个字符,因为第二个字段前的制表符是2.1,相应的第二个字段的第一个字符是2.2。

有时,您会遇到在按一个字段排好序的情况下,如果该字段包含相同内容的行,这些行再按另一个字段排序,这时可以用2个-k选项:

[peter@ibi98 sort]$ cat sort_demo_3
31      1334    28
384     287     901
417     58      279
1502    287     71
762     287     655
91      391     1058
[peter@ibi98 sort]$ sort -k2,2n sort_demo_3
417     58      279
1502    287     71
384     287     901
762     287     655
91      391     1058
31      1334    28
[peter@ibi98 sort]$ sort -k2,2n -k3,3nr sort_demo_3
417     58      279
384     287     901
762     287     655
1502    287     71
91      391     1058
31      1334    28

如果数字里有科学计数法表示的数字,-n选项是不能识别的,这时要想按照数字大小排序应该使用-g选项:

[peter@ibi98 sort]$ cat sort_demo_4
2e2
1
8
4
1e4
8e9
[peter@ibi98 sort]$ sort -n sort_demo_4
1
1e4
2e2
4
8
8e9
[peter@ibi98 sort]$ sort -g sort_demo_4
1
4
8
2e2
1e4
8e9

如果分割字符不是制表符,则可以用-t选项定义分隔符,如:

[peter@ibi98 sort]$ cat sort_demo_5
peter:male:5
john:male:8
lily:female:7
rose:female:6
[peter@ibi98 sort]$ sort -t: -k3n sort_demo_5
peter:male:5
rose:female:6
lily:female:7
john:male:8

sort命令功能非常强大,可以满足各种排序要求,尤其是-k选项可以精准控制参与排序的字段甚至字符。要熟练掌握该命令有一定难度,需要多加练习。

<<上一节  下一节>>