sort排序、uniq去重、wc统计

准备操作文本

cat test.log
b	linux	1000	200	5KK
c	Debian	600	200	8K
a	mac	2000	500	2K
a	mac	2000	500	2K
b	linux	1000	200	5K
c	win7	2000	100	7G
c	Debian	600	200	8K
d	winxp	4000	300	3G
d	winxp	500	300	3G
c	win7	2000	100	7G
e	bsd	1000	600	4M
f	SUSE	4000	300	6M
d	winxp	4000	300	3G
g	winxp	500	300	3G
f	SUSE	4000	300	6M
g	winxp	500	300	3G
e	bsd	1000	600	4M
g	winxp	500	300	3G
cat test.bcp
b:linux:1000:200:5K
c:Debian:600:200:8K
a:mac:2000:500:2K
a:mac:2000:500:2K
b:linux:1000:200:5K
c:win7:2000:100:7G
c:Debian:600:200:8K
d:winxp:4000:300:3G
d:winxp:500:300:3G
c:win7:2000:100:7G
e:bsd:1000:600:4M
f:SUSE:4000:300:6M
d:winxp:4000:300:3G
g:winxp:500:300:3G
f:SUSE:4000:300:6M
g:winxp:500:300:3G
e:bsd:1000:600:4M
g:winxp:500:300:3G

一.sort 排序

  • sort命令用于 对文本文件内容,以行为单位来排序。
    
  • sort命令以空格作为字段分隔符,将一行分割为多个关键字对文件进行排序。
    
  • 需要注意的是除非你将输出重定向到文件中,否则sort命令并不对文件内容进行实际的排序(即文件内容没有修改),只是将文件内容按有序输出。
    

1.常用参数

参数说明
-m将几个排序好的文件进行合并。
-u内容去重
-n依照数值的大小排序,升序排列。
-o<输出文件>将排序后的结果存入指定的文件。
-r以相反的顺序来排序。
-t<分隔字符>指定排序时所用的栏位分隔字符。
-k<指定排序的列数>指定要排序的列数,默认是从第一列开始比较,-k可指定某一列,也可与-t 结合使用时,代表某一栏
-f将小写字母视为大写字母
-d将小写字母视为大写字母

2.用例

2.1.对文本排序(默认升序)

sort test.log
a	mac	2000	500	2K
a	mac	2000	500	2K
b	linux	1000	200	5K
b	linux	1000	200	5K
c	Debian	600	200	8K
c	Debian	600	200	8K
c	win7	2000	100	7G
c	win7	2000	100	7G
d	winxp	4000	300	3G
d	winxp	4000	300	3G
d	winxp	500	300	3G
e	bsd	1000	600	4M
e	bsd	1000	600	4M
f	SUSE	4000	300	6M
f	SUSE	4000	300	6M
g	winxp	500	300	3G
g	winxp	500	300	3G
g	winxp	500	300	3G

2.2对文件进行升序排序,并去除重复行 sort -u

sort -u test.log
a	mac	2000	500	2K
b	linux	1000	200	5K
c	Debian	600	200	8K
c	win7	2000	100	7G
d	winxp	4000	300	3G
d	winxp	500	300	3G
e	bsd	1000	600	4M
f	SUSE	4000	300	6M
g	winxp	500	300	3G

可以看出:

sort -u是先对内容进行排序,然后再去重(实际也是去除了相邻的重复行)。
而uniq不能实现排序,只能去除相邻的重复行,所以要跟sort合并使用,先用sort排序,再用uniq去重
sort test.log | uniq

2.3 以第三个字段数值大小排序(-k -n)

sort -nr -k 3 test.log
f	SUSE	4000	300	6M
f	SUSE	4000	300	6M
d	winxp	4000	300	3G
d	winxp	4000	300	3G
c	win7	2000	100	7G
c	win7	2000	100	7G
a	mac	2000	500	2K
a	mac	2000	500	2K
e	bsd	1000	600	4M
e	bsd	1000	600	4M
b	linux	1000	200	5K
b	linux	1000	200	5K
c	Debian	600	200	8K
c	Debian	600	200	8K
g	winxp	500	300	3G
g	winxp	500	300	3G
g	winxp	500	300	3G
d	winxp	500	300	3G

2.4 指定分隔符,并以第3列倒序排序(-t -k -r)

sort -t $'\t' -k 3,3 -n -r  test.log

注意:数值比较要加-n

f	SUSE	4000	300	6M
f	SUSE	4000	300	6M
d	winxp	4000	300	3G
d	winxp	4000	300	3G
c	win7	2000	100	7G
c	win7	2000	100	7G
a	mac	2000	500	2K
a	mac	2000	500	2K
e	bsd	1000	600	4M
e	bsd	1000	600	4M
b	linux	1000	200	5K
b	linux	1000	200	5K
c	Debian	600	200	8K
c	Debian	600	200	8K
g	winxp	500	300	3G
g	winxp	500	300	3G
g	winxp	500	300	3G
d	winxp	500	300	3G
sort -t ':' -k 3,3 -n -r  test.bcp
f:SUSE:4000:300:6M
f:SUSE:4000:300:6M
d:winxp:4000:300:3G
d:winxp:4000:300:3G
c:win7:2000:100:7G
c:win7:2000:100:7G
a:mac:2000:500:2K
a:mac:2000:500:2K
e:bsd:1000:600:4M
e:bsd:1000:600:4M
b:linux:1000:200:5K
b:linux:1000:200:5K
c:Debian:600:200:8K
c:Debian:600:200:8K
g:winxp:500:300:3G
g:winxp:500:300:3G
g:winxp:500:300:3G
d:winxp:500:300:3G

2.5 先以第4列排序,如果相同再以2列排序

sort -k 4n  -k 2r  test.log
c	win7	2000	100	7G
c	win7	2000	100	7G
b	linux	1000	200	5K
b	linux	1000	200	5K
c	Debian	600	200	8K
c	Debian	600	200	8K
d	winxp	500	300	3G
g	winxp	500	300	3G
g	winxp	500	300	3G
g	winxp	500	300	3G
d	winxp	4000	300	3G
d	winxp	4000	300	3G
f	SUSE	4000	300	6M
f	SUSE	4000	300	6M
a	mac	2000	500	2K
a	mac	2000	500	2K
e	bsd	1000	600	4M
e	bsd	1000	600	4M

对比

sort -k 4n test.log
c	win7	2000	100	7G
c	win7	2000	100	7G
b	linux	1000	200	5K
b	linux	1000	200	5K
c	Debian	600	200	8K
c	Debian	600	200	8K
d	winxp	4000	300	3G
d	winxp	4000	300	3G
d	winxp	500	300	3G
f	SUSE	4000	300	6M
f	SUSE	4000	300	6M
g	winxp	500	300	3G
g	winxp	500	300	3G
g	winxp	500	300	3G
a	mac	2000	500	2K
a	mac	2000	500	2K
e	bsd	1000	600	4M
e	bsd	1000	600	4M

2.6以第2列的第3个字母排序

sort -t $'\t' -k 2.3   test.log
c	Debian	600	200	8K
c	Debian	600	200	8K
a	mac	2000	500	2K
a	mac	2000	500	2K
e	bsd	1000	600	4M
e	bsd	1000	600	4M
c	win7	2000	100	7G
c	win7	2000	100	7G
b	linux	1000	200	5K
b	linux	1000	200	5K
d	winxp	4000	300	3G
d	winxp	4000	300	3G
d	winxp	500	300	3G
g	winxp	500	300	3G
g	winxp	500	300	3G
g	winxp	500	300	3G
f	SUSE	4000	300	6M
f	SUSE	4000	300	6M

2.7先只以第2列的第2个字母排序,相同后再以第3列数值降序排列

sort -t $'\t' -k 2.2,2.2 -k 3nr    test.log
a	mac	2000	500	2K
a	mac	2000	500	2K
c	Debian	600	200	8K
c	Debian	600	200	8K
d	winxp	4000	300	3G
d	winxp	4000	300	3G
c	win7	2000	100	7G
c	win7	2000	100	7G
b	linux	1000	200	5K
b	linux	1000	200	5K
d	winxp	500	300	3G
g	winxp	500	300	3G
g	winxp	500	300	3G
g	winxp	500	300	3G
e	bsd	1000	600	4M
e	bsd	1000	600	4M
f	SUSE	4000	300	6M
f	SUSE	4000	300	6M

2.8 -u去重是针对排序项

如:

sort -t $'\t' -k 2.2,2.2 -u    test.log

只要第二列第2个怎么相同,就会去重

a	mac	2000	500	2K
c	Debian	600	200	8K
b	linux	1000	200	5K
e	bsd	1000	600	4M
f	SUSE	4000	300	6M

二、uniq 去重

1. 常用参数

OPTION说明
-c统计出现的次数
-d只显示被计算为重复的行
-D显示所有被计算为重复的行
-c显示唯一值,即没有重复值的行
-i忽略大小写
-z在末尾使用\0,而不是换行符
-s跳过多少个字符开始比较重复值
-f跳过多少个字段(field)开始比较重复值
-w比较重复值时每行比较的最大长度,即对每行多长的字符进行比较
## 2. uniq使用
uniq命令用于去重文件内容中的连续重复行,通常要跟sort一起使用,先利用sort排序,然后用uniq去重。
uniq命令与sort命令类似,并不对文件内容进行实际的排序(即文件内容没有修改),只是在输出内容中去重。
uniq -c :显示每一行重复的次数

3. 用例

3.1 默认排序去重(全排序,全比较)

 sort -t $'\t' test.log |uniq

去重前:

a	mac	2000	500	2K
a	mac	2000	500	2K
b	linux	1000	200	5K
b	linux	1000	200	5K
c	Debian	600	200	8K
c	Debian	600	200	8K
c	win7	2000	100	7G
c	win7	2000	100	7G
d	winxp	4000	300	3G
d	winxp	4000	300	3G
d	winxp	500	300	3G
e	bsd	1000	600	4M
e	bsd	1000	600	4M
f	SUSE	4000	300	6M
f	SUSE	4000	300	6M
g	winxp	500	300	3G
g	winxp	500	300	3G

去重后:

a	mac	2000	500	2K
b	linux	1000	200	5K
c	Debian	600	200	8K
c	win7	2000	100	7G
d	winxp	4000	300	3G
d	winxp	500	300	3G
e	bsd	1000	600	4M
f	SUSE	4000	300	6M
g	winxp	500	300	3G

3.2 以第3列数值排序后去重

排序数据

d	winxp	500	300	3G
g	winxp	500	300	3G
g	winxp	500	300	3G
g	winxp	500	300	3G
c	Debian	600	200	8K
c	Debian	600	200	8K
b	linux	1000	200	5K
b	linux	1000	200	5K
e	bsd	1000	600	4M
e	bsd	1000	600	4M
a	mac	2000	500	2K
a	mac	2000	500	2K
c	win7	2000	100	7G
c	win7	2000	100	7G
d	winxp	4000	300	3G
d	winxp	4000	300	3G
f	SUSE	4000	300	6M
f	SUSE	4000	300	6M

全比较:

 ssort -t $'\t' -k 3n,3n test.log |uniq
d	winxp	500	300	3G
g	winxp	500	300	3G
c	Debian	600	200	8K
b	linux	1000	200	5K
e	bsd	1000	600	4M
a	mac	2000	500	2K
c	win7	2000	100	7G
d	winxp	4000	300	3G
f	SUSE	4000	300	6M

从第3列开始比较:

sort -t $'\t' -k 3n,3n test.log |uniq -f 3
d	winxp	500	300	3G
c	Debian	600	200	8K
b	linux	1000	200	5K
e	bsd	1000	600	4M
a	mac	2000	500	2K
c	win7	2000	100	7G
d	winxp	4000	300	3G
f	SUSE	4000	300	6M

统计从第3列开始比较重复次数:

sort -t $'\t' -k 3n,3n test.log |uniq -f 3
      4 d	winxp	500	300	3G
      2 c	Debian	600	200	8K
      2 b	linux	1000	200	5K
      2 e	bsd	1000	600	4M
      2 a	mac	2000	500	2K
      2 c	win7	2000	100	7G
      2 d	winxp	4000	300	3G
      2 f	SUSE	4000	300	6M

显示所有重复行:

sort -t $'\t' -k 3n,3n test.log |uniq -f 3  -D
d	winxp	500	300	3G
g	winxp	500	300	3G
g	winxp	500	300	3G
g	winxp	500	300	3G
c	Debian	600	200	8K
c	Debian	600	200	8K
b	linux	1000	200	5K
b	linux	1000	200	5K
e	bsd	1000	600	4M
e	bsd	1000	600	4M
a	mac	2000	500	2K
a	mac	2000	500	2K
c	win7	2000	100	7G
c	win7	2000	100	7G
d	winxp	4000	300	3G
d	winxp	4000	300	3G
f	SUSE	4000	300	6M
f	SUSE	4000	300	6M

三. wc统计

1. 常用参数

参数说明
-lline,统计行数;
-wword,统计单词数(英文单词),以空格或换行为单位;
-m统计字符数;

版权声明:本文为baidu_38981831原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。