awk 替换匹配行后的列

Awk replace column AFTER matched line

我有一个从 receptor/ligand 对接预测返回的 PDB 文件。我不知道为什么程序的作者将受体和配体的链命名为“A”,但我想更改它。这应该是我想做的一件基本事情,我不确定为什么我在互联网上找不到任何例子。我想做的很简单

  1. 匹配一行,例如“HEADER lig”
  2. 然后对于之后的每一行,将第 5 列替换为“B”

输入文件示例如下:

ATOM   9197  OG  SER A1176     103.395 152.201 139.176  1.00  0.00      RA2  O
ATOM   9198  HG  SER A1176     104.092 151.786 138.659  1.00  0.00      RA2  H
ATOM   9199  C   SER A1176     101.857 153.749 136.254  1.00  0.00      RA2  C
ATOM   9200  O   SER A1176     102.183 152.962 135.366  1.00  0.00      RA2  O
TER
HEADER lig.006.10.pdb
ATOM      1  N   GLY A  25     182.812 181.892 153.587  1.00  0.00      LA0  N
ATOM      2  H   GLY A  25     182.954 182.546 152.840  1.00  0.00      LA0  H
ATOM      3  CA  GLY A  25     183.834 180.858 153.715  1.00  0.00      LA0  C
ATOM      4  C   GLY A  25     184.544 180.646 152.391  1.00  0.00      LA0  C
ATOM      5  O   GLY A  25     184.450 181.466 151.487  1.00  0.00      LA0  O
ATOM      6  N   PRO A  26     185.249 179.494 152.297  1.00  0.00      LA0  N
ATOM      7  CD  PRO A  26     185.371 178.458 153.319  1.00  0.00      LA0  C

我在下面试过了,但它只替换了匹配后第一行的 $5 列。不知道为什么这个例子的任何地方都没有张贴。

awk '{ print; } /^HEADER lig/ { getline; ="B"; print }' model.006.10.pdb

awk '{ if (headerfound==1){ ="B" }}/^HEADER/{ headerfound=1}{ print }'  mode.pdb

三个部分:

  1. headerfound==1 ==> 将“B”分配到第 5 列

  2. /^HEADER/ => 该行是否以 header 开头?

  3. 只是一个简单的打印来打印(最终更改的)行。

简短说明 第 2 部分,^HEADER 的检测在检查 headerfound==1 之后进行,因为当找到 HEADER 时,当前行是包含文本 HEADER 的行,我们不希望将“B”分配给该行的第 5 列。

在下一行,我们首先检查前一行是否包含 HEADER(headerfound==1),然后更新 $5.

IIRC 白色 space 在这些“PDB”文件中的字段之间很重要,所以这是一个保留白色的 GNU awk 解决方案 space:

$ awk 'f{[=10=]=gensub(/((\S+\s+){4})\S+/,"\1B",1)} /HEADER lig/{f=1} 1' file
ATOM   9197  OG  SER A1176     103.395 152.201 139.176  1.00  0.00      RA2  O
ATOM   9198  HG  SER A1176     104.092 151.786 138.659  1.00  0.00      RA2  H
ATOM   9199  C   SER A1176     101.857 153.749 136.254  1.00  0.00      RA2  C
ATOM   9200  O   SER A1176     102.183 152.962 135.366  1.00  0.00      RA2  O
TER
HEADER lig.006.10.pdb
ATOM      1  N   GLY B  25     182.812 181.892 153.587  1.00  0.00      LA0  N
ATOM      2  H   GLY B  25     182.954 182.546 152.840  1.00  0.00      LA0  H
ATOM      3  CA  GLY B  25     183.834 180.858 153.715  1.00  0.00      LA0  C
ATOM      4  C   GLY B  25     184.544 180.646 152.391  1.00  0.00      LA0  C
ATOM      5  O   GLY B  25     184.450 181.466 151.487  1.00  0.00      LA0  O
ATOM      6  N   PRO B  26     185.249 179.494 152.297  1.00  0.00      LA0  N
ATOM      7  CD  PRO B  26     185.371 178.458 153.319  1.00  0.00      LA0  C