我有一个 *.pdb 文件,如下所示:-
CRYST1 78.428 78.428 78.428 90.00 90.00 90.00 P 1 1
ATOM 1 CI1 JPIPP 1 41.874 78.965 24.633 1.00 0.00 PI C
ATOM 2 CI2 JPIPP 1 41.978 79.560 26.065 1.00 0.00 PI C
ATOM 3 CI3 JPIPP 1 40.811 80.549 26.148 1.00 0.00 PI C
ATOM 4 CI4 JPIPP 1 39.498 79.850 25.983 1.00 0.00 PI C
ATOM 5 O4P JPIPP 1 38.376 80.788 26.069 1.00 0.00 PI O
ATOM 6 P4 JPIPP 1 37.130 80.601 27.002 1.00 0.00 PI P
ATOM 7 O41 JPIPP 1 37.214 81.710 27.969 1.00 0.00 PI O
ATOM 8 O42 JPIPP 1 35.998 80.809 26.128 1.00 0.00 PI O
ATOM 9 O43 JPIPP 1 37.088 79.268 27.654 1.00 0.00 PI O
ATOM 37 HT3 ILE P 10 13.930 68.062 46.163 1.00 0.00 P1
ATOM 38 CA ILE P 10 15.421 69.513 46.954 1.00 0.00 P1 C
ATOM 39 HA ILE P 10 14.944 69.690 47.906 1.00 0.00 P1 H
ATOM 40 CB ILE P 10 16.432 68.520 47.458 1.00 0.00 P1 C
如果我的第 3 列 P4 或 CA,我打算将第 10 列的值更改为“1”。我尝试使用 awk 来完成此任务,但失败了。 awk 不允许我保留格式。
我找到了一个答案,建议使用“gawk”并成功保留格式。我试图改变解决方案,但遗憾的是它不起作用。请帮忙解决这个问题。
gawk '
# NR==FNR { pdb[NR]=$0; next }
{
split(pdb[FNR],flds,FS,seps)
if ( flds[3] == "CA" || flds[3] == "P4"
flds[10]=1
for (i=1;i in flds;i++)
printf "%s%s", flds[i], seps[i]
print ""
}
' NVT20ns.pdb > test.pdb
答案1
$ perl -pe 's/ILE P/ILEP/; s/^(\s*(\S+\s+){9})\S+/${1}1/ if /^(\s*(\S+\s+){2})(P4|CA)/; s/ILEP/ILE P/' ip.txt
CRYST1 78.428 78.428 78.428 90.00 90.00 90.00 P 1 1
ATOM 1 CI1 JPIPP 1 41.874 78.965 24.633 1.00 0.00 PI C
ATOM 2 CI2 JPIPP 1 41.978 79.560 26.065 1.00 0.00 PI C
ATOM 3 CI3 JPIPP 1 40.811 80.549 26.148 1.00 0.00 PI C
ATOM 4 CI4 JPIPP 1 39.498 79.850 25.983 1.00 0.00 PI C
ATOM 5 O4P JPIPP 1 38.376 80.788 26.069 1.00 0.00 PI O
ATOM 6 P4 JPIPP 1 37.130 80.601 27.002 1.00 1 PI P
ATOM 7 O41 JPIPP 1 37.214 81.710 27.969 1.00 0.00 PI O
ATOM 8 O42 JPIPP 1 35.998 80.809 26.128 1.00 0.00 PI O
ATOM 9 O43 JPIPP 1 37.088 79.268 27.654 1.00 0.00 PI O
ATOM 37 HT3 ILE P 10 13.930 68.062 46.163 1.00 0.00 P1
ATOM 38 CA ILE P 10 15.421 69.513 46.954 1.00 1 P1 C
ATOM 39 HA ILE P 10 14.944 69.690 47.906 1.00 0.00 P1 H
ATOM 40 CB ILE P 10 16.432 68.520 47.458 1.00 0.00 P1 C
ILE P
第四列有预处理和后处理要处理s/^(\s*(\S+\s+){9})\S+/${1}1/
将第 10 列值更改为1
/^(\s*(\S+\s+){2})(P4|CA)/
将匹配第三列中的P4
orCA