重新编号 .pdb 文件中的值

问题描述 投票:0回答:1

我有一个 .pdb 文件,它对应于肽-蛋白质复合物。该文件的片段如下所示:

ATOM     47  CD  GLU     5     -27.358 -23.727  15.778  0.00  0.00
ATOM     48  OE1 GLU     5     -27.054 -22.904  16.692  0.00  0.00
ATOM     49  OE2 GLU     5     -28.591 -23.849  15.297  0.00  0.00
ATOM     50  C   GLU     5     -24.320 -21.884  13.653  0.00  0.00
ATOM     51  O   GLU     5     -24.342 -21.262  14.722  0.00  0.00
ATOM     52  OXT GLU     5     -23.455 -21.595  12.691  0.00  0.00
TER
ATOM      1  N   MET A   1      -9.976  22.279  65.378  1.00 37.35           N
ATOM      2  H   MET A   1      -9.180  21.915  65.882  1.00 37.35           H
ATOM      3  H2  MET A   1     -10.535  22.833  66.011  1.00 37.35           H
ATOM      4  H3  MET A   1      -9.653  22.869  64.625  1.00 37.35           H

我想直接在我的 .pdb 文件中的第一个“TER”行之后更改所有行的编号第 6 列。现在,第 6 列中的计数从 1 开始,但我想要,第 6 列中的计数以与上述相同的方式开始,但以 6 而不是 1 开始。

此外,我还想在我的 .pdb 文件中的第一个“TER”行之后直接更改所有行的第 2 列中的编号。现在,第 2 列中的编号从 1 开始,但我想要,第 2 列中的编号以与上述相同的方式开始,但以 53 而不是 1 开始。

你能帮帮我吗?

我尝试使用 bash 脚本来执行此操作,但是当我在 Pymol 中打开我编辑的 .pdb 文件时,我有类似这样的内容 ()。

这是我的代码:

#!/bin/bash

# read input file and output file names from command line arguments
input_file=complex.pdb
output_file=renum.pdb

# initialize residue counter and flag for tracking first "TER" occurrence
residue_num=1
ter_found=false

# loop through the lines of the input file
while read line
do
    # check if the line contains "TER"
    if [[ "$line" == "TER" ]]
    then
        # if it does, reset the residue counter to 5 and set the flag to true
        residue_num=5
        ter_found=true
    else
        # if it doesn't, extract the residue name and chain ID from the line
        residue_name=$(echo $line | awk '{print $4}')
        chain_id=$(echo $line | awk '{print $5}')

        # if the residue name or chain ID has changed, increment the residue counter
        if [[ "$residue_name" != "$prev_residue_name" || "$chain_id" != "$prev_chain_id" ]]
        then
            residue_num=$((residue_num+1))
        fi

        # if the first "TER" has been found, replace the 6th column with the new residue number
        if [[ "$ter_found" == true ]]
        then
            line=$(echo $line | awk -v num="$residue_num" '{$6=num; print}')
        fi

        # save the current residue name and chain ID for comparison in the next iteration
        prev_residue_name=$residue_name
        prev_chain_id=$chain_id
    fi

    # write the modified line to the output file
    echo $line >> $output_file
done < $input_file


最后我的 renum.pdb 文件看起来像这样(这只是这个 .pdb 文件的片段):

ATOM 51 O GLU 5 -24.342 -21.262 14.722 0.00 0.00
ATOM 52 OXT GLU 5 -23.455 -21.595 12.691 0.00 0.00
TER
ATOM 1 N MET A 6 -9.976 22.279 65.378 1.00 37.35 N
ATOM 2 H MET A 6 -9.180 21.915 65.882 1.00 37.35 H
ATOM 3 H2 MET A 6 -10.535 22.833 66.011 1.00 37.35 H
ATOM 4 H3 MET A 6 -9.653 22.869 64.625 1.00 37.35 H
ATOM 5 CA MET A 6 -10.798 21.168 64.854 1.00 37.35 C
ATOM 6 HA MET A 6 -10.228 20.580 64.134 1.00 37.35 H
ATOM 7 C MET A 6 -12.001 21.763 64.138 1.00 37.35 C
ATOM 8 CB MET A 6 -11.246 20.239 65.996 1.00 37.35 C
ATOM 9 HB2 MET A 6 -12.067 19.611 65.651 1.00 37.35 H
ATOM 10 HB3 MET A 6 -11.605 20.839 66.833 1.00 37.35 H
ATOM 11 O MET A 6 -12.910 22.240 64.800 1.00 37.35 O
ATOM 12 CG MET A 6 -10.117 19.320 66.475 1.00 37.35 C
ATOM 13 HG2 MET A 6 -9.211 19.904 66.638 1.00 37.35 H
ATOM 14 HG3 MET A 6 -9.916 18.576 65.705 1.00 37.35 H
ATOM 15 SD MET A 6 -10.516 18.472 68.020 1.00 37.35 S
ATOM 16 CE MET A 6 -9.060 17.405 68.201 1.00 37.35 C
ATOM 17 HE1 MET A 6 -9.137 16.843 69.131 1.00 37.35 H
ATOM 18 HE2 MET A 6 -9.011 16.705 67.367 1.00 37.35 H
ATOM 19 HE3 MET A 6 -8.154 18.011 68.223 1.00 37.35 H
ATOM 20 N LYS A 7 -11.970 21.837 62.804 1.00 40.65 N
bash awk pdb
1个回答
2
投票

PDB 具有固定宽度的列,因此您 不应该 将其转换为单个空格分隔的文件,因为其他程序之后将无法处理它。

对于ATOM记录,规范是:

中的正交坐标 中 Y 的正交坐标 中的正交坐标
列和(宽度) 数据类型 定义
1 - 6 (6) 字符串(6) 记录名称
ATOM  
7 - 11 (5) 整数 连续剧 原子序列号
12 (1) - - -
13 - 16 (4) 原子 姓名 原子名称
17 (1) 性格 altLoc 备用位置指示器
18 - 20 (3) 残基名称 resName 残基名称
21 (1) - - -
22 (1) 性格 链号 链标识符
23 - 26 (4) 整数 resSeq 残差序号
27 (1) AChar i代码 残基插入代码
28 - 30 (3) - - -
31 - 38 (8) 真实(8.3) x X 在 Å
39 - 46 (8) 真实(8.3) y 在 Å
47 - 54 (8) 真实(8.3) z Z 在 Å
55 - 60 (6) 真实(6.2) 入住率 入住率
61 - 66 (6) 真实(6.2) 温度系数 温度系数
67 - 76 (10) - - -
77 - 78 (2) LString(2) 元素 元素符号,右对齐
79 - 80 (2) LString(2) 充电 原子电荷

用任意

awk
处理,可以用
substr
提取相关部分:

awk '
    /^TER/ { after_TER = 1 }
    /^ATOM/ {
        resName = substr($0,18,3)
        if ( resName != previous_resName ) {
            previous_resName = resName
            resSeq = (after_TER ? sprintf("%4d", resSeq + 1) : substr($0,23,4))
        }
        if ( after_TER )
            $0 = substr($0,1,6) \
                 sprintf("%5d", ++previous_serial) \
                 substr($0,12,11) \
                 resSeq \
                 substr($0,27)
        else
            previous_serial = substr($0,7,5)
    }
    { print }
' complex.pdb > renum.pdb
例子

输入:

ATOM     51  O   GLU     5     -24.342 -21.262  14.722  0.00  0.00
ATOM     52  OXT GLU     5     -23.455 -21.595  12.691  0.00  0.00
TER
ATOM      1  N   MET A   1      -9.976  22.279  65.378  1.00 37.35           N
ATOM      2  H   MET A   1      -9.180  21.915  65.882  1.00 37.35           H
ATOM      3  N   LYS A   1     -11.970  21.837  62.804  1.00 40.65           N
ATOM      4  H   LYS A   1      -9.653  22.869  64.625  1.00 37.35           H

输出:

ATOM     51  O   GLU     5     -24.342 -21.262  14.722  0.00  0.00
ATOM     52  OXT GLU     5     -23.455 -21.595  12.691  0.00  0.00
TER
ATOM     53  N   MET A   6      -9.976  22.279  65.378  1.00 37.35           N
ATOM     54  H   MET A   6      -9.180  21.915  65.882  1.00 37.35           H
ATOM     55  N   LYS A   7     -11.970  21.837  62.804  1.00 40.65           N
ATOM     56  H   LYS A   7      -9.653  22.869  64.625  1.00 37.35           H
© www.soinside.com 2019 - 2024. All rights reserved.