Difficulty: 中等
写一个 bash 脚本以统计一个文本文件 words.txt
中每个单词出现的频率。
为了简单起见,你可以假设:
words.txt
只包括小写字母和 ' '
。
- 每个单词只由小写字母组成。
- 单词间由一个或多个空格字符分隔。
示例:
假设 words.txt
内容如下:
1
2
|
the day is sunny the the
the sunny is is
|
你的脚本应当输出(以词频降序排列):
1
2
3
4
|
the 4
is 3
sunny 2
day 1
|
说明:
- 不要担心词频相同的单词的排序问题,每个单词出现的频率都是唯一的。
- 你可以使用一行 实现吗?
Solution
Language: ****
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# Read from the file words.txt and output the word frequency list to stdout.
# words.txt
awk '{
for(i=1;i<=NF;i++) {
words[$i]++
}
}END {
for(w in words) {
print(w,words[w])
}
}
' words.txt | sort -k2 -r -n
|
1
2
3
4
5
6
7
8
9
10
11
|
awk '{
for(i = 1; i <= NF; i++){
res[$i] += 1 #以字符串为索引,res[$i]相同的累计
}
}
END{
for(k in res){
print k" "res[k]
}
}' words.txt | sort -nr -k2
# n:按数值排序,r:倒序,k:按第2列排序
|
其他写法
1
2
3
4
|
# Read from the file words.txt and output the word frequency list to stdout.
cat words.txt | xargs -n 1 | sort | uniq -c | sort -nr | awk '{print $2" "$1}'
|