面试中有的让写一条shell统计WordCount
leetcode也有这个题,链接地址
为了简单起见,我们设定:
words.txt
只包括小写字母和' '
。- 每个单词只由小写字母组成。
- 单词间由一个或多个空格字符分隔。
words.txt
内容如下:
the day is sunny the the
the sunny is is
你的脚本应当输出(以词频降序排列):
the 4 is 3 sunny 2 day 1
解法一:
cat words.txt | tr -s ' ' ' '|sort|uniq -c |sort -r|awk '{print $2" "$1}'
cat ——浏览文件
tr -s ——替换字符串(空格换为换行)保证了一行一个单词
sort ——默认ASCII值排序,排序号后还会有重复
uniq —— 只能统计并删除连续的重复行,去重,-c再输出重复次数。结果就是 ”4 abc“ abc出现了4次
sort -r —— 反向排序,也就是从大到小。得到按频率高低的结果
awk ——格式化输出,规定输出是先字符串再重复次数,所以先$2再$1,中间空格分隔
解法二:
cat words.txt | xargs -n1 | sort|uniq -c |sort -rn|awk '{print $2" "$1}'
xargs 分割字符串 -n 1表示每行输出一个 可以加-d指定分割符
sort
-r : 降序排列
-n : 以数字排序,默认是按照字符排序的。
解法三:
cat words.txt | sed 's/ / /g' | awk NF | sort | uniq -c | sort -nr | awk '{print $2 " " $1}'
sed搜索并替换,sed 's/要被取代的字串/新的字串/g'
awk NF 代表一行有多少个域 (也就是一行有多少个单词)
awk $NF代表最后一个域 (也就是最后一个单词)