拆分大sdf文件并删除分子属性数据

0. sdf格式分子文件简介

SDF(Structure Data File)格式是一种用于表示化学分子结构信息的文件格式,由MDL Information Systems(MDL)开发。它是一种纯文本格式,可以用来描述小分子、大分子、反应、光谱等多种化学信息。SDF格式在化学信息学和药物设计领域中得到了广泛的应用。
SDF文件的基本结构包括以下几个部分:
在这里插入图片描述

1. OpenBabel拆分sdf文件

使用openbabel来拆分大的sdf文件为单独的sdf文件,可下载安装openbabel

babel test_opt.sdf --split -aT -osdf

将会输出以每个分子第一行中定义的分子名称为file name
后期实测并不好用,很多sdf为空

2. shell脚本拆分含有多个sdf小分子的大文件

拆分大的sdf文件,并根据原始文件名依次加序号命名拆分后的文件,运行split_sdf.sh脚本

bash split_sdf.sh test.sdf

split_sdf.sh脚本的内容

# 读取文件
sdf_file=$1
# 创建split_sdf文件夹,存放拆分后的分子
mkdir -p split_sdf
# 初始化首行行数(start)和文件序号(j)
start=1
j=1
# 读取大的sdf文件中以`$$$$`为分割段落的行号作为拆分的段落,并在拆分后的sdf首行改写改分子的名称
for i in `cat ${sdf_file}|grep -n "\\$\\$\\$\\$"|awk -F : '{print $1}'`
do
        name=`basename ${sdf_file} .sdf`
        end=$i
        sed -n "${start},${end}p" ${sdf_file} >split_sdf/${name}_${j}.sdf
        sed -i "1c ${name}_${j}" split_sdf/${name}_${j}.sdf
        start=`expr ${end} + 1`
        ((j=j+1))
done

3. 删除sdf文件中的分子属性信息

sdf文件中的分子属性如下所示

<r_lp_tautomer_probability>
1

3.1 sed删除所有属性

sed -i可以直接修改原文件,请注意备份原文件。

sed  -i '/>.*>/,+2d'  test.sdf

3.1 OpenBabel 删除指定属性

babel -isdf test.sdf --delete “r_lp_tautomer_probability” -osdf test_delete.sdf

4. 修改分子集sdf文件中的分子名称

当分子集中的分子名为同一个时,拆分后的分子不好命名,因此选择修改分子集sdf文件内容。
以下示例中,test.sdf文件中所有的分子命名为sh.sdf,修改为sh-1.sdf、sh-2.sdf、sh-3.sdf以此类推的名字,修改后的结果写入modified_test.sdf文件。。

# -*- coding: utf-8 -*-
import re
def modify_and_write(filename, output_filename):
    counter = 1  # 用于计数匹配到的"sh.sdf"
    with open(filename, 'r') as file:
        lines = file.readlines()  # 读取所有行到列表

    with open(output_filename, 'w') as outfile:
        for line in lines:
            # 使用正则表达式严格匹配整行内容为"sh.sdf"
            if re.match(r'^sh\.sdf$', line.strip()):
                modified_line = f'sh-{counter}.sdf\n'  # 替换并添加换行符
                counter += 1  # 递增计数器
                outfile.write(modified_line)  # 写入新文件
            else:
                outfile.write(line)  # 将未修改的行写入新文件
# 调用函数并传入原始文件名和新文件名
modify_and_write('test.sdf', 'modified_test.sdf')

运行脚本:

python3 rename_sdf.py

split_sdf.sh的shell脚本拆分上述的test.sdf为单个sdf文件(懒得写python了,凑合的改了上面第二部分的shell代码)

# 参数读取sdf文件
sdf_file=$1
# 创建split_sdf文件夹,存放拆分后的分子
mkdir -p split_sdf
# 初始化首行行数(start)和文件序号(j)
start=1
j=1
# 读取大的sdf文件中以`$$$$`为分割段落的行号作为拆分的段落,并在拆分后的sdf首行改写改分子的名称
for i in `cat ${sdf_file}|grep -n "\\$\\$\\$\\$"|awk -F : '{print $1}'`
do
        name=`basename ${sdf_file} .sdf`
        end=$i
        sed -n "${start},${end}p" ${sdf_file} >split_sdf/sh_${j}.sdf
        start=`expr ${end} + 1`
        ((j=j+1))
done

运行脚本:

bash split_sdf.sh modified_test.sdf
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值