使用 Shell - 更深入地了解字母和单词的使用
我曾多次恳求你们,亲爱的读者们,我的请求是“一封信!我的专栏,不,我的王国,只为一封读者来信!”瞧,奇迹发生了,天堂打开了,天使歌唱了,一封信来了
除了字母和单词的频率之外,看看一个字母作为单词的第一个字母出现的频率如何?为了让事情更有趣,两个字母组合的频率是多少?例如,如果两个字母组合的第一个字母是 t,那么最常见的第二个字母是什么?感谢您在 Linux Journal 上的文章。这是一篇好文章,脚本也很棒。—Mike Short
Quando omni flunkus moritati.
首先,在我甚至阅读这封信之前,我就被结尾的引言吸引住了。拉丁语?那不是,就像,一种死语言吗?事实证明,这句引言很不错,特别是对于大型公司的 IT 管理员来说。它大致翻译为“当一切都失败时,装死”,它来自加拿大喜剧 Red Green Show。(感谢 Google。)
现在,进入信件的核心内容。Mike 指的是早期的专栏,我们在其中研究了如何使用 shell 脚本来确定字母和单词的使用情况,使用了三本书作为素材:《德古拉》、《美国历史》和《傲慢与偏见》,全部从古腾堡计划下载。
在这一系列专栏中,我们确定英语中最常见的十个字母是 e、t、a、o、n、i、s、r、h 和 d。如果我们将其限制为仅单词的第一个字母,它们是否相同?让我们来看看。
它是这样完成的
$ cat dracula.txt | tr ' ' '\ ' | grep -v '[^[:alpha:]]' | grep -v "^$"
这将把 德古拉 变成世界上最窄的书,每行一个单词。
现在我们只需添加到它,通过附加来删除除第一个字母以外的所有内容cut -c1。结果看起来像是电影 黑客帝国 中的那些字母流,但这又是另一个故事了。
所以,剩下的就是将大写字母转换为小写字母,排序,然后使用我们的朋友uniq -c来统计结果
tr '[:upper:]' '[:lower:]' | sort | uniq -c | sort -rn | head
而且,结果前十名是
20648 t 15787 a 11110 i 10655 w 9906 h 9030 s 7618 o 5720 m 5411 b 4597 f
非常不同!现在,问题是,它是否会根据内容类型而改变?让我们执行相同的命令,但这次,让我们输入我们所有的三本书,而不仅仅是 德古拉(尽管 暮光之城 <咳嗽咳嗽> 的狂热流行,也许 Linux Journal 最好在几个问题上坚持吸血鬼主题?)
34359 t 27053 a 18212 w 18119 h 17854 i 15746 s 13614 o 10076 b 9792 m 7712 f
这并不完全相同。这不是很意思吗?我不确定该如何理解它,但正如你所看到的,对 shell 脚本命令的良好掌握使得找出这种相当滑稽的信息变得有趣。
但是,我们还没有完全完成,因为 Mike 也想知道两个字母的组合。正是这种查询真正显示了掌握命令行会多么有帮助。要计算它,只需更改上面调用的命令中的一个字符。你知道是什么吗?
它是 cut 命令。上面,我们指定我们只想要输入行的第一个字符,使用cut -c1。如果我们想要前两个,我们可以简单地根据需要调整该命令标志。
但是,-c2不会起作用,因为那只会给我们每个单词的第二个字母(而英语中最常见的第二个字母是 o,其次是 h、e、a 和 n)。
相反,我们需要使用字母范围,它看起来像这样-c1-2。该调用的结果是
22100 th 10168 an 9138 to 7508 he 7100 of 5873 i<space> 5517 in 5332 ha 5157 be 4664 wh
给你,Mike。英语中最常见的两个字母组合是 th,这实际上很有道理,其次是 an,但差距很大。
我希望如何使用它来计算最常见的三字母组合是显而易见的(the 是最常见的三字母组合,其次是 and,这应该一点也不令人惊讶)。
我将在这里结束,但再次,我邀请您给我发送您的来信和查询,以便我们可以探索使用 shell 脚本的各种方法。
Dave Taylor 自 1980 年首次登录在线网络以来就一直参与 UNIX。这意味着,是的,他即将迎来 30 周年。你几乎可以在任何在线地方找到他,但从这里开始:www.DaveTaylorOnline.com。