【问题标题】:awk gsub messing up formatawk gsub 搞乱格式
【发布时间】:2015-09-12 19:51:03
【问题描述】:

我正在尝试通过使用在其中运行 awk 文件的 bash 脚本替换 pdb 中满足特定条件的 2 列(bash 脚本有另一个目的,而 awk 文件用于代码分离)。当我在不设置 OFS 的情况下运行脚本时,带有字符串替换的行没有足够的间距。当我设置OFS="\t" 时,间距太大(相对于未更改的行)。为什么只执行字符串操作时会改变整行的格式?

这里是 myScript.sh

(some unrelated grep stuff)
awk -f ./myAwkScript.awk 4HKD.pdb.bk > 4HKD.pdb.bk.gen

这里是 myAwkScript.awk

#!/usr/bin/awk 

BEGIN { OFS="\t" }
{ if( $1=="HETATM" && $4=="MSE" ) { 
        gsub( /MSE/, "MET", $4 ); 
        gsub( /HETATM/, "ATOM", $1 );
  }
  print;
}

这是输出的样子,所以你可以看到它对标签的作用

ATOM    127  OE1 GLN A 449      -4.056  11.297 119.695  1.00 20.83           O  
ATOM    128  NE2 GLN A 449      -1.948  10.876 120.359  1.00 14.98           N  
ATOM    129     N       MET     A       450     -4.523  16.830  119.280 1.00    14.88   N
ATOM    130     CA      MET     A       450     -5.537  17.804  118.911 1.00    15.65   C
ATOM    137  N   ARG A 451      -3.902  19.530 119.337  1.00 15.80           N  
ATOM    138  CA  ARG A 451      -3.228  20.800 119.118  1.00 15.54           C  
ATOM    139  C   ARG A 451      -2.430  20.827 117.826  1.00 16.64           C            C

这就是不改变 OFS 的样子

ATOM    127  OE1 GLN A 449      -4.056  11.297 119.695  1.00 20.83           O  
ATOM    128  NE2 GLN A 449      -1.948  10.876 120.359  1.00 14.98           N  
ATOM 129 N MET A 450 -4.523 16.830 119.280 1.00 14.88 N
ATOM 130 CA MET A 450 -5.537 17.804 118.911 1.00 15.65 C
ATOM 135 SE MET A 450 -8.866 19.181 121.271 1.00 55.26 SE
ATOM 136 CE MET A 450 -7.749 20.188 122.510 1.00 28.83 C
ATOM    137  N   ARG A 451      -3.902  19.530 119.337  1.00 15.80           N  
ATOM    138  CA  ARG A 451      -3.228  20.800 119.118  1.00 15.54           C  
ATOM    139  C   ARG A 451      -2.430  20.827 117.826  1.00 16.64           C  

【问题讨论】:

  • 获取 Arnold Robbins 的《Effective Awk Programming》,第 4 版一书,并至少阅读前几章以了解如何编写 awk 脚本,因为现在您缺少基础知识.

标签: shell awk gsub


【解决方案1】:

保留未修改的行距。如果您在 print 语句之前添加$1=$1,它会这样做。此外,由于您正在寻找完全匹配,因此不需要 gsub。顺便说一句,您可以将脚本重写为

BEGIN {
    OFS="\t"
}
$1=="HETATM" && $4=="MSE" {
    $1="ATOM"        
    $4="MET" 
} 
{$1=$1}
1

【讨论】:

    猜你喜欢
    • 2012-10-11
    • 1970-01-01
    • 2020-07-27
    • 2020-12-13
    • 1970-01-01
    • 2012-07-12
    • 2016-05-10
    • 1970-01-01
    • 2013-06-26
    相关资源
    最近更新 更多