前言
在Linux下,有时候需要对文本内容进行排序,例如每行按照字典顺序排序,按照数字排序或者按照特定列排序等等。今天我们就借助一个命令-sort来满足我们对文本排序的需求。
按照字典顺序排序
假如有文本内容test1.txt如下:1
2
3
4
5
6
7
8
9
10Debian
Gentoo
Gentoo
CentOS
Fedora
ubuntu
Kali
redhat
Arch
OpenSuse
现在要对文本内容按照字典升序排序,只需使用下面的命令即可:1
sort test1.txt
输出结果如下:1
2
3
4
5
6
7
8
9
10Arch
CentOS
Debian
Fedora
Gentoo
Gentoo
Kali
OpenSuse
redhat
ubuntu
可以看到输出结果按照字典顺序的升序进行了排序。如果需要降序输出只需要使用-r参数,如:1
sort -r test1.txt
输出结果如下:1
2
3
4
5
6
7
8
9
10ubuntu
redhat
OpenSuse
Kali
Gentoo
Gentoo
Fedora
Debian
CentOS
Arch
去除重复行
我们看到前面有两行的内容是重复的,即Gentoo行,使用-u参数可以去掉重复的行:1
sort -u test1.txt
输出结果如下:1
2
3
4
5
6
7
8
9Arch
CentOS
Debian
Fedora
Gentoo
Kali
OpenSuse
redhat
ubuntu
在输出结果中,重复的Gentoo行被去掉了。
按照数字排序
假设有文本内容test2.txt如下,第一列为市值排名,第二列为公司名称,第三列为公司创建时间:1
2
3
4
52 google 1998
10 icbc 1984
5 tencent 1998
1 apple 1976
16 samsung 1938
按照前面的介绍,我们对内容排序结果如下:1
2
3
4
510 icbc 1984
16 samsung 1938
1 apple 1976
2 google 1998
5 tencent 1998
这不对啊,16怎么在1前面呢?很显然这是因为前面的排序都是字典排序,而我们实际需要的是按照数值大小进行排序,因此需要用到-n参数:1
sort -n test2.txt
最后的输出结果如下:1
2
3
4
51 apple 1976
2 google 1998
5 tencent 1998
10 icbc 1984
16 samsung 1938
可以看到,最终结果按照市值排名打印出来。
按照指定列排序
假如我们不想按照市值排名排序,而是按照公司名称排序呢?那么就需要按照指定列排序了。这里需要用到两个参数:
- -t 指定分隔符,未指定时,默认分隔符为空白
- -k 指定列排序
需要按照第二列,公司名称排序,因此排序命令如下:1
2sort -k 2 test2.txt #默认以空白作为分隔符
sort -k 2 -t ' ' sort2.txt #以空格为分隔符
结果如下:1
2
3
4
51 apple 1976
2 google 1998
10 icbc 1984
16 samsung 1938
5 tencent 1998
可以看到,最后会以第二列,即公司名称为依据排序输出。
以多列为依据排序
假设我们按照公司创建年份排序,如果年份相同,则按照公司名称排序,即分别以第三列,第二列为依据排序:1
sort -n -k 3 -k 2 test2.txt
输出结果如下:1
2
3
4
516 samsung 1938
1 apple 1976
10 icbc 1984
2 google 1998
5 tencent 1998
如果要按照年份降序排序,则只需加-r参数即可:1
sort -n -k 3r -k 2 test2.txt
输出结果如下:1
2
3
4
52 google 1998
5 tencent 1998
10 icbc 1984
1 apple 1976
16 samsung 1938
按照特定列的特定字符排序
假如我们想要按照公司名称的第二至第三个字符排序,可以使用下面的方式:1
sort -t ' ' -k 2.2,2.3 test2.txt
输出结果如下:1
2
3
4
516 samsung 1938
10 icbc 1984
5 tencent 1998
2 google 1998
1 apple 1976
-k 2.2,2.2指定了按照第二列排序,并且是第二列的第二个字符开始,到第三个字符结束。可以看到,由于samsung的第二个字母是a而排在开头。如果是以第二个字符开始,到最后一个字符结束,则用下面的命令即可:1
sort -t ' ' -k 2.2 test2.txt
保存排序结果
前面的排序命令仅仅是将排序结果打印到控制台,并没有修改源文件,如果想要将排序结果保存在文件中,需要使用-o参数:1
2
3sort test1.txt -o test1.txt #直接修改源文件
sort test1.txt -o output.txt #输出到另外一个文件
sort test1.txt > output.txt #重定向到output.txt中
如果想将排序结果保存在源文件中,只能使用-o参数,而如果是其他文件,既可以使用-o参数,也可以使用重定向。
检查是否乱序
sort同样也可以用来检查文本内容是否已经是排好序的。
例如:1
2sort -c test1.txt #打印结果,并告知无序开始的行数
sort -C test1.txt #不打印结果,但是命令的返回结果为1
合并已排序的文本
可以使用-m选项来合并已经排好序的文本,但不会重新排序。
例如:1
sort -m file1 file2
总结
以上就是使用sort命令对文本进行排序的常见使用方法,更多内容可使用man命令进行查看。常见选项如下:
- -r 按照降序排列
- -n 按照数值大小排列
- -k 按照指定列排列
- -t 指定分隔符
- -u 去重
- -o 输出结果到文件中