如何在现有PDB文件中插入指定列并保持格式一致
如何在旧版PDB文件的ATOM行中插入字母"A"并保持格式规范
需求:在旧版Protein Data Bank(PDB)文件的ATOM记录中,在残基名字段后插入字母"A",严格遵循80列的格式规范,首6列记录名保持左对齐,其余字段的分隔格式完全不变。
输入示例
ATOM 1 N LYS 1 27.426 26.010 24.339 1.00 0.00 N ATOM 2 H1 LYS 1 27.291 25.736 24.387 1.00 0.00 H ATOM 3 H2 LYS 1 27.286 25.739 24.374 1.00 0.00 H
期望输出
ATOM 1 N LYS A 1 27.426 26.010 24.339 1.00 0.00 N ATOM 2 H1 LYS A 1 27.291 25.736 24.387 1.00 0.00 H ATOM 3 H2 LYS A 1 27.286 25.739 24.374 1.00 0.00 H
解决方案:用Awk脚本处理
Awk适合处理固定格式的文本,能精准控制每个字段的位置和宽度,完美匹配旧版PDB的80列规范。
脚本代码
/^ATOM/ { # 按旧版PDB字段位置提取内容 record = substr($0, 1, 6) # 1-6列:记录名(左对齐) serial = substr($0, 7, 5) # 7-11列:原子序号 name = substr($0, 13, 3) # 13-15列:原子名 altLoc = substr($0, 17, 1) # 17列:替代位置标识 resName = substr($0, 18, 3) # 18-20列:残基名 chainID = "A" # 要插入的字母A(对应22列链ID位置) resSeq = substr($0, 23, 4) # 23-26列:残基序号 iCode = substr($0, 27, 1) # 27列:插入码 x = substr($0, 31, 8) # 31-38列:X坐标 y = substr($0, 39, 8) # 39-46列:Y坐标 z = substr($0, 47, 8) # 47-54列:Z坐标 occupancy = substr($0, 55, 6) # 55-60列:占有率 tempFactor = substr($0, 61, 6) # 61-66列:温度因子 segID = substr($0, 73, 4) # 73-76列:段ID element = substr($0, 77, 2) # 77-78列:元素符号 charge = substr($0, 79, 2) # 79-80列:电荷 # 按PDB格式拼接输出,严格控制字段宽度和对齐 printf("%-6s%5s %3s%1s%3s %1s%4s%1s %8s%8s%8s%6s%6s %4s%2s%2s\n", record, serial, name, altLoc, resName, chainID, resSeq, iCode, x, y, z, occupancy, tempFactor, segID, element, charge) } # 非ATOM行直接原样输出 !/^ATOM/ { print }
使用方法
- 将上述脚本保存为
add_chainA.awk - 在终端执行命令:
awk -f add_chainA.awk input.pdb > output.pdb
关键说明
- 严格按照旧版PDB的80列字段定义提取内容,确保每个字段的起始位置和长度完全匹配规范
- 用
printf的格式控制符保证输出格式:比如%-6s让记录名左对齐6列,其他字段按PDB要求的宽度输出 - 非ATOM行(如HEADER、TER等)直接原样输出,不会破坏文件的其他结构
- 即使原文件中存在替代位置标识、插入码等非空字段,脚本也能正确保留,不会丢失信息
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

