我在 Linux 机器上有一个PDB 文件(蛋白质中原子的坐标):
ATOM 1 N GLY A 1 0.535 51.766 5.682 1.00 0.00
ATOM 2 CA GLY A 1 -0.712 50.962 5.596 1.00 0.00
ATOM 3 C GLY A 1 -1.243 50.872 4.179 1.00 0.00
ATOM 4 O GLY A 1 -1.313 51.888 3.492 1.00 0.00
ATOM 5 N GLN A 2 -1.600 49.664 3.737 1.00 0.00
ATOM 6 CA GLN A 2 -2.221 49.468 2.423 1.00 0.00
ATOM 7 C GLN A 2 -3.542 48.719 2.507 1.00 0.00
ATOM 8 O GLN A 2 -3.722 47.844 3.356 1.00 0.00
ATOM 9 CB GLN A 2 -1.280 48.738 1.468 1.00 0.00
ATOM 10 CG GLN A 2 -0.976 47.294 1.830 1.00 0.00
.... .. .. .. . . .... .... .... .... ....
TER SPLIT LINE FOR INTERNAL USE ONLY
ATOM 1 O5' G A 1 -44.412 97.503 31.177 1.00 0.00
ATOM 2 C5' G A 1 -45.447 96.803 31.882 1.00 0.00
ATOM 3 C4' G A 1 -45.225 95.295 31.894 1.00 0.00
ATOM 4 O4' G A 1 -46.441 94.578 31.654 1.00 0.00
ATOM 5 C3' G A 1 -44.328 94.850 30.748 1.00 0.00
ATOM 6 O3' G A 1 -42.943 94.877 31.129 1.00 0.00
ATOM 7 C2' G A 1 -44.804 93.425 30.542 1.00 0.00
ATOM 8 O2' G A 1 -44.163 92.592 31.466 1.00 0.00
ATOM 9 C1' G A 1 -46.304 93.444 30.772 1.00 0.00
ATOM 10 N9 G A 1 -46.965 93.699 29.495 1.00 0.00
.... .. .. . . . ....... ...... ..... .... ...
TER 记录明确标记了特定氨基酸链的结束。我想用 awk 更改第 5 列的蛋白质链 ID,以便在 TER 之后为新的链分配正确的 ID。
预期输出:
ATOM 1 N GLY A 1 0.535 51.766 5.682 1.00 0.00
ATOM 2 CA GLY A 1 -0.712 50.962 5.596 1.00 0.00
ATOM 3 C GLY A 1 -1.243 50.872 4.179 1.00 0.00
ATOM 4 O GLY A 1 -1.313 51.888 3.492 1.00 0.00
ATOM 5 N GLN A 2 -1.600 49.664 3.737 1.00 0.00
ATOM 6 CA GLN A 2 -2.221 49.468 2.423 1.00 0.00
ATOM 7 C GLN A 2 -3.542 48.719 2.507 1.00 0.00
ATOM 8 O GLN A 2 -3.722 47.844 3.356 1.00 0.00
ATOM 9 CB GLN A 2 -1.280 48.738 1.468 1.00 0.00
ATOM 10 CG GLN A 2 -0.976 47.294 1.830 1.00 0.00
TER SPLIT LINE FOR INTERNAL USE ONLY
ATOM 1 O5' G B 1 -44.412 97.503 31.177 1.00 0.00
ATOM 2 C5' G B 1 -45.447 96.803 31.882 1.00 0.00
ATOM 3 C4' G B 1 -45.225 95.295 31.894 1.00 0.00
ATOM 4 O4' G B 1 -46.441 94.578 31.654 1.00 0.00
ATOM 5 C3' G B 1 -44.328 94.850 30.748 1.00 0.00
ATOM 6 O3' G B 1 -42.943 94.877 31.129 1.00 0.00
ATOM 7 C2' G B 1 -44.804 93.425 30.542 1.00 0.00
ATOM 8 O2' G B 1 -44.163 92.592 31.466 1.00 0.00
ATOM 9 C1' G B 1 -46.304 93.444 30.772 1.00 0.00
ATOM 10 N9 G B 1 -46.965 93.699 29.495 1.00 0.00
所有内容都需要用相同的空格分隔,以下安排是错误的:
ATOM 3674 CD1 PHE A 460 2.350 79.471 35.466 1.00 0.00
ATOM 3675 CD2 PHE A 460 1.037 81.443 35.196 1.00 0.00
ATOM 3676 CE1 PHE A 460 2.425 79.321 34.080 1.00 0.00
ATOM 3677 CE2 PHE A 460 1.108 81.298 33.805 1.00 0.00
ATOM 3678 CZ PHE A 460 1.805 80.232 33.250 1.00 0.00
TER SPLIT LINE FOR B USE ONLY
ATOM 1 O5' G B 1 -44.412 97.503 31.177 1.00 0.00
ATOM 2 C5' G B 1 -45.447 96.803 31.882 1.00 0.00
ATOM 3 C4' G B 1 -45.225 95.295 31.894 1.00 0.00
ATOM 4 O4' G B 1 -46.441 94.578 31.654 1.00 0.00
ATOM 5 C3' G B 1 -44.328 94.850 30.748 1.00 0.00
此外,该文件以此结尾:
TER
ENDMDL
文件末尾有一个空白行,需要保留原样
如果您的字段是制表符分隔的,那么这可能就是您想要的,使用任何 awk:
否则这可能就是您想要的,使用任何 POSIX awk,无论字段之间的空格是什么,只要前 5 个字段内不能有空格:
您可以尝试以下方法:
这段代码检查第一个 token 是否为“TER”,并设置 flag。然后检查 flag 是否为 1,如果是,则将 token 5 的值设置为“B”。最后打印整行
您可以像这样修改它,使它像表格一样,
-R
右对齐特定的列如果您想要正确解析和操作 PDB 文件,您应该使用具有能够执行此操作的库模块的语言。
例如,perl 和Bio::PDB::Structure模块——“用于解析和操作蛋白质数据库 (PDB) 文件的 Perl 模块”
从模块的描述来看:
简而言之,使用正确的工具可以使您想要做的事情变得如此简单:
$m = Bio::PDB::Structure::Molecule->new;
,创建一个名为 的新对象$m
来存储 PDB 数据,然后$m->read("molecule.pdb",0);
读取并将文件解析为$m
。$m
,检查它是否符合您的标准,并进行必要的更改。$m->print("new.pdb");
顺便提一下,也可以看看Bioperl。正如其网页所述:“Bioperl 项目是一个由生物信息学、基因组学和生命科学领域的开源 Perl 工具用户和开发者组成的国际协会”。
使用(和/或修改)现有的开源代码可以节省您许多小时、几天、几周甚至更多的时间,无需重新发明许多在您之前需要研究人员发明的相同或类似的工具。
还有Biopython,它基本上是 Python 语言而不是 Perl 语言的。特别推荐查看Bio.PDB包。
更广泛地说,还有开放生物信息学基金会:“开放生物信息学基金会 (OBF) 是一个由志愿者运营的非营利性组织,致力于在生物研究界推广开源软件开发和开放科学。OBF 的会员资格免费,任何希望在生物领域推动开源或开放科学的人都可以加入。”