美文网首页生物信息分子模拟Shell
#分子模拟#使用shell脚本分割pdb文件中蛋白配体

#分子模拟#使用shell脚本分割pdb文件中蛋白配体

作者: 生信杂谈 | 来源:发表于2017-06-01 11:09 被阅读65次

    上期(原创蛋白配体分割工具​)使用python创建来了一个分割由Pymol生成的pbd文件的工具.本期使用shell脚本实现相同的效果.

    原始pdb文件是类似这样的:
    Pymol生成的pdb文件

    在这个pdb文件中,TER开头且不以h结尾的行是真正的配体之间的分隔符(图中蓝色箭头),TER开头以h结尾的行是假的分隔符(红色叉).所以图中的pdb文件分成了四部分,第一部分是第一行开始到第一个分隔符属于蛋白,剩下被分隔符分割的部分属于各个配体文件.

    下面以一个pbd文件为例,这个pdb文件可以在(https://pan.baidu.com/s/1bOINmu)

    下载.shell脚本如下:

    #! /bin/bash
    # 将这个pdb文件的总行数赋值给变量.
    pro_rows=`wc -l protein.pdb|awk '{print $1}' -`
    # 首先获得匹配到以TER开头且不以h结尾的行,记录行号并管道给下个awk.
    awk 'BEGIN{OFS="\t"; }{if($0~ "^TER.*" && !($0~ "h\r"))print NR}' protein.pdb | awk -v pro_rows=$pro_rows '{
        if(NR==FNR){a[NR]=$1}    # 将分隔符的行号存储到数组
        if(NR>FNR){b[FNR]=$0}    # 将pdb文件每一行存入数组
    }END{
        a[0]=1;    #pbd文件首行存入数组
        la=length(a);a[la]=pro_rows;    #pdb文件尾行存入数组
        # 注意,这里有个坑爹的地方,在awk的for循环里length函数貌似无效.所以先赋值给变量然后再在for循环里调用.
        la=length(a);
        #for循环嵌套输出结果.
        for(i=0;i<la;i++){
            for(j=a[i];j<a[i+1];j++){
                print b[j] > "result_"i".txt"
            }
        }
    }' - protein.pdb 
    

    结果会生成11个文件.result_0.txt是蛋白文件,其他是配体文件.

    分割成的11个文件

    脚本中的protein.pdb是文件名,需要处理其他文件直接替换文件名即可.

    更多原创精彩内容敬请关注生信杂谈

    相关文章

      网友评论

        本文标题:#分子模拟#使用shell脚本分割pdb文件中蛋白配体

        本文链接:https://www.haomeiwen.com/subject/bdmsfxtx.html