如何在保留格式前提下,根据同行另一列值条件替换列内容?
解决PDB固定列宽文件的条件替换问题(保留原格式)
PDB文件采用固定列宽格式,不能用常规的按空格/制表符分割字段的方式处理,否则会破坏原有排版。以下是在Mac OS(Unix架构)下,根据指定列的值条件替换目标列且保留格式的解决方案:
核心思路
直接操作字符串的固定位置,提取目标区域的内容做判断,仅替换指定位置的字符,完全保留原文件的空格布局和列宽。
实现命令
使用Mac自带的BSD awk执行以下命令:
awk '{ # 提取PDB行中第73-76位的分段标识符(PROA/PROB) seg = substr($0, 73, 4) # 根据分段标识符替换第22位的链ID字符 if (seg == "PROA") { $0 = substr($0, 1, 21) "A" substr($0, 23) } else if (seg == "PROB") { $0 = substr($0, 1, 21) "B" substr($0, 23) } # 输出修改后的完整行 print }' example.pdb > example_mod.pdb
命令说明
substr($0, pos, len):截取整行内容中从pos位置开始、长度为len的子串(位置从1开始计数)- 第73-76位是示例中的分段标识(PROA/PROB),可根据实际PDB格式调整位置
- 第22位是示例中需要替换的链ID位置(原字符为P),替换为A/B后,前后的空格和内容完全保留
- 整个操作不改变原行的任何空格布局,仅修改指定位置的单个字符
为什么之前的方法失效
你之前使用的awk命令通过IFS/OFS按制表符分割字段,会将PDB行中的连续空格视为单个分隔符,输出时用制表符替换原有空格,彻底破坏了固定列宽的格式。而直接操作字符串位置的方法完全规避了这个问题。
内容的提问来源于stack exchange,提问作者Sky Scraper
相关产品推荐
相关产品推荐

