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 因为每行都重复,所以没有不重复的行,故,无任何输出
阅读(2199) | 评论(0) | 转发(0) |