Ubuntu14.04

给定一个文本,统计其中单词出现的次数

# solution 1

grep与awk配合使用,写成一个sh脚本 fre.sh

sh fre.sh wordfretest.txt

#! /bin/bash# solution 1

if [ $# -eq 0 ]

then

echo "Usage:$0 args error"

exit 0

fi

if [ $# -ge 2 ]

then

echo "analyse the first file $1"

fi

#get the first file

filename=$1

grep -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"

能匹配到整个单词

另一个方法,假设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)}‘

时间: 08-30

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐