Shell 统计每个单词出现的个数

Shell 统计每个单词出现的个数

题目

写一个 bash脚本以统计一个文本文件 nowcoder.txt 中每个单词出现的个数。

为了简单起见,你可以假设:
nowcoder.txt只包括小写字母和空格。
每个单词只由小写字母组成。
单词间由一个或多个空格字符分隔。

示例:
假设 nowcoder.txt 内容如下:
welcome nowcoder
welcome to nowcoder
nowcoder
你的脚本应当输出(以词频升序排列):
to 1
welcome 2
nowcoder 3

说明:
不要担心个数相同的单词的排序问题,每个单词出现的个数都是唯一的。

题解

之前学习的命令都是以一行为处理对象,awk是可以对一行的某个字段进行处理

先把每个字段分割出来,每个字段打印出来成一行,用uniq显示一个并统计词频,但是注意使用uniq前需要排序,因为unqi只会将挨着的重复行删除

[ranan@MPI1 ~]$ cat nowcoder.txt | awk '{for(i=1;i<=NF;i++){print $i}}' | sort | uniq -c
      3 nowcoder
      1 to
      2 welcome

接下来的处理是需要以词频升序sort,并且交换输出的顺序,这里又牵扯到对字段进行处理,使用awk

[ranan@MPI1 ~]$ cat nowcoder.txt | awk '{for(i=1;i<=NF;i++){print $i}}' | sort | uniq -c | sort -nk2 | awk '{print $2,$1}'
to 1
welcome 2
nowcoder 3

关于把各个字段单独放在一行还有其他的处理办法

  • tr
  • xargs

tr

把空格替换成换行符

cat nowcoder.txt | tr -s ' ' '\n' | sort | uniq -c | sort -n |awk '{print $2 $1}'

xargs

读出来的数据作为echo的参数进行输出
-n1 表示参数每次以1个

cat nowcoder.txt | xargs -n1 | sort | uniq -c | sort -n |awk '{print $2 $1}'

学习

在评论区学到的写法,太厉害了

感觉像哈希表的写法,一个字段一个字符进哈希表。

awk '{
 for (i = 1; i <= NF; ++i)
     mp[$i]++;
}
END {
 for (k in mp)
     print(k, mp[k]); #print输出会换行
}' | sort -n -k2
posted @ 2021-12-09 15:49  rananie  阅读(488)  评论(0)    收藏  举报