我有一个.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
。所以我想用 替换137
,1
用138
等2
。我不能简单地匹配数字,因为文件很大,而且文件的数字是重复的。
我期望得到的最好信息是这样的:
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,依此类推。