![9c90d58a83a5af791bf46c9505a9f60c.png](https://i-blog.csdnimg.cn/blog_migrate/cea4969c54e2bbc81b9c524cb727ae7b.jpeg)
今天华为 ICT 学院 Big Data HCIA 集训班演示 MapReduce 的时候用了一个统计文本文件中每个词出现命令的命令行例子,针对这行命令,我针对一些边界情况进行了改进。
讲师的例子:
cat test.txt | tr ' ' 'n' | sort | uniq -c | awk '{print $2"t"$1}' | sort -k2 -nr | less
命令拆解:
cat test.txt | #输出文本文件内容
tr ' ' 'n' | #将所有空格改为换行符
sort | #按单词首字母顺序排序
uniq -c | #放一起并计数
awk '{print $2"t"$1}' | #依次对每一行进行处理(此处为把单词移动到第一列,计的数字放第二列),然后输出
sort -k2 -nr | #按照第二列倒序排列
less #非一次性输出,可用方向键流式输出
我的改进:
cat test.txt | tr 'A-Z' 'a-z' | tr '!?"“”‘’:;/[/]//{}(),.tn' ' ' | tr "'" " " | tr ' ' 'n' | sort | uniq -c | awk '{print $2"t"$1}' | sort -k2 -nr | less
命令拆解:
cat test.txt |
tr 'A-Z' 'a-z' | #大写字母换成小写字母 ,因为 The 和 the 是一个单词
tr '!?"“”‘’:;/[/]//{}(),.tn' ' ' | #文本中的常见标点符号替换成空格
tr "'" " " | #去掉单引号
tr ' ' 'n' |
sort |
uniq -c |
awk '{print $2"t"$1}' |
sort -k2 -nr |
less
如果不想对各种情况分别进行处理,可以选择直接去除掉文件中的各种字符 tr -dc "[a-z][A-Z]n",然而这种直接粗暴消掉文件中所有标点和符号的方式,会导致如 URL 这张种边际情况,本来应该是按照'/'或'.'分词,但现在是直接一个网址被解析成了一个长字符串如“wwwbaiducom“ Copyright ©https://zhuanlan.zhihu.com/ysimonguo-research. All Rights Reserved
后续提升空间:
- 将多个空格变成一个并将空行去掉 如 tr -s "[ n]"
- 如果还存在其它特殊符号,比如` 或 ~,那么需要在第一步中一起让空格替换掉它们