本文共 2254 字,大约阅读时间需要 7 分钟。
Ubuntu14.04
给定一个文本,统计其中单词出现的次数
方法1
# solution 1
grep与awk配合使用,写成一个sh脚本 fre.sh
sh fre.sh wordfretest.txt
#! /bin/bash # solution 1if [ $# -eq 0 ]thenecho "Usage:$0 args error"exit 0fiif [ $# -ge 2 ]thenecho "analyse the first file $1"fi#get the first filefilename=$1grep -E -o "\b[[:alpha:]]+\b" $filename | awk ' { count[$0]++ } END{printf("%-20s%s\n","Word","Count");for(word in count){printf("%-20s%s\n",word,count[word])}}'
###########################
# 先判断输入是否正确,如果输入大于1个文件,用第一个文件
# 用grep把单词提取出来,用awk来统计这些单词;最后打印出来
###########################
补充说明:
参数说明: -eq:等于 -ne:不等于-le:小于等于-ge:大于等于-lt:小于-gt:大于\b backspace printf参数 | awk说明 awk由内容和动作组成;awk pattern {action} pattern可以是 BEGIN; END; expression; expression , expression; 可以执行 for ( var in array ) statement |
1.BEGIN模块:这个模块包括了一个操作块(也就是"{ }"内的内容)。该操作块是在文件输入之前执行的, 也就是不需要输入任何文件数据,也能执行该模块。 BEGIN模块常用于设置修改内置变量如(OFS,RS,FS等),为用户自定义的变量赋初始值或者打印标题信息等。 BEGIN模块中的语句操作以“;”标志或者分行隔开。 eg: awk 'BEGIN{print "Hello World! Begin doing!"}' #输出字符串 2. END模块:与BEGIN模块相反,是处理完文件后的操作。不匹配任何输入行,常用于输出一些总结信息。 |
匹配表达式:
[[:alpha:]] 代表 字母
[[:alnum:]] 代表 字母与数字字符[a-zA-Z0-9]代表单个字母和数字字符grep -E "\b[[:alpha:]]+\b" move.sh
匹配到 move.sh 中所有的单词 grep -E -o "\b[[:alpha:]]+\b" move.sh 把匹配到的单词每行1个打印出来 "\b[[:alpha:]]+\b" 能匹配到整个单词
方法2
假设 words.txt 是目标文件,只用一行代码
# solution 2
awk -F' ' '{for(i=1;i<=NF;i=i+1){print $i}}' words.txt |sort|uniq -c|sort -nr|awk -F' ' '{printf("%s %s\n",$2,$1)}'
通常,awk逐行处理文本。awk每接收文件的一行,然后执行相应的命令来处理。
用legal文件来做示例$ cat /etc/legal The programs included with the Ubuntu system are free software;the exact distribution terms for each program are described in theindividual files in /usr/share/doc/*/copyright.Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted byapplicable law.
# 搜索统计单词“law”的个数$ awk -F : '/law/{count++} END{print "the count is ",count}' /etc/legalthe count is 1# 统计单词“the”的个数$ awk -F : '/the/{count++} END{print "the count is ",count}' /etc/legal the count is 3
找到指定单词,自定义变量count自增,最后输出语句和count值
命令sort,把各行按首字母排列顺序重新排列起来sort -nr,每行都以数字开头,按数字从达到小,排列各行uniq -c,统计各行出现的次数,并把次数打印在每行前端awk参数 NF - 浏览记录的域的个数综合起来,命令就是awk -F' ' '{for(i=1;i<=NF;i=i+1){print $i}}' /etc/legal |sort|uniq -c|sort -nr|awk -F' ' '{printf("%s %s\n",$2,$1)}'
最后的awk调换了单词和数字的位置
统计 /etc/legal 中单词出现次数,并以“单词 次数”格式输出结果转载地址:http://fmlhx.baihongyu.com/