Linux系统下,sort命令是用于文件或文本排序,其排序功能很实用,很强大。本文将使用多个例子详细地讲解sort命令的使用方法。
1语法与选项
Sort命令的语法如下:
sort
说明:
Sort命令可针对文本文件的内容或管道中的文本内容,以行为单位来排序。
Sort命令常用选项如下表所示:
序号
选项
选项说明
1
-b
忽略每行前面开始出的空格字符
2
-c
检查文件是否已经按照顺序排序
3
-f
排序时,忽略大小写字母
4
-M
将前面3个字母依照月份的缩写进行排序
5
-n
依照数值的大小排序
6
-o<输出文件>
将排序后的结果存入指定的文件
7
-r
以相反的顺序来排序
8
-t<分隔字符>
指定排序时所用的栏位分隔字符
9
-k
选择以哪个区间进行排序
10
-C
检查文件是否已排好序
说明:
选项-c和-C都检查文件是否已经排好序,但是功能还是有区别,
-c检查文件是否已排好序,如果乱序,则输出第一个乱序的行的相关信息,最后返回1;
-C检查文件是否已排好序,如果乱序,不输出内容,仅返回1。
2初识sort命令
本节通过一个简单的文本文件排序,初步认识sort命令如何使用。用于排序的文本文件1.txt内容如下:
# cat 1.txt
one
failed
given
weekly
waiting
missed
survived
one
won
该文件从某个英文诗歌中截取的某列。使用sort命令排序结果如下:
#
sort 1.txt
failed
given
missed
one
one
survived
waiting
weekly
won
由排序结果可见,
排序是按照ASCII码升序排序
。Sort命令将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。使用文件重定向,可以将排序后的文件内容进行保存。下例中将排序后的文件内容保存到名为result的文件中,命令如下所示:
#
sort 1.txt > result.txt
3选项“-u”的用法
Sort命令的
“-u”选项,其作用就是在输出行中去除重复行,只保留一行
。例如第二小节中文本文件1.txt中包含两个one单词,排序后两个one单词前后排在一起,如果使用“-u”选项,执行结果如下:#
sort -u 1.txt
failed
given
missed
one
survived
waiting
weekly
won
从上面排序结果可以看到,两个one单词只保留了一个,去掉了重复的一个。
4选项“-r”的用法
Sort命令的
“-r”选项,其作用是改变排序类型:升序还是降序
。Sort命令默认的排序方式是升序,如果想改成降序,使用选项-r即可。对文本文件1.txt使用-r选项,结果如下:#
sort -ur 1.txt
won
weekly
waiting
survived
one
missed
given
failed
本例中使用了两个选项“-u”和“-r”,最后去重后降序排序。
上面都是针对单词的ASCII码进行的排序,如果针对数字字符,使用选项“-r”,其排序是按照数字大小排序还是仍然按照ASCII码排序?文本文件2.txt是一组数字,如下所示:
#
cat 2.txt
17
13
100
33
6
42
9
39
52
40
58
22
使用选项“-r”进行排序,结果如下:
#
sort -r 2.txt
9
6
58
52
42
40
39
33
22
17
13
100
如上排序结果可以看出,
-r降序排序也只是对ASCII码进行排序,跟字符和数字无关。
5选项“-n”的用法
第四小节选项“-r”对数字无法进行大小比较排序,而
选项“-n”则可以将待比较的内容当作数字进行大小比较
。使用选项“-n”对文本文件2.txt进行排序,结果如下:#
sort -nr 2.txt
100
58
52
42
40
39
33
22
17
13
9
6
本例使用两个选项“-n”和“-r”进行排序,首先-n是将排序内容按照数字进行大小比较,然后选项-r是进行降序排序。输出结果看出,确实按照数字大小比较,并进行了降序排序。
6选项“-t”、“-k”的用法
Sort命令的
选项“-t”,其作用是指定字段分隔符;选项“-k”的作用是指定对第几列字段进行排序
。这两个选项参数一般配合用,比如文本文件中出现多个字段,对其中某列字段进行排序的场景等。例如文本文件3.txt使用逗号“,”进行不同字段的分割,文件内容如下所示:
# cat 3.txt
2016-01-18,72650,0102:6,0400:40002
2016-01-19,317020,2999:347,0102:6705
2016-01-20,716550,0102:6,2999:78653
2016-01-21,497000,0102:10,2999:254006
2016-01-22,167620,0102:2,2999:232012
2016-01-23,100220,2999:182,0102:1014
2016-01-24,113240,2999:1183,0102:21842
2016-01-25,315390,2999:9096,1101:49865
2016-01-26,139620,0102:19,2999:179545
2016-01-27,261840,0102:13,2999:22818
2016-01-28,157660,1101:568,2999:14246
如上文本内容使用逗号“,”分割,第一列是日期,第二列数量,第三四列是“代码:数量”格式内容。如果对第二列进行降序排序,其命令如下:
#
sort -t "," -nrk2 3.txt
2016-01-20,716550,0102:6,2999:78653
2016-01-21,497000,0102:10,2999:254006
2016-01-19,317020,2999:347,0102:6705
2016-01-25,315390,2999:9096,1101:49865
2016-01-27,261840,0102:13,2999:22818
2016-01-22,167620,0102:2,2999:232012
2016-01-28,157660,1101:568,2999:14246
2016-01-26,139620,0102:19,2999:179545
2016-01-24,113240,2999:1183,0102:21842
2016-01-23,100220,2999:182,0102:1014
2016-01-18,72650,0102:6,0400:40002
解析:
“sort -t "," -nrk2 3.txt”使用了四个选项,分别是“-t”,指定了字段分隔符“,”;“-n”表示排序字段按照数字大小排序;“-r”表示降序排序;“-k2”指定对第二列进行排序。
上述命令也可以写成“
sort -t "," -k2nr,2 3.txt
”或“sort -t "," -k2nr 3.txt
”,其输出结果是一样的。多字段排序
如果需要对文本文件的多个字段进行排序,需要使用“-t”和“-k”选项,比如文本文件4.txt内容如下:
# cat 4.txt
3,5,6
4,7,9
5,8,3
3,4,2
5,5,3
1,2,3
2,3,4
4,5,6
5,6,7
7,8,9
6,7,8
如果对文件4.txt,第一列降序,第二列升序排序,其命令和结果如下:
#
sort -t "," -k 1nr,1 -k 2n,2 4.txt
7,8,9
6,7,8
5,5,3
5,6,7
5,8,3
4,5,6
4,7,9
3,4,2
3,5,6
2,3,4
1,2,3
如上排序结果,第一列按照降序排序,第二列按照升序排序。
注意:
“-k”选项在进行多列排序时的参数格式“-k 1nr,1 -k 2n,2”。
7选项“-o”的用法
Sort命令的
选项“-o”,其作用是将排序结果输出到文件中
,其命令格式为:“sort … -o filename”。上文提到,sort命令排序结果可以使用重定向,保存输出到其他文件中。如果排序内容保存到原文件中中,直接使用重定向,会覆盖清空文件。比如下面命令:
# cat result.txt
failed
given
missed
one
one
survived
waiting
weekly
won
#
sort result.txt > result.txt
# cat result.txt
#
可以看出,使用sort命令输出重定向后,原文件result.txt被清空。
如果将排序结果输出覆盖原文件,只能使用选项“-o”,命令如下:
# cat 5.txt
3,5,6
4,7,9
5,8,3
3,4,2
5,5,3
1,2,3
2,3,4
4,5,6
5,6,7
7,8,9
6,7,8
#
sort -t "," -k 1nr,1 -k 2n,2 5.txt -o 5.txt
# cat 5.txt
7,8,9
6,7,8
5,5,3
5,6,7
5,8,3
4,5,6
4,7,9
3,4,2
3,5,6
2,3,4
1,2,3
从上面命令和执行结果可以看出选项“-o”,能够将sort命令输出内容输出到输入文件中。这就是选项“-o”和重定向“>”的不同之处了。
8选项“-M”的用法
Sort命令的
选项“-M”,其作用是把首三个字母作为月份缩写,然后进行月份排序
。例如文件6.txt内容如下:# cat 6.txt
mar
dec
oct
sep
feb
aug
使用选项“-M”进行排序,结果如下:
# sort -M 6.txt
feb
mar
aug
sep
oct
dec
从排序结果看出,文件内容按照月份缩写从小到大进行了排序。
注意: