如何在大文件中匹配查询词并提取该词与指定前缀的另一单词
解决方案
问题原因分析
- 原grep+awk组合方案的问题:仅完成了行过滤,没有捕获匹配到的查询词;同时
-F","指定按逗号分割字段,和实际空格分隔单词的场景不符,无法正确提取ABC开头的单词 - 原纯awk方案的问题:仅判断行首第一个单词是否为查询词,没有覆盖查询词在任意位置的场景,也没有实现提取ABC前缀单词的逻辑
最终实现代码
直接使用单条awk命令即可完成需求,针对12GB大文件做了适配优化,仅需加载查询词到内存,逐行扫描大文件无内存压力:
LC_ALL=C awk ' # 第一阶段:加载所有查询词到哈希表 FNR == NR { queries[$1] = 1 next } # 第二阶段:逐行处理大文件 { match_q = "" abc_word = "" # 遍历当前行所有单词 for (i=1; i<=NF; i++) { if ($i in queries) match_q = $i if ($i ~ /^ABC/) abc_word = $i } # 匹配到查询词则输出结果 if (match_q) print match_q, abc_word ' queryfile.txt largefile.txt > results.txt
特殊场景适配
如果单条大文件行中可能存在多个查询词,需要全部输出,可调整代码如下:
LC_ALL=C awk ' FNR == NR { queries[$1] = 1 next } { abc_word = "" # 先提取ABC前缀单词 for (i=1; i<=NF; i++) { if ($i ~ /^ABC/) { abc_word = $i break } } # 输出所有匹配的查询词 for (i=1; i<=NF; i++) { if ($i in queries) print $i, abc_word } ' queryfile.txt largefile.txt > results.txt
内容的提问来源于stack exchange,提问作者Piers
相关产品推荐
相关产品推荐

