Linux 常用命令之 sort

sort 将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按 ASCII 码值进行比较,最后将他们按升序输出。

常用参数:

1
2
3
4
5
6
sort -r #默认升序,-r降序
sort -u #去除重复行
sort -n #按数字排序
sort -o #重定向
sort -t #指定间隔符,和 cut -d 选项类似
sort -k #指定第几列

默认排序

1
2
3
4
5
6
7
8
9
10
11
12
13
gax@ubuntu:~$ cat seq.txt
banana
apple
pear
orange
pear
gax@ubuntu:~$ sort seq.txt
apple
banana
orange
pear
pear

去除重复行

1
2
3
4
5
gax@ubuntu:~$ sort -u seq.txt
apple
banana
orange
pear

按降序排序

1
2
3
4
5
6
gax@ubuntu:~$ sort -r seq.txt
pear
pear
orange
banana
apple

重定向

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
gax@ubuntu:~$ cat seq.txt
banana
apple
pear
orange
pear
gax@ubuntu:~$ sort -ru seq.txt
pear
orange
banana
apple
gax@ubuntu:~$ sort -ru seq.txt -o seq1.txt
gax@ubuntu:~$ cat seq1.txt
pear
orange
banana
apple

sort 默认按字符排序,出现数字 10 比数字 2 小的原因是,sort 将数字当成字符比较,首先比较数字 10 的第一位 1 比数字 2 小。想要按照数字排序,需要加 -n

1
2
3
4
5
6
7
8
9
10
gax@ubuntu:~$ sort number.txt
1
10
2
20
3
4
6
7
8
1
2
3
4
5
6
7
8
9
10
gax@ubuntu:~$ sort -n number.txt
1
2
3
4
6
7
8
10
20

当一行出现多种区域时,默认按行首字母排序,可以通过参数 -t -k 选择不同的域。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
gax@ubuntu:~$ cat company.txt
google:110:5000
baidu:100:5000
guge:50:3000
sohu:100:4500
gax@ubuntu:~$ sort company.txt
baidu:100:5000
google:110:5000
guge:50:3000
sohu:100:4500
gax@ubuntu:~$ sort -t ':' -k2n company.txt
guge:50:3000
baidu:100:5000
sohu:100:4500
google:110:5000

参数 -t 指定分隔符,-k 选择不同的域,-t ':' -k2n 表示,以 : 号为分隔符,选择第二列,并按照数字排列。我们看到第二列有相同的数字,此时可以增加条件,当第二列相同时,按照第三列来排序。

1
2
3
4
5
gax@ubuntu:~$ sort -t ':' -k2n -k3n company.txt
guge:50:3000
sohu:100:4500
baidu:100:5000
google:110:5000

-k 选项的语法格式:[ FStart [ .CStart ] ][ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ] ,这个语法格式可以被其中的 , 分为两大部分,Start 部分和 End 部分。如果不设定End 部分,那么就认为End 被设定为行尾。

Start 部分由三部分组成,其中的 Modifier 部分就是我们之前说过的类似 nr 的选项部分。C.Start 是可以省略的,省略的话就表示从本域的开头部分开始。之前例子中的 -k2-k3 就是省略了 C.Start

FStart.CStart,其中 FStart 表示使用的域,而 CStart 则表示在 FStart 域中从第几个字符开始算排序首字符。

同理,在 End 部分中,你可以设定 FEnd.CEnd,如果你省略 .CEnd,则表示到域尾,即本域的最后一个字符。或者,如果你将 CEnd 设定为 0,也是表示结尾到域尾。

1
2
3
4
5
gax@ubuntu:~$ sort -t : -k1.2 company.txt
baidu:100:5000
sohu:100:4500
google:110:5000
guge:50:3000

-k1.2 表示从第一列的第二个字符开始排序,因为没有给出 End 部分,所以默认到最后一个字符。可以看到 sohugoogle 第二个都是 o 但是 sohu 第三个是 h ,所以排在前面。

如果只以第二个字符排序,我们可以使用下面的命令:

1
2
3
4
5
gax@ubuntu:~$ sort -t : -k1.2,1.2 company.txt
baidu:100:5000
google:110:5000
sohu:100:4500
guge:50:3000

参考资料

linux排序–sort命令

sort命令

《sort帮你排序》-linux命令五分钟系列之二十六

赞赏是对作者最大的支持!
0%