awk 替换匹配行后的列
Awk replace column AFTER matched line
我有一个从 receptor/ligand 对接预测返回的 PDB 文件。我不知道为什么程序的作者将受体和配体的链命名为“A”,但我想更改它。这应该是我想做的一件基本事情,我不确定为什么我在互联网上找不到任何例子。我想做的很简单
- 匹配一行,例如“HEADER lig”
- 然后对于之后的每一行,将第 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
三个部分:
headerfound==1
==> 将“B”分配到第 5 列
/^HEADER/
=> 该行是否以 header 开头?
只是一个简单的打印来打印(最终更改的)行。
简短说明
第 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
我有一个从 receptor/ligand 对接预测返回的 PDB 文件。我不知道为什么程序的作者将受体和配体的链命名为“A”,但我想更改它。这应该是我想做的一件基本事情,我不确定为什么我在互联网上找不到任何例子。我想做的很简单
- 匹配一行,例如“HEADER lig”
- 然后对于之后的每一行,将第 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
三个部分:
headerfound==1
==> 将“B”分配到第 5 列/^HEADER/
=> 该行是否以 header 开头?只是一个简单的打印来打印(最终更改的)行。
简短说明
第 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