说明:基于前几篇文章在写选项的时候带上了长选项格式,排版比较混乱,从本篇文章开始将不再介绍长格式选项,想了解的请对照man自行对应。
概述
sort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出。如果 File 参数指定多个文件,那么 sort 命令将这些文件连接起来,并当作一个文件进行排序。sort命令既可以从特定的文件,也可以从stdin中获取输入。
sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出
本文基于sort版本:GNU coreutils 8.4
语法
sort [OPTION]... [FILE]...
sort [OPTION]... --files0-from=F
选项
Options | Details |
---|---|
-b | 忽略排序字段或关键字中开头的空格 |
-d | 在关键字中只考虑[a-zA-Z0-9]字符. 即处理英文字母、数字及空格字符外,忽略其他的字符 |
-f | 将关键字中的小写字母折合成大写字母. |
-g | 按照通常的数字值顺序作比较,暗含-b |
-i | 在关键字中只考虑[\040-\0176]字符.即除了040至176之间的ASCII字符外,忽略其他的字符 |
-M | 按(未知的)<JAN'<...< DEC’的顺序比较,暗含-b;即将前面3个字母依照月份的缩写进行排序 |
-h | 按自然语言进行比较如2k,1g |
-n | 按照字符串的数值顺序比较,暗含-b |
-R | 通过关键字随机hash排序 |
-r | 颠倒比较的结果. |
-l | 按照当前环境排序. |
-c | 会检查文件是否已排好序,如果乱序,则输出第一个乱序的行的相关信息,最后返回1 |
-C | 会检查文件是否已排好序,如果乱序,不输出内容—第一次乱序的内容,仅返回1 |
-k POS1[,POS2] | 从关键字POS1开始,到POS2结束. 字段数和字符偏移量都从1开始计数(与基于零的+POS格式作比较) |
-m | 合并已经排序好的文件,不排序. |
-o FILE | 将结果写入FILE而不是标准输出. |
-s | 通过屏蔽最后的再分类比较来稳定排序. |
-t SEP | 指定排序时所用的栏位分隔字符。使用SEP来替代空格的转换non-. |
-T DIRECTORY | 使用DIRECTORY作为临时文件,而不是$TMPDIR或者/tmp |
-u | 如果有-c,则按严格的顺序进行检查; 如果有-m,则只输出相等顺序的第一个. |
-z | 以0字节结束行,而不是使用换行符,这是为了找到-print0 |
–help | 显示帮助并退出. |
–version | 输出版本信息并退出. |
POS为F[.C][OPTS],这里的F指的是字段数,而C为字段中的字符位置,这在-k中是从开始计数的,而在过时的格式中是从零开始的.OPTS可由一个或多个Mbdfinr组成;这有效地屏蔽了对于那个关键字的全局-Mbdfinr设置.如果没有指定关键字,则使用整行作为关键字.如果没有FILE,或者FILE是-,则从标准输入读取
实例
准备文本文件
[root@wmstianjin16172 ~]# cat testSort.txt
name age dept mark
yl 30 1 000
sl 25 2 130
ag 35 5 134
uq 26 3 141
uq 26 3 141
ag 35 5 134
uq 26 3 141
Uq 24 3 141
1、不使用任何参数对文件按行进行ASCII码排序
[root@wmstianjin16172 ~]# sort testSort.txt
ag 35 5 134
ag 35 5 134
name age dept mark
sl 25 2 130
Uq 24 3 141
uq 26 3 141
uq 26 3 141
uq 26 3 141
yl 30 1 000
2、使用-k选项对第二列进行排序
[root@wmstianjin16172 ~]# sort -k2 testSort.txt
Uq 24 3 141
sl 25 2 130
uq 26 3 141
uq 26 3 141
uq 26 3 141
yl 30 1 000
ag 35 5 134
ag 35 5 134
name age dept mark
3、使用-n选项,对数字进行排序
[root@wmstianjin16172 ~]# sort -nk2 testSort.txt
name age dept mark
Uq 24 3 141
sl 25 2 130
uq 26 3 141
uq 26 3 141
uq 26 3 141
yl 30 1 000
ag 35 5 134
ag 35 5 134
4、使用-r选项倒序排列
[root@wmstianjin16172 ~]# sort -rnk2 testSort.txt
ag 35 5 134
ag 35 5 134
yl 30 1 000
uq 26 3 141
uq 26 3 141
uq 26 3 141
sl 25 2 130
name age dept mark
5、使用-u选项去重
[root@wmstianjin16172 ~]# sort -unk2 testSort.txt
name age dept mark
Uq 24 3 141
sl 25 2 130
uq 26 3 141
yl 30 1 000
ag 35 5 134
当然这里指的是第二列的值重复
6、使用-t选项
用字符’2’替换默认的分隔符TAB
[root@wmstianjin16172 ~]# sort -t2 -nk2 testSort.txt
ag 35 5 134
ag 35 5 134
name age dept mark
yl 30 1 000
Uq 24 3 141
sl 25 2 130
uq 26 3 141
uq 26 3 141
uq 26 3 141
7、混合选项-t指定分割符,对2,3字段域进行数字排列,对1字段域进行数值排列
[root@wmstianjin16172 ~]# sort -t"2" -nk2,3 -k1 testSort.txt
ag 35 5 134
ag 35 5 134
name age dept mark
yl 30 1 000
Uq 24 3 141
sl 25 2 130
uq 26 3 141
uq 26 3 141
uq 26 3 141
8、使用-o选项
[root@wmstianjin16172 ~]# sort -t, -nk1 testSort.txt -o sortRes.txt
[root@wmstianjin16172 ~]# cat sortRes.txt
ag 35 5 134
ag 35 5 134
name age dept mark
sl 25 2 130
Uq 24 3 141
uq 26 3 141
uq 26 3 141
uq 26 3 141
yl 30 1 000
9、使用-R选项
[root@wmstianjin16172 ~]# sort -R testSort.txt
uq 26 3 141
sl 25 2 130
Uq 24 3 141
name age dept mark
uq 26 3 141
uq 26 3 141
yl 30 1 000
ag 35 5 134
ag 35 5 134
每次都不一样,不知道它的用处是什么,打乱重新组织?
10、使用-c/-C选项
[root@wmstianjin16172 ~]# sort -C testSort.txt
[root@wmstianjin16172 ~]# echo $?
1
[root@wmstianjin16172 ~]# sort -c testSort.txt
sort: testSort.txt:3: disorder: sl 25 2 130
[root@wmstianjin16172 ~]# echo $?
1
11、-b、-f、-M等就不在此举例了