【问题标题】:retain format of input file after using awk command使用 awk 命令后保留输入文件的格式
【发布时间】:2022-09-28 20:39:43
【问题描述】:

我有一个看起来像这样的 pdb 文件-

ATOM   1737 HG13 VAL X 121      21.938  -9.234  -0.977  0.00  0.00      SYST  
ATOM   1738  CG2 VAL X 121      21.679  -7.988   1.521  0.00  0.00      SYST  
ATOM   1739 HG21 VAL X 121      22.611  -7.674   1.050  0.00  0.00      SYST  
ATOM   1740 HG22 VAL X 121      21.340  -7.213   2.207  0.00  0.00      SYST  
ATOM   1741 HG23 VAL X 121      21.863  -8.892   2.102  0.00  0.00      SYST  
ATOM   1742  C   VAL X 121      19.373  -7.193  -1.494  1.00  0.00      SYST  
ATOM   1743  O   VAL X 121      19.712  -7.180  -2.665  1.00  0.00      SYST  
ATOM   1744  OXT VAL X 121      18.180  -7.240  -1.203  0.00  0.00      SYST  
ATOM   1745  N   CYS X 122       3.096  -0.678 -19.522  0.00  0.00      SYST  
ATOM   1746  H1  CYS X 122       2.977   0.322 -19.592  0.00  0.00      SYST  
ATOM   1747  H2  CYS X 122       2.198  -1.101 -19.340  0.00  0.00      SYST  
ATOM   1748  H3  CYS X 122       3.654  -0.993 -20.303  0.00  0.00      SYST  
ATOM   1749  CZ  CYS X 122       3.913  -0.961 -18.319  0.00  0.00      SYST  
ATOM   1750  HA  CYS X 122       3.361  -1.596 -17.626  0.00  0.00      SYST  

每当在第 3 个字段中找到 \'OXT\' 时,我都会尝试将第 5 个字段中的 \'X\' 更改为 \'Y\'。 我使用 awk 命令编写了以下内容-

awk \'$3 == \"OXT\" {check=!check}check{sub(/X/,\"Y\",$5)}1\' 1vwetest.pdb > 
1vwetestoutput.pdb

但是,这会像这样改变我的输入文件的格式-

ATOM   1737 HG13 VAL X 121      21.938  -9.234  -0.977  0.00  0.00      SYST  
ATOM   1738  CG2 VAL X 121      21.679  -7.988   1.521  0.00  0.00      SYST  
ATOM   1739 HG21 VAL X 121      22.611  -7.674   1.050  0.00  0.00      SYST  
ATOM   1740 HG22 VAL X 121      21.340  -7.213   2.207  0.00  0.00      SYST  
ATOM   1741 HG23 VAL X 121      21.863  -8.892   2.102  0.00  0.00      SYST  
ATOM   1742  C   VAL X 121      19.373  -7.193  -1.494  1.00  0.00      SYST  
ATOM   1743  O   VAL X 121      19.712  -7.180  -2.665  1.00  0.00      SYST  
ATOM 1744 OXT VAL Y 121 18.180 -7.240 -1.203 0.00 0.00 SYST
ATOM 1745 N CYS Y 122 3.096 -0.678 -19.522 0.00 0.00 SYST
ATOM 1746 H1 CYS Y 122 2.977 0.322 -19.592 0.00 0.00 SYST
ATOM 1747 H2 CYS Y 122 2.198 -1.101 -19.340 0.00 0.00 SYST
ATOM 1748 H3 CYS Y 122 3.654 -0.993 -20.303 0.00 0.00 SYST
ATOM 1749 CZ CYS Y 122 3.913 -0.961 -18.319 0.00 0.00 SYST
ATOM 1750 HA CYS Y 122 3.361 -1.596 -17.626 0.00 0.00 SYST

替换值后如何保留列宽?或者有没有其他方法可以做到这一点?

    标签: awk


    【解决方案1】:

    使用GNU awkFIELDWIDTHS(假设您的输入是固定宽度,如示例所示):

    awk -v FIELDWIDTHS='12 5 4 1 *' '$2==" OXT "{f=1} f{$4="Y"} {print $1 $2 $3 $4 $5}'
    

    第一个字段是 12 个字符,第二个字段是 5 个字符,依此类推。 * 表示您要将剩余的字符分配给该字段。

    【讨论】:

      【解决方案2】:

      使用 GNU awkmatch 函数,您可以进行替换并保持与之前相同的空格(仅使用显示的示例编写和测试)。

      这是此解决方案中显示的正则表达式的Online Demo

      awk '
      match($0,/^([^[:space:]]+[[:space:]]+[^[:space:]]+[[:space:]]+)([^[:space:]]+)([[:space:]]+[^[:space:]]+[[:space:]]+)([^[:space:]]+)(.*)$/,arr){
        if(arr[2]=="OXT"){ arr[4]="Y" }
        print arr[1] arr[2] arr[3] arr[4] arr[5]
      }
      ' Input_file
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-17
        • 1970-01-01
        • 1970-01-01
        • 2014-04-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多