You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Bash的grep/awk/sed高效过滤含Abstract的PubMed多行数据

高效过滤PubMed提取条目(剔除不含Abstract的条目)

问题背景

我有一批从PubMed XML文件提取的大文件(约500万字),通过xgrep -tx "//PMID|//ArticleTitle|//Abstract|//MeshHeadingList"获取了包含指定XML标签的行。但部分条目没有<Abstract></Abstract>标签,需要过滤掉这些条目。

现有方案的问题:

  • pcregrep -M的写法能快速得到正确结果,但学校电脑未安装pcregrep;
  • grep -Pazo的写法结果正确,但处理耗时长达14-15分钟,效率太低。

系统环境:Linux Mint LMDE 5(Elsie),Bash 5.1.4,只能使用默认预装的Bash命令工具。普通awk的/start-pattern/,/end-pattern/模式无效,因为所有条目均以<PMID>开头、</MeshHeadingList>结尾。

解决方案:使用awk高效处理

利用awk的逐行处理能力,将每个完整条目收集为一个块,再判断块中是否包含<Abstract>标签,仅输出符合条件的条目。命令如下:

awk '/^<PMID/{
    if (block && index(block, "<Abstract>")) print block
    block = $0
    next
}
{
    block = block "\n" $0
}
END{
    if (block && index(block, "<Abstract>")) print block
}' xgrep.txt

命令逻辑说明

  1. 触发新条目收集:当匹配到以<PMID>开头的行时,先检查之前收集的条目块:
    • 如果块不为空且包含<Abstract>标签,输出该块;
    • 重置块内容为当前行,开始收集新条目。
  2. 拼接条目内容:非<PMID>开头的行,追加到当前条目块中,形成完整的条目内容。
  3. 处理最后一个条目:文件末尾时,检查最后一个收集的条目块,符合条件则输出。

效率优势

  • 内存占用可控:仅保留当前处理的条目块,不会加载整个大文件到内存;
  • 查找高效:使用index()函数做字符串匹配,比正则表达式匹配更快,适合处理百万级文本。

内容的提问来源于stack exchange,提问作者pedro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 23:24:41