在处理文本时,经常需要对文本进行排序。在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选项可以精准控制参与排序的字段甚至字符。要熟练掌握该命令有一定难度,需要多加练习。