如何用awk在.pdb文件第4个氨基酸残基后添加TER行?
解决PDB文件中在指定残基后添加TER行的问题
我有一段PDB文件片段:
ATOM 73 HG1 GLU 4 77.769 51.123 52.300 1.00 0.00 H ATOM 74 HG2 GLU 4 78.465 52.119 52.349 1.00 0.00 H ATOM 75 CD GLU 4 79.068 49.945 51.438 1.00 0.00 C ATOM 76 OE1 GLU 4 80.069 49.715 50.698 1.00 0.00 O ATOM 77 OE2 GLU 4 78.545 49.062 52.176 1.00 0.00 O ATOM 78 C GLU 4 81.179 52.948 53.610 1.00 0.00 C ATOM 79 O GLU 4 80.203 53.460 54.165 1.00 0.00 O ATOM 80 N GLU 5 82.590 53.305 53.698 1.00 0.00 N ATOM 81 HN GLU 5 83.090 53.117 52.847 1.00 0.00 H ATOM 82 CA GLU 5 83.454 54.267 54.627 1.00 0.00 C ATOM 83 HA GLU 5 83.749 55.087 53.980 1.00 0.00 H ATOM 84 CB GLU 5 82.258 54.565 55.220 1.00 0.00 C
需要在**第4个氨基酸残基(残基编号位于第5列)**的所有原子行之后添加一行TER。之前尝试的脚本awk 'NR==5 {print; print "TER"} NR!=5' my_pdb.pdb > pdb-with-ter.pdb无法实现需求,原因是NR代表行号,不是残基编号,没法精准定位到残基4的最后一行。
正确解决方案
核心思路是跟踪当前行与前一行的残基编号,当检测到残基编号从4切换到其他数值时,在切换前的最后一行后插入TER。使用以下awk脚本:
awk '{ if (prev_res == 4 && $5 != 4) { print "TER" } print $0 prev_res = $5 }' my_pdb.pdb > pdb-with-ter.pdb
逻辑说明
- 用变量
prev_res存储上一行的残基编号 - 处理每一行时,先判断:如果上一行残基是4且当前行残基不是4,就打印
TER - 打印当前行内容
- 更新
prev_res为当前行的残基编号
处理后的目标文件片段如下:
ATOM 73 HG1 GLU 4 77.769 51.123 52.300 1.00 0.00 H ATOM 74 HG2 GLU 4 78.465 52.119 52.349 1.00 0.00 H ATOM 75 CD GLU 4 79.068 49.945 51.438 1.00 0.00 C ATOM 76 OE1 GLU 4 80.069 49.715 50.698 1.00 0.00 O ATOM 77 OE2 GLU 4 78.545 49.062 52.176 1.00 0.00 O ATOM 78 C GLU 4 81.179 52.948 53.610 1.00 0.00 C ATOM 79 O GLU 4 80.203 53.460 54.165 1.00 0.00 O TER ATOM 80 N GLU 5 82.590 53.305 53.698 1.00 0.00 N ATOM 81 HN GLU 5 83.090 53.117 52.847 1.00 0.00 H ATOM 82 CA GLU 5 83.454 54.267 54.627 1.00 0.00 C ATOM 83 HA GLU 5 83.749 55.087 53.980 1.00 0.00 H ATOM 84 CB GLU 5 82.258 54.565 55.220 1.00 0.00 C
内容的提问来源于stack exchange,提问作者skywalker
相关产品推荐
相关产品推荐

