MST

星途 面试题库

面试题:Bash下awk与grep高效处理海量文本

有一个非常大的文本文件`large_data.txt`,其内容为大量的单词,每行一个单词。现在要求使用Bash中awk与grep结合的方式,找出出现次数排名前10的单词及其出现次数,并且要求在处理过程中尽量减少内存的占用,提高处理效率,写出具体的实现命令及简要思路。
40.0万 热度难度
编程语言Bash

知识考点

AI 面试

面试题答案

一键面试

实现命令

awk '{count[$0]++} END {for (word in count) {print count[word], word}}' large_data.txt | sort -nr | head -n 10

简要思路

  1. 使用awk统计单词出现次数awk '{count[$0]++} END {for (word in count) {print count[word], word}}' large_data.txt这部分awk命令,在逐行读取文件large_data.txt时,使用关联数组count统计每个单词出现的次数。在END块中,遍历关联数组,输出每个单词的出现次数和单词本身。这种方式每次处理一行数据,不需要一次性将整个文件读入内存,有效减少内存占用。
  2. 使用sort进行排序sort -nrawk输出的结果进行排序,-n表示按数字大小排序,-r表示逆序,这样出现次数多的单词排在前面。
  3. 使用head获取前10个head -n 10从排序后的结果中取出前10行,即出现次数排名前10的单词及其出现次数。

这里未用到grep,因为仅用awksorthead即可高效完成任务。如果非要结合grep,可在前面增加grep筛选出符合特定模式的单词,如grep '^[a-zA-Z]+$' large_data.txt | awk '{count[$0]++} END {for (word in count) {print count[word], word}}' | sort -nr | head -n 10,此例中grep '^[a-zA-Z]+$'筛选出仅由字母组成的单词,再进行后续统计和排序等操作。