平时在做数据文件分析时,经常用到 sort,uniq 排序工具,这次小结一下。
##############
#
# sort
#
##############
用途:
将输入行按照健值字段与数据类型选项以及locale排序
语法:
sort [ options ] [ file(s) ]
主要选项:
-b
忽略开头的空白
-c
检查输入是否已正确地排序。如输入未经排序,但退出吗(exit code)为非零值,则不会有任何输出
-d
字典顺序:仅文字数字与空白才有意义
-g
一般数值:以浮点数字类型比较字段。这个选项的运作有点类似-n,差别仅在于这个选项的数字可能有小数点及指数
-f
不区分大小写
-i
忽略无法打印的字符
-k
定义排序健值字段
-m
将已排序的输入文件,合并为一个排序后的输出数据流
-n
以整数类型比较字段
-o outfile
将输出写到指定的文件,而非标准输出。 可指定到输入文件,来改变原始文件
-r
倒置排序,由大变小
-t char
使用单个字符char作为默认的字段分隔字符,取代默认的空白字符
-u
去除“健值”重复的记录,只留一条
与uniq不同,后者删除“相邻”的,并“整条”记录完全相同的行
-k 选项后面接着的是一个字段编号,或一对数字,每个编号后面都可接一个点好的字符位置,或修饰符字母
说明:
1. 如果仅指定一个字段编号,则排序键会自该字段的开始处开始,一直继续到记录的结束(而非字段的结尾)
2. 如一对用逗号隔开的字段数字,则由第一个字段值开始,结束语第二个字段值结尾
3. 使用点号字符位置 -k2.4,5.6指从第二个字段的第四个字符开始,到第五个字段的第六个字符
4. 出现多个-k时,先从第一个健值字段开始排序,找出匹配该健值的记录后,在进行第二个健值字段的排序,以此类推
建立个小文件作为例子
hu:~/sh# more urfile
f 1 6
f 1 5
e 2 5
e 2 4
d 3 3
d 3 3
d 3 2
c 4 2
c 4 1
b 5 1
b 5 0
b 5 0
a 6 0
a 6 6
a 6 6
|
默认不带参数的sort,只根据第一个域做降序,与加参数 -k1,1 相同
hu:~/sh# sort urfile
a 6 0
a 6 6
a 6 6
b 5 0
b 5 0
b 5 1
c 4 1
c 4 2
d 3 2
d 3 3
d 3 3
e 2 4
e 2 5
f 1 5
f 1 6
|
根据第二个域,按照整数,做降序排列
hu:~/sh# sort -k2nr urfile
a 6 0
a 6 6
a 6 6
b 5 0
b 5 0
b 5 1
c 4 1
c 4 2
d 3 2
d 3 3
d 3 3
e 2 4
e 2 5
f 1 5
f 1 6
|
根据第一个域降序,在根据第三个与降序排列,结果直接写入sort.log里
hu:~/sh# sort -k1 -k3nr urfile -o sort.log
hu:~/sh# more sort.log
a 6 0
a 6 6
a 6 6
b 5 0
b 5 0
b 5 1
c 4 1
c 4 2
d 3 2
d 3 3
d 3 3
e 2 4
e 2 5
f 1 5
f 1 6
|
删除第一个域相同的行记录,并按降序排列
hu:~/sh# sort -k1,1 -ur urfile
f 1 6
e 2 5
d 3 3
c 4 2
b 5 1
a 6 0
|
注:-u 参数 删除健值重复的行记录,与uniq不同,后者删除整条记录完全相同的行
hu:~/sh# uniq urfile
f 1 6
f 1 5
e 2 5
e 2 4
d 3 3
d 3 2
c 4 2
c 4 1
b 5 1
b 5 0
a 6 0
a 6 6
|
############
#
# uniq
#
############
用途:删除“相邻”的,并整行记录重复的行
sort -u 是删除健值重复的记录,并不是记录完全重复的行,要完成后者,需要uniq工具
参数:
-d
只显示重复的行
-u
只显示未重复的行
-c
计数行出现次数
例:
只显示重复的行,并计算出现的次数
hu:~/sh# uniq -dc urfile
2 d 3 3
2 b 5 0
2 a 6 6
|
只显示未重复的行
hu:~/sh# uniq -u urfile
f 1 6
f 1 5
e 2 5
e 2 4
d 3 2
c 4 2
c 4 1
b 5 1
a 6 0
|
阅读(1168) | 评论(0) | 转发(0) |