2016年7月27日星期三

Linux_108:常用命令之三十四:tr sort uniq

tr、sort、uniq 命令都是用来统计单词数的,wc 命令同样也可以统计单词的个数,但是要统计一个单词在一个文件中出现的次数,wc 命令就无能为力了。

1. tr (transliterate)
tr命令可以对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很强大。
 

1.1 语法:tr 选项 参数

1.2 选项
(1)-c 或 --complerment:取代所有不属于第1字符集的字符。
(2)-d 或 --delete:删除所有属于第1字符集的字符。
(3)-s 或 --squeeze-repeats:把连续重复的字符以单独一个字符表示。
(4)-t 或 --truncate-set1:先删除第一字符集较第二字符集多出的字符。

1.3 参数
(1)字符集1:指定要转换或删除的原字符集。当执行转换操作时,必须使用参数“字符集2”指定转换的目标字符集。但执行删除操作时,不需要参数“字符集2”;
(2)字符集2:指定要转换成的目标字符集。

1.3 例子
(1)tr '!?":;\[\]{}(),.' ' ' < ch15.doc
去除文件中的所有标点和分隔符。
(2)echo "HELLO WORLD" | tr 'A-Z' 'a-z' hello world
大写转小写。
(3)echo "hello 123 world 456" | tr -d '0-9'
删除数字。
(4)cat text | tr '\t' ' '
制表符转为空格。
(5)echo "thissss is a text linnnnnnne." | tr -s ' sn'
压缩重复的字符。

2. sort
将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后按升序输出。

2.1 语法:sort [options] 文件名

2.2 选项
(1)-u:除去重复行。
(2)-r:sort 默认按升序排,使用 -r 后按降序排。
(3)-o:把排序结果输出到原文件。
(4)-n:按照数值而不是字符排序。比如:按照数字排 10 比 2 大,按照字符排 10 比 2 小。
(5)-t:指定间隔符。
(6)-k:指定列数。
(7)-f:会将小写字母都转换为大写字母来进行比较,亦即忽略大小写。
(8)-c:检查文件是否已排好序,如果乱序,则输出第一个乱序的行的相关信息,并返回1。
(9)-C:会检查文件是否已排好序,如果乱序,不输出内容,只返回1。
(10)-M:以月份来排序,比如 JAN 小于 FEB 等等。
(11)-b:忽略每一行前面的所有空白部分,从第一个可见字符开始比较。

2.3 例子
(1)sort -r number.txt -o number.txt
按降序排列,并写入原文件。
(2)sort -n -k 2 -t : fruits.txt
以第2列水果数量排序。
文件有三列,列与列之间用冒号隔开,第1列表示水果类型,第2列表示水果数量,第3列表示水果价格。
banana:30:5.5
apple:10:2.5
pear:90:2.3
orange:20:3.4

3. uniq
输出一个文件中所有的唯一的行, 对于那些连续重复的行只显示一次。

3.1 语法:uniq [-cdu][-f<栏位>][-s<字符位置>][-w<字符位置>][--help][--version][输入文件][输出文件]

3.2 选项
(1)-c: 在每列旁边显示该行重复出现的次数。
(2)-d: 仅显示重复出现的行列。
(3)-f: 忽略比较指定的栏位。
(4)-s: 忽略比较指定的字符。
(5)-u: 仅显示出一次的行列。
(6)-w: 指定要比较的字符。
(7)-n:前n个字段和每个字段前的空白一起被忽略。
(8)+n:前n个字符被忽略。

3.3 例子
(1)uniq -c fruits.txt
显示每一行出现的次数和内容。
(2)uniq -d fruits.txt  
仅显示文件中连续重复出现的行。
(3)uniq -u fruits.txt
显示文件中没有连续出现的行。
 
参考文献:
1. http://man.linuxde.net/tr
2. http://www.cnblogs.com/51linux/archive/2012/05/23/2515299.html
3. http://blog.chinaunix.net/uid-26495963-id-3282526.html