leetcode192 词频统计bash
假设 words.txt 内容如下:
the day is sunny the the the sunny is is
你的脚本应当输出(以词频降序排列):
the 4 is 3 sunny 2 day 1
你需要使用一行unix pipes实现
方法一:
awk '{for(i = 1;i <= NF;i++){++m[$i]}} END{for(k in m){print k" "m[k]}}' words.txt | sort -nr -k 2
awk默认逐行检索,默认以空格划分每条记录。
- 例如这里
for(i=1;i<=NF;++i){++m[$i]}
就是将每一行分隔的字段,进行词频统计。NF是分隔的字段数。 - awk中的数组可以用作hashtable做来词频统计。
- END{#在检索文本后的操作}
sort语法复习
- sort -n 将字符串转数字
- sort -r 指定顺序为从大到小
- sort -k 2 指定第二个字段作为排序判断标准
方法二:
cat words.txt | tr -s ' ' '\n' | sort | uniq -c | sort -rn | awk '{print $2, $1}'
tr -s ' ' '\n'
是将所有连续的空格 空行删除并保证每一行只有一个字符串sort | uniq -c
通常一起用来统计重复出现的次数。
方法三:
我们也可以用awk来去除空行并使得每行只有一个字符,
并利用awk打印
awk '{i=1;while(i<=NF){print $i;i++}}' words.txt | sort | uniq -c | sort -rn | awk '{print $2, $1}'
参考链接:
1. https://blog.csdn.net/u013246898/article/details/80240024
2. https://blog.csdn.net/wangxiaobupt/article/details/45201817
个性签名:时间会解决一切