Linux命令-sort和uniq

sort

sort,见名知意,就是用来排序的,默认使用当前字符集排序规则。sort命令会读取每一行输入,以每一行作为一个单位相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

示例演示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@test ~]$ cat testfile
ccccc 5
aaaaa 14
aaaaa3
aaaaa 12
bbbbb 10
bbbbb 10
bbbbb 1
eeeee 3
ddddd 7

[root@test ~]$ sort testfile
aaaaa 12
aaaaa 14
aaaaa3
bbbbb 1
bbbbb 10
bbbbb 10
ccccc 5
ddddd 7
eeeee 3

从这个例子看,似乎一行行比较的时候遇到空格或者制表符会将这种空白符过滤掉?

参数选项

-t:用于指定分隔符。
-k:指定用来排序的列数。
-n:以数值来排序。
-t-k可以联合起来使用,例如如下的文本company.txt

1
2
3
4
google|110|5000
baidu|100|5000
taobao|50|3000
sohu|80|4500

第一个域是公司名称,第二个域是员工人数,第三个域是员工平均工资。
如果要按照员工人数排序,可以这样操作:

1
2
3
4
5
[root@test ~]$ sort -n -t '|' -k 2 company.txt
taobao|50|3000
sohu|80|4500
baidu|100|5000
google|110|5000

注意,这里的-n是不能省略的,如果没有-n参数,将会按照数字的ASCII码来排序,结果如下:

1
2
3
4
5
[root@test ~]$ sort -t '|' -k 2 company.txt
baidu|100|5000
google|110|5000
taobao|50|3000
sohu|80|4500

-r:以降序排序,因为sort命令默认是升序排序的。
-b:忽略每一行前面的空白字符。
-f:将所有的小写当成大写字母。

uniq

uniq的作用是去除相邻位置的重复行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@server01 tmp]# cat file 
bbbbbbbb
bbbbbbbb
aaaaaaaa
dddddddd
cccccccc
bbbbbbbb
bbbbbbbb
bbbbbbbb

[root@server01 tmp]# uniq file
bbbbbbbb
aaaaaaaa
dddddddd
cccccccc
bbbbbbbb

可以看到前面2行相邻的 bbbbbbbb 去重后变成了一行,同理,后面3行相邻的 bbbbbbbb 也变成了一行。

uniq和sort联合使用,先sort将文件按行排序,所有相同的行就会出现在相连的地方,然后再使用uniq,可以去掉文件中所有重复的行。

1
2
3
4
5
[root@server01 tmp]# sort file | uniq
aaaaaaaa
bbbbbbbb
cccccccc
dddddddd

常用的选项
-c选项,显示输出中,在每行行首加上本行在文件中出现的次数。

1
2
3
4
5
[root@server01 tmp]# sort file |uniq -c
1 aaaaaaaa
5 bbbbbbbb
1 cccccccc
1 dddddddd

-d选项,只显示重复行。

1
2
[root@server01 tmp]# sort file |uniq -d
bbbbbbbb

-u选项,只显示文件中不重复的各行。

1
2
3
4
[root@server01 tmp]# sort file |uniq -u
aaaaaaaa
cccccccc
dddddddd

从上边的例子也可以看出,uniq一般会和sort搭配使用,两者搭配,可以实现很多功能。

------ 本文完 ------