You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 10:39:03