一: 大体思路
比如要统计readme.txt的单词出现的次数
首先将文本中的标点符号换成空格,然后将大写字母换成小写字母(因为The == the),然后再将多个空格压缩为一个空格
,这时得到的就是一些单词了,单词之间都是用一个空格分开的。然后,用换行替换空格,然后把单词排序,这时得到的
文本可能有重复的单词,最后丢弃重复的单词,并排序数字即可。
二: 查看文本 readme.txt
[cyq@localhost Desktop]$ cat readme.txt
Blog: http://blog.csdn.net/longxibendi
NOTE: Accents have been stripped from words, e.g., 'etude'
does not mark the accent on the initial 'e'.
longxibendi@126.com
三: 需要将文本中的标点符号替换成空格 。我们用
tr 命令 tr 'set1' 'set2' < readme.txt 用 set2 替换 set1 如下:
tr '!?":;/[/]//{}()m,./t/n' ' ' < readme.txt
光上面的那一行命令不够,还需要去掉 ' (单引号),所以我们还需要 :
tr "'" " "
四: 将上面的结果的大写字母换成小写字母 ,因为 The 和 the 是一个单词。
tr 命令:
tr 'A-Z' 'a-z'
五: 将上面的结果多个空格,压缩为一个空格 :
tr -s ' '
六: 将空格替换成换行:
tr ' ' '/n'
七: 对单词进行排序:
sort
八: 去掉重复的行(单词)
uniq -c
九: 对这时的结果中的数字按照从大到小排序:
sort -rn
-n 按算术值对数字字段排序
-r 按从大到小排序
十: 注意,如果你的文本中有其他的特殊符号,比如` ~,那么需要在第一步中加入`~ ,让空格替换掉他们
最终命令及结果如下:
[cyq@localhost Desktop]$ tr '!?"@:;/[/]//{}(),./t/n' ' ' < readme.txt | tr "'" " "| tr 'A-Z' 'a-z' | tr -s ' ' | tr ' ' '/n' |sort | uniq -c | sort -rn
2 the
2 longxibendi
2 e
2 blog
1 words
1 stripped
1 on
1 note
1 not
1 net
1 initial
1 http
1 have
1 g
1 fro
1 etude
1 does
1 csdn
1 co
1 been
1 ark
1 accents
1 accent
1 126
[cyq@localhost Desktop]$
也就是这个命令:
tr '!`?"@:;/[/]//{}(),./t/n' ' ' < readme.txt | tr "'" " "| tr 'A-Z' 'a-z' | tr -s ' ' | tr ' ' '/n' |sort | uniq -c | sort -rn
提示:如果想得到最大,最小值,用tail head 等命令再重定向过滤一下。比如
[cyq@localhost Desktop]$ tr '!?"@:;/[/]//{}()m,./t/n' ' ' < readme.txt | tr "'" " "| tr 'A-Z' 'a-z' | tr -s ' ' | tr ' ' '/n' |sort | uniq -c | sort -rn |head -1 | awk '{print $1}'
2
[cyq@localhost Desktop]$
这个是得到最大值
参考: 《精通shell编程》 (第二版)
声明:本文档可以随意更改,但必须署名原作者
作者:凤凰舞者 qq:578989855