Life with teacher Lemon.

Linux sort 命令详解

2021.02.19 | 共 1271 字,阅读需约 3 分钟.

sort 命令,是 Linux 下负责排序的命令,可以对单个或者多个文本文件的内容进行排序,默认对文件内容的每一行按照空格分割,排序不会对当前文件内容进行修改,而是直接打印到标准输出控制台。当然,如果要保存排序结果,可以使用重定向命令。下面我们来详细看一下 sort 命令的用法。

默认排序

sort 命令默认是对文本的每一行作为一个单位,从前到后,按照 ASCII 码值的大小,升序排序。

$ cat test.txt
BJ 100 98
SZ 99 100
GZ 98 98
SH 100 99

$ sort test.txt
BJ 100 98
GZ 98 98
SH 100 99
SZ 99 100

sort -b 排序

-b 选项会忽略掉行首的空白字符,以第一个可见字符进行排序

$ cat test.txt
   BJ 100 98
 SZ 99 100
  GZ 98 98
SH 100 99

# 这里默认排序,SZ 排在了 SH 之前,显然不是我们需要的结果
$ sort test.txt
   BJ 100 98
  GZ 98 98
 SZ 99 100
SH 100 99

# 使用 -b 选项排序,结果正常
$ sort -b test.txt
   BJ 100 98
  GZ 98 98
SH 100 99
 SZ 99 100

sort -c 排序

-c 选项是对当前文本内容是否已经排序进行的检查,打印出首次没有正确排序的行内容

$ cat test.txt
BJ 100 98
SZ 99 100
GZ 98 98
AK 100 90
SH 100 99

$ sort -c test.txt
sort: test.txt:3: disorder: GZ 98 98

sort -d 排序

-d 选项和 -b 相反,将空白符纳入进行排序

$ cat test.txt
   BJ 100 98
GZ 98 98
 SZ 99 100
   SH 100 99
   
$ sort -d test.txt

   BJ 100 98
   SH 100 99
 SZ 99 100
GZ 98 98

sort -f 排序

-f 选项,将字符转换成大写后再排序

$ cat test.txt
BJ 100 98
GZ 98 98
SZ 99 100
sH 100 99

$ sort -f test.txt
BJ 100 98
GZ 98 98
sH 100 99
SZ 99 100

sort -k 指定列排序

-k 选项可以指定第几列排序,sort 默认以空格做为列分割符

$ cat test.txt
BJ 100 98
GZ 98 98
SZ 99 100
sH 100 99

$ sort -k2 test.txt
BJ 100 98
sH 100 99
GZ 98 98
SZ 99 100

此时可以看到按照第二列排序后,100 在前面,是因为第二列的内容默认按照字符串来排序的,所以 1 小于 9,显然,这不是我们希望的结果,接下来我们就需要用到 -n 选项。

sort -n 排序

-n 选项是将排序的内容转换成数字来进行比较,比如上面按照第二列排序,我们加上 -n 选项来试试

$ cat test.txt
BJ 100 98
GZ 98 98
SZ 99 100
sH 100 99

$ sort -k2 -n test.txt
GZ 98 98
SZ 99 100
BJ 100 98
sH 100 99

-n 选项只能将非科学计数法的字符串转换成数字比较,如果数字是科学计数法,那么请使用 -g

sort -t 排序

sort 默认是按照空格来分割的,而 -t 选项可以使用指定的分隔符,我们来试试 -t 选项

$ cat test.txt
BJ 100:98
GZ 98:98
SZ 99:100
SH 100:99

$ sort -t ':' -k2 -n test.txt
BJ 100:98
GZ 98:98
SH 100:99
SZ 99:100

可以看到,我们使用 -t 选项指定 : 为分隔符后对第二列(冒号后那一列)按照数字进行排序,结果显示正确。

sort -u 排序

-u 选项是对行内容做去重处理后排序

$ cat test.txt
BJ 100:98
GZ 98:98
SZ 99:100
SZ 99:100
SH 100:99

$ sort -u test.txt
BJ 100:98
GZ 98:98
SH 100:99
SZ 99:100

sort -r 逆序

-r 选项支持按照逆序进行排序

$ cat test.txt
BJ 100:98
GZ 98:98
SZ 99:100
SH 100:99

$ sort -r test.txt
SZ 99:100
SH 100:99
GZ 98:98
BJ 100:98

sort -k 指定列的起止位排序

比如我们需要对第一列,从第二个字符开始排序,可以使用 -kx.x 的格式

$ cat test.txt
BJ 100:98
GZ 98:98
SZ 99:100
SH 100:99

$ sort -k1.2 test.txt
SH 100:99
BJ 100:98
GZ 98:98
SZ 99:100

sort -o 保存排序结果

-o 选项指定文件来保存我们的排序结果

$ cat test.txt
BJ 100:98
GZ 98:98
SZ 99:100
SH 100:99

# 保存到新文件
$ sort -k1.2 test.txt -o test2.txt

$ ls
test.txt  test2.txt

$ cat test2.txt
SH 100:99
BJ 100:98
GZ 98:98
SZ 99:100

# 保存到原文件
$ sort -k1.2 test.txt -o test.txt

$ cat test.txt
SH 100:99
BJ 100:98
GZ 98:98
SZ 99:100

sort -m 合并多个已排序文件

$ cat test.txt
2
4
6
9

$ cat test2.txt
1
3
7
10

# 此时是按照字符串的排序结果,但 10 放在test2.txt尾部,所以会在 7 后,在 9 之前,因为 1 比 9 小
$ sort -m test.txt test2.txt
1
2
3
4
6
7
10
9

# 加上 -n 选项,结果正确
$ sort -m -n test.txt test2.txt
1
2
3
4
6
7
9
10

如果针对排序列以数字进行排序,一定要注意加上 -n 或者 -g 选项,否则会出现意想不到的结果,关于 sort 命令就介绍到这里。

今日诗词