sort-命令

sort

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

格式:

1
2
Usage: sort [OPTION]... [FILE]...
or: sort [OPTION]... --files0-from=F

参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Ordering options:

-b, --ignore-leading-blanks 忽略每行前面开始出的空格字符。
-d, --dictionary-order 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。
-f, --ignore-case 排序时,将小写字母视为大写字母。
-g, --general-numeric-sort 按照常规数值排序
-i, --ignore-nonprinting 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。
-M, --month-sort 将前面3个字母依照月份的缩写进行排序。
-h, --human-numeric-sort 使用人类可读的数字(例如: 2K 1G)
-n, --numeric-sort 依照数值的大小排序。
-R, --random-sort 根据随机hash 排序
--random-source=FILE 从指定文件中获得随机字节
-r, --reverse 以相反的顺序来排序。
--sort=WORD 按照WORD 指定的格式排序:
一般数字-g,高可读性-h,月份-M,数字-n,
随机-R,版本-V
-V, --version-sort 按照常规数值排序

Other options:

--batch-size=NMERGE 一次最多合并NMERGE 个输入;如果输入更多则使用临时文件
-c, --check, --check=diagnose-first 检查输入是否已排序,若已有序则不进行操作
-C, --check=quiet, --check=silent 类似-c,但不报告第一个无序行
--compress-program=PROG 使用指定程序压缩临时文件;使用该程序
的-d 参数解压缩文件
--debug 为用于排序的行添加注释,并将有可能有问题的
用法输出到标准错误输出
--files0-from=F 从指定文件读取以NUL 终止的名称,如果该文件被
指定为"-"则从标准输入读文件名
-k, --key=KEYDEF 在位置1 开始一个key,在位置2 终止(默认为行尾)
-m, --merge 合并已排序的文件,不再进行排序
-o, --output=FILE 将排序后的结果存入指定的文件。
-s, --stable 禁用last-resort 比较以稳定比较算法
-S, --buffer-size=SIZE 禁用last-resort 比较以稳定比较算法
-t, --field-separator=SEP 使用SEP作为排序时所用的分隔符。
-T, --temporary-directory=DIR 使用指定目录而非$TMPDIR 或/tmp 作为
临时目录,可用多个选项指定多个目录
--parallel=N 将同时运行的排序数改变为N
-u, --unique 配合-c,严格校验排序;不配合-c,则只输出一次排序结果
-z, --zero-terminated 以0 字节而非新行作为行尾标志
--help 显示帮助
--version 显示版本信息

常用参数:

1
2
3
4
5
6
-n 按照数字排序。
-r 倒叙。
-t “.”表示按点号分隔域(awk -F ,cut -d 取段 -f)。
-u 相同的行,只输出一行。
-k 指定列进行排序。
-b会忽略每一行前面的所有空白部分,从第一个可见字符开始比较。

示例

按照数字正序排序

1
2
3
4
5
6
7
8
[root@MySQL /]# sort -n file1.txt
10.0.0.7 f
10.0.0.7 n
10.0.0.8 c
10.0.0.8 k
10.0.0.8 z
10.0.0.9 a
10.0.0.9 o

按照数字排序并倒叙

1
2
3
4
5
6
7
8
[root@MySQL /]# sort -nr file1.txt
10.0.0.9 o
10.0.0.9 a
10.0.0.8 z
10.0.0.8 k
10.0.0.8 c
10.0.0.7 n
10.0.0.7 f

按照第二列开始倒叙排序

-t 指定分隔符,-k2 表示按照第二列开始倒叙排序

1
2
3
4
5
6
7
8
[root@MySQL /]# sort -t" " -k2  -r file1.txt
10.0.0.8 z
10.0.0.9 o
10.0.0.7 n
10.0.0.8 k
10.0.0.7 f
10.0.0.8 c
10.0.0.9 a

-t 指定分隔符,-k2 表示按照第二列开始排序

1
2
3
4
5
6
7
8
[root@MySQL /]# sort -t" " -k2  file1.txt
10.0.0.9 a
10.0.0.8 c
10.0.0.7 f
10.0.0.8 k
10.0.0.7 n
10.0.0.9 o
10.0.0.8 z

先按照第一行排序,在按第三列排序并忽略空格 。

1
2
3
4
5
6
7
#sort -k 1 -n -k 3 emp.data
Beth 4.00 0
Dan 3.75 0
kathy 4.00 10
Susie 4.25 18
Mark 5.00 20
Mary 5.50 22

-n 参数讲解

测试文件内容

1
2
3
4
5
# cat info.txt
aa,201
zz,502
bb,1
ee,42

第一步 按照第二列倒叙排序

1
2
3
4
5
[root@linux-node2 111:33:23]#sort -t ',' -k2r info.txt
zz,502
ee,42
aa,201
bb,1

通过结果查看: 是按照第二列的首字母进行排序。

1
2
3
4
5
[root@linux-node2 111:33:30]#sort -t ',' -k2nr info.txt
zz,502
aa,201
ee,42
bb,1

加上 -n 后将第二列当成了一个整体进行排序。

结论:

  • 如果不加-n 默认按照列的第一个首字母排序,如果首字母相同排序第二列。
  • 如果加了-n,sort 会将值当成一个整数,而不是按照首字母排序。