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

如何按模式拆分列值?.pdb文件第五列拆分及sed命令优化求助

解决PDB文件第五列链标识符后添加空格的问题

你之前的sed命令没成功主要有两个原因:一是只针对链ID为D的情况,不够通用;二是命令里的5是指替换该行中第5次出现的D,而不是定位到第五列,逻辑不对。下面给你两种通用的解决方案,不管链ID是哪个字母都能生效:

方法一:用sed正则匹配处理

这个命令会精准定位到第五列,把单个字母链ID和后面的数字分开:

sed -E -i 's/^(([^ ]+ ){4})([A-Za-z])([0-9]+)/\1\3 \4/' test.pdb

命令解释:

  • ^(([^ ]+ ){4}):匹配行开头的前4个字段(每个字段是“非空格字符+空格”),把这部分保存到分组1
  • ([A-Za-z]):捕获第五列开头的单个字母链ID,保存到分组3
  • ([0-9]+):捕获链ID后面的所有数字,保存到分组4
  • \1\3 \4:把前4个字段、链ID、空格、数字拼接起来,完成拆分

如果是macOS系统,sed的-i参数需要加一个空后缀,命令改成:

sed -E -i '' 's/^(([^ ]+ ){4})([A-Za-z])([0-9]+)/\1\3 \4/' test.pdb

方法二:用awk处理(更直观,适合列操作)

awk天生擅长按列处理文本,这个方法逻辑更清晰:

awk '{match($5, /^([A-Za-z])(.*)/, res); $5 = res[1] " " res[2]; print}' test.pdb

命令解释:

  • match($5, /^([A-Za-z])(.*)/, res):在第五列中匹配“开头单个字母+剩余内容”的结构,把字母存到res[1],后面的数字存到res[2]
  • $5 = res[1] " " res[2]:重新赋值第五列为“字母+空格+数字”
  • print:输出修改后的整行

如果要原地修改文件,可以把输出重定向到临时文件再替换原文件:

awk '{match($5, /^([A-Za-z])(.*)/, res); $5 = res[1] " " res[2]; print}' test.pdb > temp.pdb && mv temp.pdb test.pdb

用你的示例输入测试这两个命令,都会得到期望的输出:

ATOM 12107 N CYS D 1742 -42.369 73.203 -44.599 1.00224.20 C N

内容的提问来源于stack exchange,提问作者Alessandra Zarantonello

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:45:11