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

如何按$$$$分隔符拆分含10000个分子的大文件?

拆分SDF分子文件的高效方案

针对你要把含10000个分子的SDF文件拆分为单个分子文件的需求,推荐用awk一次性处理,比循环调用sed效率高N倍,而且无需手动删除已处理内容。

方法一:按顺序生成编号文件名

直接用awk按分隔符$$$$拆分,自动生成顺序编号的文件:

awk '/^\$\$\$\$$/{close(out); out=sprintf("molecule_%04d.sdf",++cnt); print > out; next} {print > out}' short_library.sdf

命令说明:

  • /^\$\$\$\$$/:精准匹配以$$$$开头的分隔行,避免误匹配分子内容里的相似字符串
  • close(out):每次切换文件时关闭之前的文件句柄,防止打开过多文件报错(处理10000个文件必须加)
  • sprintf("molecule_%04d.sdf",++cnt):生成4位补零的顺序文件名,比如molecule_0001.sdf、molecule_0002.sdf,方便后续排序和管理
  • 其余逻辑:把当前行写入对应的输出文件,遇到分隔行就切换到新文件

方法二:按Mol_ID生成文件名

如果你的SDF文件里有Mol_ID字段(像你提供的示例那样),可以直接用这个编号作为文件名,更直观:

awk '/^>  <Mol_ID> \(([0-9]+)\)/{id=$3; sub(/\)$/,"",id); out=sprintf("molecule_%s.sdf",id)} /^\$\$\$\$$/{print > out; close(out); next} {print > out}' short_library.sdf

命令说明:

  • 先匹配> <Mol_ID> (X)行,提取其中的编号X作为文件名的一部分
  • 后续逻辑和方法一一致,按$$$$分隔写入对应文件

为什么不推荐循环sed?

你之前尝试的sed '/$$$$/q'只能提取第一个分子,如果循环执行,每次都要重新读取整个大文件,处理10000个分子会产生巨量IO开销,速度慢到难以接受。而awk只需要遍历文件一次,全程内存处理,效率碾压循环sed。

验证示例

用你提供的short_library.sdf测试,运行方法一的命令后,会生成两个文件:

  • molecule_0001.sdf:包含第一个分子的所有内容(从untitled.cdx到$$$$)
  • molecule_0002.sdf:包含第二个分子的所有内容(从Dimesna.cdx到$$$$)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:40:20