注意:最后一条命令即可完成例子中所描述的问题,分开的每一步是为了让读者清晰地理解。
一、数据准备
首先准备单词统计文本:我们选择的是/etc/passwd文件做测试,为了避免误操作,我们将/etc/paswd下内容先进行备份。
cat /etc/passwd > ./test.txt
应用cat命令查看文本内容:
可以看到文件内容格式复杂,冒号,斜杠,横杠,空格 等分割符为单词统计造成一定难度,因此我们需要针对性的对单词进行分割。
二、数据清洗
本文通过sed命令对文本内容进行清洗。
# sed -e 是允许sed连续执行多条命令
# 's/[-|/| ]/:/g' 是将横杠,斜杠,空格的正则匹配符号全部替换成冒号
# 's/:\{1,\}/\n/g' 是将一个冒号或者多个冒号全部统一替换成换行符
cat test.txt | sed -e 's/[-|/| ]/:/g' -e 's/:\{1,\}/\n/g'
此时数据变为:
三、单词统计并计算最高数目排行榜
1、首先第一步对分割后的单词进行排序,将相同单词放到一起
# sort 作用是将文本内容按照相同单词放到一起
cat test.txt | sed -e 's/[-|/| ]/:/g' -e 's/:\{1,\}/\n/g' | sort
可得到效果图:
2、之后对排序后的单词进行统计
通过uniq命令进行单词统计
# uniq 作用是去重 -c 是将连续在一起的单词进行计数统计
# (需要注意的是uniq应该和sort一起使用,如果单词没有连续,那么统计就会出错)
cat test.txt | sed -e 's/[-|/| ]/:/g' -e 's/:\{1,\}/\n/g' | sort | uniq -c
效果图:
3、对单词出现次数进行排序并确定出现最多次数的10个单词
通过sort命令与head命令进行获取top操作
# sort -n 是按照数字进行排序 -r 是倒序排列 -t " " 按照空格进行分割 -k 1 去分割后的第一个元素
# sort这句主要意思是将一行数据以空格分割取第一个元素,并对第一个元素以数字大小进行倒序排序
# head 是取前10个数据 -n 10也是取前十个,如果取前20就将数字更换
cat test.txt | sed -e 's/[-|/| ]/:/g' -e 's/:\{1,\}/\n/g' | sort | uniq -c | sort -n -r -t " " -k 1 | head -n 10
效果图:
四、最终命令及效果图
cat test.txt | sed -e 's/[-|/| ]/:/g' -e 's/:\{1,\}/\n/g' | sort | uniq -c | sort -n -r -t " " -k 1 | head -n 10 | awk 'BEGIN {max=0;result="";print " 数量 单词"} {if($1>max) {max=$1;result=$2};print $0} END{print "出现次数最多的单词是["result"]"}'
最终效果图: