准备操作文本
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 | 比较重复值时每行比较的最大长度,即对每行多长的字符进行比较 |
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. 常用参数
| 参数 | 说明 |
|---|---|
| -l | line,统计行数; |
| -w | word,统计单词数(英文单词),以空格或换行为单位; |
| -m | 统计字符数; |
版权声明:本文为baidu_38981831原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。