我怎样才能用数字替换三列“XXX”?

我怎样才能用数字替换三列“XXX”?

我有一个.pdb如下所示的文件:

ATOM      1  N   PRO  137     -17.579 -25.693 -70.648
ATOM      2  CA  PRO  137     -18.871 -26.246 -70.218
ATOM      3  C   PRO  137     -19.596 -25.304 -69.246
ATOM      4  O   PRO  137     -20.765 -24.998 -69.484
ATOM      5  CB  PRO  137     -18.481 -27.564 -69.543
ATOM      6  CG  PRO  137     -17.101 -27.876 -70.074
ATOM      7  CD  PRO  137     -16.451 -26.550 -70.252
ATOM      8  N   SER  138     -18.911 -24.902 -68.166
ATOM      9  CA  SER  138     -19.217 -23.716 -67.352
ATOM     10  C   SER  138     -20.313 -23.914 -66.299
ATOM     11  O   SER  138     -21.436 -24.315 -66.621
ATOM     12  CB  SER  138     -19.572 -22.537 -68.260
ATOM     13  OG  SER  138     -19.975 -21.410 -67.504
ATOM     14  N   LEU  139     -20.005 -23.580 -65.038
ATOM     15  CA  LEU  139     -20.898 -23.917 -63.925
ATOM     16  C   LEU  139     -22.188 -23.123 -63.970
ATOM     17  O   LEU  139     -23.279 -23.682 -63.782
ATOM     18  CB  LEU  139     -20.188 -23.699 -62.583
ATOM     19  CG  LEU  139     -19.627 -24.970 -61.946
ATOM     20  CD1 LEU  139     -18.755 -24.666 -60.742
ATOM     21  CD2 LEU  139     -20.728 -25.961 -61.590
ATOM     22  N   GLU  140     -22.082 -21.810 -64.173
ATOM     23  CA  GLU  140     -23.280 -21.015 -64.387
ATOM     24  C   GLU  140     -24.115 -21.597 -65.524
ATOM     25  O   GLU  140     -25.351 -21.623 -65.454
ATOM     26  CB  GLU  140     -22.905 -19.560 -64.677
ATOM     27  CG  GLU  140     -21.960 -18.903 -63.663
ATOM     28  CD  GLU  140     -20.499 -19.211 -63.923
ATOM     29  OE1 GLU  140     -19.671 -18.277 -63.859
ATOM     30  OE2 GLU  140     -20.180 -20.384 -64.201

我想匹配三个数字(137 等)的列,并用 替换这些数字1..2..3。所以我想用 替换13711382。我不能简单地匹配数字,因为文件很大,而且文件的数字是重复的。

我期望得到的最好信息是这样的:

ATOM      1  N   PRO    1     -17.579 -25.693 -70.648
ATOM      2  CA  PRO    1     -18.871 -26.246 -70.218
ATOM      3  C   PRO    1     -19.596 -25.304 -69.246
ATOM      4  O   PRO    1     -20.765 -24.998 -69.484
ATOM      5  CB  PRO    1     -18.481 -27.564 -69.543
ATOM      6  CG  PRO    1     -17.101 -27.876 -70.074
ATOM      7  CD  PRO    2     -16.451 -26.550 -70.252
ATOM      8  N   SER    2     -18.911 -24.902 -68.166
ATOM      9  CA  SER    2     -19.217 -23.716 -67.352
ATOM     10  C   SER    2     -20.313 -23.914 -66.299
ATOM     11  O   SER    2     -21.436 -24.315 -66.621
ATOM     12  CB  SER    2     -19.572 -22.537 -68.260
ATOM     13  OG  SER    2     -19.975 -21.410 -67.504
.
.
.
.
ATOM     14  N   LEU   39     -20.005 -23.580 -65.038
ATOM     15  CA  LEU   39     -20.898 -23.917 -63.925
ATOM     16  C   LEU   39     -22.188 -23.123 -63.970
ATOM     17  O   LEU   39     -23.279 -23.682 -63.782
ATOM     18  CB  LEU   39     -20.188 -23.699 -62.583
ATOM     19  CG  LEU   39     -19.627 -24.970 -61.946
ATOM     20  CD1 LEU   39     -18.755 -24.666 -60.742
ATOM     21  CD2 LEU   39     -20.728 -25.961 -61.590

可能有帮助的是,每个三个字母的 ID(PRO、SER、LEU)都有一个特定的数字。

我如何在 Bash 中实现这一点?

答案1

以下awk脚本将跟踪第 5 个字段中的所有数字并用计数数字替换它们:

awk '!a[$5]{a[$5]=++c}{$5=a[$5]}1' file | column -t

该数组a存储计数数字。当在第 5 个字段中看到新数字时,该数字会增加,然后将其分配给该字段。

如果希望在第 5 个字段的值每次改变时增加计数数字,请使用以下命令:

awk 'o!=$5{++c}{o=$5;$5=c}1' file | column -t

该变量o保留上一行的第 5 个字段值,并且c每当变量o发生变化时计数器就会增加。

column -t命令将输出格式化为列。

答案2

如果我正确理解了你的问题,你可以使用这个:

perl -ane '$F[4]-=136; print join("\t",@F);' input.txt > output.txt

此命令将逐行读取输入文件,从第五列的数字中减去 136,然后将结果写入输出文件。因此,137 将转换为 1,138 转换为 2,依此类推。

相关内容