使用 gawk 更改特定列并保留 PDB 的原始格式

使用 gawk 更改特定列并保留 PDB 的原始格式

我有一个 *.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)/将匹配第三列中的P4orCA

相关内容