如何使用Bash替换文本文件中的多列数据(xyz坐标替换场景)
文本列替换解决方案
你需要处理的是标准PDB结构文件,目标是将前半部分HETATM行的xyz坐标列,替换为后半部分对应序号ATOM行的xyz坐标列,有两种常用实现方式:
1. 单命令快速处理(Linux/macOS环境)
用awk一行命令即可完成替换,直接输出结果:
awk 'NR<=11 {het[$2] = $0; next} {split(het[$2], arr, /\s+/); arr[6]=$6; arr[7]=$7; arr[8]=$8; for(i=1;i<=length(arr);i++) printf "%s ", arr[i]; print ""}' 你的输入文件.pdb > 替换后文件.pdb
命令说明:
- 先读取前11行HETATM数据,按原子序号(第2列)缓存
- 逐行读取后续ATOM数据,取出对应原子的HETATM缓存内容,替换坐标列后输出
- 如果你的HETATM总行数不是11,把命令里的
11改成实际的HETATM行数即可
2. Python脚本处理(全平台通用)
如果需要更灵活的格式调整,或者是Windows环境,可以用以下Python脚本:
# 读取原始文件 with open("你的输入文件.pdb", "r", encoding="utf-8") as f: all_lines = [line.rstrip("\n") for line in f if line.strip()] # 拆分HETATM块和ATOM块,按行一一对应 het_lines = all_lines[:11] atom_lines = all_lines[11:] result_lines = [] for het_line, atom_line in zip(het_lines, atom_lines): het_parts = het_line.split() atom_parts = atom_line.split() # 替换x、y、z三列 het_parts[5:8] = atom_parts[5:8] # 拼接为完整行,如需严格匹配PDB固定列宽可自行调整格式化规则 result_lines.append(" ".join(het_parts)) # 输出结果到新文件 with open("替换后结果.pdb", "w", encoding="utf-8") as f: f.write("\n".join(result_lines))
内容的提问来源于stack exchange,提问作者anas forum
相关产品推荐
相关产品推荐

