简介
sort 是用来排序的,Unix Shell 的传统是对问本行做处理,因此 sort 也是对文本行进行排序,如果需要排序字段,则可以通过指定 -k,-t 等选项来实现。
用法
代码语言:javascript复制sort [options]... [file]...
默认排序规则:
- 数字开头的行会排在字母开头行之前
- 字母序排序(不分大小写)
- 小写字母会排在相同的大写字母之前
Options
Flag | 描述 |
---|---|
-r, --reverse | 倒序 |
-o, --output=FILE | 排序结果输出到文件中 |
-u, --unique | 对相同的行进行过滤 |
-b, --ignore-leading-blanks | 忽略首部空格 |
-d, --directory-order | 只考虑空格,字母与数字 |
-f, --ignore-case | 忽略大小写(F means fold)(Fold lower case to upper case characters.) |
-i, --ignore-nonprinting | 忽略不可打印字母,仅根据可打印字母排序 |
-n, --numeric-sort | 转换为数字排序 |
-m, --merge | 合并已排好序的文件 |
-t, --field-separator=SEP | 使用SEP 而非空格将行切分成字段,与 -k 一起使用 |
-k, --key=POS1[,POS2] | 使排序使用的key 从 POS1(默认1) 开始,POS2(默认行尾) 结束(POS 格式见下) |
-R, --random-sort | 使用随机哈希排序 |
-c, --check | 只检查文件是否已排序 |
--help | 打印帮助 |
--version | 打印版本 |
POS 的形式为 F[.C][OPTS]
, F 是字段序号,C 是字段中字符的位置,默认都为1, 如果没有指定 -t 与 -b ,默认从行首算起。 OPTS 指定字段排序形式,可覆盖外面的排序选项(r,n)
例子
字母序排序文件
sort data
将排序结果保存到单独文件中
sort data > output
或 sort -o output data
倒序排序
sort -r data
检查文件是否已排序
sort -c data
根据字段进行排序
我们有如下文件 data
代码语言:javascript复制1 Alfred
2 Jay
3 Dave
4 Bernad
如果我们直接使用 sort data
, 输出不会有任何变化,因为行首是已经排序好的,我们想对人名进行排序,此时就可以使用 -k 选项来指定 sort -k 2 data
, 它的输出就变成了
1 Alfred
4 Bernad
3 Dave
2 Jay
指定起始的字段排序
我们有如下data 文件
代码语言:javascript复制01 Joe Sr.Designer
02 Marie Jr.Developer
03 Albert Jr.Designer
04 Dave Sr.Developer
我们如果要对职业进行排序可以使用 sort -k 3 data
, 但是职业分了等级,我们想将相同职业类型的人放在一起,此时就可以使用 F.C
格式来指定排序字段从第 C 个字母开始排序,忽略前面的字母, sort -k 3.3 data
, 如果需要倒序排序可以指定OPTS, sort -k 3.3r data
也可以指定比较的 key 的范围, 上面例子中我们只想比较第三个到第五个字母 sort -k 3.3,3.5 data
, 也可以跨字段 sort -k 2.2,3.3 data
多个字段排序
sort -t: -k 2,2n -k 4,4nr data
以冒号分割字段,首先以数字形式比较第2列,如果相同再以数字形式倒序排序第4个字段
删除重复行
sort -u data
与 sort data | uniq
在整行时行为是一致的,不过如果我们使用了 -k
排序字段时, 两者的行为就不一致了, sort 的 -u
比较的是排序的key。
对data 进行sort -k 3.3 -u data
排序
data 数据
代码语言:javascript复制01 Joe Sr.Designer
02 Marie Jr.Developer
03 Albert Jr.Designer
04 Dave Sr.Developer
输出结果
代码语言:javascript复制01 Joe Sr.Designer
02 Marie Jr.Developer
排序多个文件
sort data1 data2
删除重复 sort -u data1 data2