awk gsub搞乱格式

时间:2015-09-12 19:51:03

标签: shell awk gsub

我试图通过使用在其中运行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  

1 个答案:

答案 0 :(得分:1)

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

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