shell统计文本中单词的出现次数

简介: Ubuntu14.04 给定一个文本,统计其中单词出现的次数   方法1 # solution 1 grep与awk配合使用,写成一个sh脚本 fre.sh  sh fre.sh wordfretest.

Ubuntu14.04

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

 

方法1

# 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" 
能匹配到整个单词

 

方法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 the
individual files in /usr/share/doc/*/copyright.
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
# 搜索统计单词“law”的个数
$ awk -F : '/law/{count++} END{print "the count is ",count}' /etc/legal
the 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 中单词出现次数,并以“单词 次数”格式输出结果

目录
相关文章
|
1月前
|
存储 Shell Linux
【Shell 命令集合 文档编辑】Linux 文本统计 wc命令使用指南
【Shell 命令集合 文档编辑】Linux 文本统计 wc命令使用指南
36 0
|
3月前
|
Shell
Shell遍历HDFS路径统计层级目录大小
Shell遍历HDFS路径统计层级目录大小
|
1月前
|
Linux C语言 C++
Linux Shell_cut命令(按列提取文本字符)
Linux Shell_cut命令(按列提取文本字符)
17 0
|
1月前
|
算法 Shell Linux
【Shell 命令集合 文档编辑 】Linux 文本搜索 look 命令使用指南
【Shell 命令集合 文档编辑 】Linux 文本搜索 look 命令使用指南
26 0
|
1月前
|
算法 Shell Linux
【Shell 命令集合 文档编辑】Linux 文本搜索工具 grep命令使用指南
【Shell 命令集合 文档编辑】Linux 文本搜索工具 grep命令使用指南
30 4
|
8月前
|
运维 Shell Python
【运维知识高级篇】超详细的Shell编程讲解2(变量切片+统计变量长度+字串删除+字串替换+七种方法进行数值运算+整数比较+多整数比较+文件判断+字符串比对+正则比对+配合三剑客的高阶用法)(一)
【运维知识高级篇】超详细的Shell编程讲解2(变量切片+统计变量长度+字串删除+字串替换+七种方法进行数值运算+整数比较+多整数比较+文件判断+字符串比对+正则比对+配合三剑客的高阶用法)
89 0
|
5月前
|
Shell Linux C++
shell脚本 | C/C++ 统计文件单词个数
shell脚本 | C/C++ 统计文件单词个数
|
5月前
|
Shell 索引 Perl
通过shell脚本统计elasticsearch indices每天的数量以及大小
通过shell脚本统计elasticsearch indices每天的数量以及大小
33 0
|
8月前
|
运维 Shell Perl
【运维知识高级篇】超详细的Shell编程讲解2(变量切片+统计变量长度+字串删除+字串替换+七种方法进行数值运算+整数比较+多整数比较+文件判断+字符串比对+正则比对+配合三剑客的高阶用法)(二)
【运维知识高级篇】超详细的Shell编程讲解2(变量切片+统计变量长度+字串删除+字串替换+七种方法进行数值运算+整数比较+多整数比较+文件判断+字符串比对+正则比对+配合三剑客的高阶用法)(二)
92 0
|
8月前
|
Shell
Shell 统计行数(wc -l)
Shell 统计行数(wc -l)
82 0