Chinaunix首页 | 论坛 | 博客
  • 博客访问: 391035
  • 博文数量: 89
  • 博客积分: 3176
  • 博客等级: 中校
  • 技术积分: 1205
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-15 10:08
文章分类

全部博文(89)

文章存档

2011年(17)

2010年(19)

2009年(35)

2008年(18)

分类: LINUX

2010-08-26 14:11:08

平时在做数据文件分析时,经常用到 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


阅读(1148) | 评论(0) | 转发(0) |
0

上一篇:ipaclc IP计数器

下一篇:awk 多文件处理

给主人留下些什么吧!~~