统计words文件 (/usr/share/dict/words) 中包含至少三个a 且不以's 结尾的单词个数。这些单词中,出现频率前三的末尾两个字母是什么? sed的 y命令,或者 tr 程序也许可以帮你解决大小写的问题。共存在多少种词尾两字母组合?还有一个很 有挑战性的问题:哪个组合从未出现过?
思路
按照题目要求,将其分解进行分解
(1)找到至少 3 个 a 且不以 's 结尾的单词
(2)提取单词的末两位
(3)对末两位分组统计
(4)和全部排列组合比较,那些没有出现过
(1)找到至少 3 个 a 且不以 's 结尾的单词
原本想使用一条正则,但并没有成功,只能使用两条语句组合
grep -E ".*a.*a.*a" /usr/share/dict/words | grep -E -v "'s$"
(2)提取单词后两位
这里使用 sed 的正则分组匹配功能,将后两位设置为组1,然后将整个字符串替换为组1
sed "s/.*\(..$\)/\1/"
(3)对末两位进行分组统计
首先对结果进行排序,然后使用 uniq -c
对输入的行分组统计,再利用 sort -r
反向排序,取前三就用 head -n 3
sort | uniq -c | sort -n -r
(4)和全部组合比较
# 上边的结果会输出两列,先取字符那一列然后顺序排列保存为文件 a.txt
awk '{print $2}' | sort > a.txt
# 生成全部的排列组合,用换行代替空格
echo {a..z}{a.zz} | sed 's/ /\n/g' > b.txt
# 最后用 comm 命令找出在 b.txt 中出现的,但不在 a.txt 中出现的
comm -3 b.txt a.txt