You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

152 lines
4.6 KiB

6 years ago
# sort
7 years ago
6 years ago
## 说明
7 years ago
**sort命令** 是在Linux里非常有用它将文件进行排序并将排序结果标准输出。sort命令既可以从特定的文件也可以从stdin中获取输入。
6 years ago
awk 'EXPRESSION { PROGRAM }' file(s)
7 years ago
6 years ago
## 选项
7 years ago
6 years ago
```sh
7 years ago
-b忽略每行前面开始出的空格字符
-c检查文件是否已经按照顺序排序
-d排序时处理英文字母、数字及空格字符外忽略其他的字符
-f排序时将小写字母视为大写字母
-i排序时除了040至176之间的ASCII字符外忽略其他的字符
-m将几个排序号的文件进行合并
-M将前面3个字母依照月份的缩写进行排序
-n依照数值的大小排序
-o<输出文件>:将排序后的结果存入制定的文件;
-r以相反的顺序来排序
-t<分隔字符>:指定排序时所用的栏位分隔字符;
+<起始栏位>-<结束栏位>:以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
```
### 实例
sort将文件/文本的每一行作为一个单位相互比较比较原则是从首字符向后依次按ASCII码值进行比较最后将他们按升序输出。
```
root@[mail text]# cat sort.txt
aaa:10:1.1
ccc:30:3.3
ddd:40:4.4
bbb:20:2.2
eee:50:5.5
eee:50:5.5
[root@mail text]# sort sort.txt
aaa:10:1.1
bbb:20:2.2
ccc:30:3.3
ddd:40:4.4
eee:50:5.5
eee:50:5.5
```
忽略相同行使用-u选项或者uniq
```
[root@mail text]# cat sort.txt
aaa:10:1.1
ccc:30:3.3
ddd:40:4.4
bbb:20:2.2
eee:50:5.5
eee:50:5.5
[root@mail text]# sort -u sort.txt
aaa:10:1.1
bbb:20:2.2
ccc:30:3.3
ddd:40:4.4
eee:50:5.5
或者
[root@mail text]# uniq sort.txt
aaa:10:1.1
ccc:30:3.3
ddd:40:4.4
bbb:20:2.2
eee:50:5.5
```
sort的-n、-r、-k、-t选项的使用
```
[root@mail text]# cat sort.txt
AAA:BB:CC
aaa:30:1.6
ccc:50:3.3
ddd:20:4.2
bbb:10:2.5
eee:40:5.4
eee:60:5.1
#将BB列按照数字从小到大顺序排列
[root@mail text]# sort -nk 2 -t: sort.txt
AAA:BB:CC
bbb:10:2.5
ddd:20:4.2
aaa:30:1.6
eee:40:5.4
ccc:50:3.3
eee:60:5.1
#将CC列数字从大到小顺序排列
[root@mail text]# sort -nrk 3 -t: sort.txt
eee:40:5.4
eee:60:5.1
ddd:20:4.2
ccc:50:3.3
bbb:10:2.5
aaa:30:1.6
AAA:BB:CC
# -n是按照数字大小排序-r是以相反顺序-k是指定需要爱排序的栏位-t指定栏位分隔符为冒号
```
**-k选项的具体语法格式**
-k选项的语法格式
```
FStart.CStart Modifie,FEnd.CEnd Modifier
-------Start--------,-------End--------
FStart.CStart 选项 , FEnd.CEnd 选项
```
这个语法格式可以被其中的逗号`,`分为两大部分, **Start** 部分和 **End** 部分。Start部分也由三部分组成其中的Modifier部分就是我们之前说过的类似n和r的选项部分。我们重点说说`Start`部分的`FStart`和`C.Start`。`C.Start`也是可以省略的,省略的话就表示从本域的开头部分开始。`FStart.CStart`,其中`FStart`就是表示使用的域,而`CStart`则表示在`FStart`域中从第几个字符开始算“排序首字符”。同理在End部分中你可以设定`FEnd.CEnd`,如果你省略`.CEnd`则表示结尾到“域尾”即本域的最后一个字符。或者如果你将CEnd设定为0(零),也是表示结尾到“域尾”。
从公司英文名称的第二个字母开始进行排序:
```
$ sort -t ' ' -k 1.2 facebook.txt
baidu 100 5000
sohu 100 4500
google 110 5000
guge 50 3000
```
使用了`-k 1.2`表示对第一个域的第二个字符开始到本域的最后一个字符为止的字符串进行排序。你会发现baidu因为第二个字母是a而名列榜首。sohu和 google第二个字符都是o但sohu的h在google的o前面所以两者分别排在第二和第三。guge只能屈居第四了。
只针对公司英文名称的第二个字母进行排序,如果相同的按照员工工资进行降序排序:
```
$ sort -t ' ' -k 1.2,1.2 -nrk 3,3 facebook.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000
```
由于只对第二个字母进行排序,所以我们使用了`-k 1.2,1.2`的表示方式,表示我们“只”对第二个字母进行排序。(如果你问“我使用`-k 1.2`怎么不行当然不行因为你省略了End部分这就意味着你将对从第二个字母起到本域最后一个字符为止的字符串进行排序。对于员工工资进行排 序,我们也使用了`-k 3,3`这是最准确的表述表示我们“只”对本域进行排序因为如果你省略了后面的3就变成了我们“对第3个域开始到最后一个域位置的内容进行排序” 了。
6 years ago
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->