Chinaunix首页 | 论坛 | 博客
  • 博客访问: 465203
  • 博文数量: 93
  • 博客积分: 5006
  • 博客等级: 上校
  • 技术积分: 1002
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-30 13:58
文章分类

全部博文(93)

文章存档

2012年(2)

2011年(68)

2010年(23)

分类: Python/Ruby

2011-08-02 09:46:38

sort 
sort命令的功能是对文件中的各行进行排序。sort命令有许多非常实用的选项,这些选项最初是用来对数据库格式的文件内容进行各种排序操作的,Sort命令将逐行对文件中的内容进行排序,如果两行的首字符相同,该命令将继续比较这两行的下一字符,如果还相同,将继续进行比较。

 语法:
  sort [选项] 文件
  说明:sort命令对指定文件中所有的行进行排序,并将结果显示在标准输出上。如不指定输入文件或使用”- “,则表示排序内容来自标准输入。
  主要选项
    - m 若给定文件已排好序,合并文件。
 
  - c 检查给定文件是否已排好序,如果它们没有都排好序,则打印一个出错信息,并以状态值1退出。
 
  - u 对排序后认为相同的行只留其中一行。
 
  - o 输出文件 将排序输出写到输出文件中而不是标准输出,如果输出文件是输入文件之一,sort先将该文件的内容写入一个临时文件,然后再排序和写输出结果。
 
  改变缺省排序规则的选项主要有:
 
  - d 按字典顺序排序,比较时仅字母、数字、空格和制表符有意义。
 
  - f 将小写字母与大写字母同等对待。
 
  - i 忽略非打印字符。
 
  - M 作为月份比较:”JAN”<"FEB" 

  - r 按逆序输出排序结果。
 
  - b 在每行中寻找排序关键字时忽略前导的空白(空格和制表符)。
 
   - t separator 指定字符separator作为字段分隔符。 

sort实例
一、以传统的ASCLL码顺序排序
文件内容:
panda@panda-pc:~/Code/Shell$ cat pswd
root:x:0:0:root:/root:/bin/bash
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
排序结果:
panda@panda-pc:~/Code/Shell$ sort pswd
bin:x:2:2:bin:/bin:/bin/sh
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
root:x:0:0:root:/root:/bin/bash
sys:x:3:3:sys:/dev:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh

二、以字段排序
排序文件仍然是刚才的文件
排序结果为:
panda@panda-pc:~/Code/Shell$ sort -t: -k4,4 pswd   这是以第四个字段进行排序,-t如果不指定,则表示空白
root:x:0:0:root:/root:/bin/bash
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
games:x:5:60:games:/usr/games:/bin/sh

panda@panda-pc:~/Code/Shell$ sort -k2.4,5.6 pswd   点的使用,表示从第二个字段的第四个字符开始比较,一直比较到第五个字符的第六个位置
bin:x:2:2:bin:/bin:/bin/sh
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
root:x:0:0:root:/root:/bin/bash
sys:x:3:3:sys:/dev:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
注:如果你要再进一步的控制排序后的结果,可以在字段选择器內,加入一个修饰字符,定义字段的数据类型及排序顺序,如sort -t: -k3nr pswd ,该语句同 sort -t: -k3,3 -n - r (这里的第四个字段是字符串,第三个字段是数字,所以在比较完数字后就结束了,所以,-k3nr 不会出错的)。

其他
对于排序后的数据可以使用 > 存储于一个文件中   如 sort pswd >pswd_new
可以用命令cat把多个文件合并,然后用管道操作把合并后的文本行输入给命令sort,sort命令将输出这些合并及排序后的文本行。如下所示
 $ cat 1 2 | sort > 1and2
稳定性:
看一个例子
panda@panda-pc:~/Code/Shell$ sort -t_ -k1,1 -k 2,2 <> one_two
> one_two_three
> one_two_four
> one_two_five
> EOF
one_two
one_two_five
one_two_four
one_two_three
这里以第一个字段和第二个字段为键值,排序这四行,每条记录里的排序字段相同,但输入和输出却不是一致的,所以sort并不稳定

补救方法:
panda@panda-pc:~/Code/Shell$ sort -t_ -k1,1 -k 2,2 <one_two
one_two_three
one_two_four
one_two_five
EOF
one_two
one_two_three
one_two_four
one_two_five
这样输入与输出就一致了,这是GNU实现了coreutils包弥补的不足  
可到  下载

uniq 命令
3个选项:
-c:可在每个行输出前面加上该行的重复次数
-d:只显示重复的行
-u:
只显示不重复的行
例子:

panda@panda-pc:~/Code/Shell$ cat pswdo
terr
unus
duo
terr
unus
duo
duo
panda@panda-pc:~/Code/Shell$ sort pswdo | uniq
duo
terr
unus
panda@panda-pc:~/Code/Shell$ sort pswdo | uniq -c
      3 duo
      2 terr
      2 unus
panda@panda-pc:~/Code/Shell$ sort pswdo | uniq -d
duo
terr
unus
panda@panda-pc:~/Code/Shell$ sort pswdo | uniq -u   因为每行都重复,所以没有不重复的行,故,无任何输出





阅读(2143) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~