awk词频统计功能

[root@test88 ~]# vim word_freq.sh

#!/bin/bash
if [ $# -ne 1 ];then
    echo "Usage: $0 filename";
    exit -1
fi

filename=$1

egrep -o "[[:alpha:]]+" $filename | awk '{count[$0]++}END{printf("%-14s%s
","Word","Count");for (ind in count){ printf("%-14s%d
",ind,count[ind]);}}'


[root@test88 ~]# sh word_freq.sh test.txt 
Word          Count
test          1
oldboy        1
liyong        1


#egrep -o 表示只打印匹配到的字符,由换行符分割
#是正则表达式里的单词边界符,位于能构成单词的字符(字母数字下划线)和不能构成单词的字符之间
#比如一段文本:
[root@test88 ~]# vim boundary.txt

peter 2is learning linux.

[root@test88 ~]# egrep -o  "[[:alpha:]]+" boundary.txt 
peter
is
learning
linux

[root@test88 ~]# egrep -o  "[[:alpha:]]+" boundary.txt 
peter
learning                 #is没匹配出来
linux

#显然单词边界的作用在于先划定一段区域,从非单词部分开始到非单词部分结束,然后看区域内容是否匹配。从而能保证连续的一段内一定全是字母,没有数字或者下划线。通常写单词都是一个单词空一个,如果单词内出现数字或下划线就不认为是单词。如果不加实际上匹配的是一串连续字母。

#count是一个关联数组,count[$0]表示索引为$0的值,当使用count[$0]++的时候,count[$0]的值默认为0的整型,而且这个值是变化的,索引每重复一次,值就加一。
原文地址:https://www.cnblogs.com/Peter2014/p/7596128.html