通过AWK在txt中基于模式的替换

时间:2017-08-04 08:50:07

标签: text awk sed

我有一个很长的文本文件,其中某个地方附近有一行,第3列== OXT。

ATOM   2439  O   LEU   300      -4.699  34.599  65.335  1.00 83.23           O
ATOM   2440  N   LEU   301      -6.822  33.898  65.057  1.00 19.70           N
ATOM   2441  CA  LEU   301      -7.080  34.965  64.138  1.00 19.70           C
ATOM   2442  CB  LEU   301      -8.165  34.630  63.101  1.00 19.70           C
ATOM   2443  CG  LEU   301      -7.762  33.478  62.162  1.00 19.70           C
ATOM   2444  CD1 LEU   301      -8.849  33.207  61.110  1.00 19.70           C
ATOM   2445  CD2 LEU   301      -6.376  33.719  61.543  1.00 19.70           C
ATOM   2446  C   LEU   301      -7.556  36.168  64.946  1.00 19.70           C
ATOM   2447  O   LEU   301      -8.657  36.695  64.633  1.00 19.70           O
ATOM   2448  OXT LEU   301      -6.821  36.580  65.884  1.00 19.70           O
TER    2449      LEU   301
HETATM 2450 NA    NA   302     -13.016  13.036  54.214  1.00 44.33          NA
HETATM 2451  O   WAT   303     -18.411  13.587  59.094  1.00 27.41           O
HETATM 2452  O   WAT   304     -11.894  17.279  58.575  1.00 18.35           O
HETATM 2453  O   WAT   305     -15.811  12.728  54.157  1.00 39.81           O

我需要以下列方式使用模式OXT(参见下面的示例)修改此行:在第三列中 - 替换" OXT"与" N&#34 ;;在第四栏中 - 用NHE代替ACE;在最后一列中用O替换O.重要的是,在替换之后,我需要在每个列之间保留相等的空格数,如文件的其余部分所示:

ATOM   2439  O   LEU   300      -4.699  34.599  65.335  1.00 83.23           O
ATOM   2440  N   LEU   301      -6.822  33.898  65.057  1.00 19.70           N
ATOM   2441  CA  LEU   301      -7.080  34.965  64.138  1.00 19.70           C
ATOM   2442  CB  LEU   301      -8.165  34.630  63.101  1.00 19.70           C
ATOM   2443  CG  LEU   301      -7.762  33.478  62.162  1.00 19.70           C
ATOM   2444  CD1 LEU   301      -8.849  33.207  61.110  1.00 19.70           C
ATOM   2445  CD2 LEU   301      -6.376  33.719  61.543  1.00 19.70           C
ATOM   2446  C   LEU   301      -7.556  36.168  64.946  1.00 19.70           C
ATOM   2447  O   LEU   301      -8.657  36.695  64.633  1.00 19.70           O
ATOM   2448  N   NHE   301      -6.821  36.580  65.884  1.00 19.70           N
TER
HETATM 2450 NA    NA   302     -13.016  13.036  54.214  1.00 44.33          NA
HETATM 2451  O   WAT   303     -18.411  13.587  59.094  1.00 27.41           O
HETATM 2452  O   WAT   304     -11.894  17.279  58.575  1.00 18.35           O
HETATM 2453  O   WAT   305     -15.811  12.728  54.157  1.00 39.81           O

我尝试过使用

awk '$3=="OXT"{ f=1; rn=NR; $3=$NF="N"; $4="NHE" }/TER/ && f && NR-rn == 1{ $0=$1 }1' file

它已经产生了正确的工作,但是在一个新的字符串中,现在每列之间有1个空格,这是错误的格式。

ATOM 2410 N NHE 299 -17.563 -15.711 -15.915 1.00 76.42 N

但是我需要保留列之间间距的原始格式,如文件的其余部分所示:

ATOM   2448  N   NHE   301      -6.821  36.580  65.884  1.00 19.70           N

2 个答案:

答案 0 :(得分:1)

快速且非常脏:

#/bin/bash

skip=0
cat /tmp/list | while read line
do
  third=$(echo $line | awk '{print $3}')

  if [ $skip -eq 1 ]
  then
    echo "TER"
    skip=0
    continue
  fi

  if [ "${third}" == "OXT" ]
  then
    echo "${line}" | sed 's/OXT/N  /'
    skip=1
    continue
  fi

  echo "${line}"
done

当然 / tmp / list 是包含所有值的文件。

答案 1 :(得分:0)

您可以将命令的结果传递给column命令:

$>awk  '$3=="OXT"{ f=1; rn=NR; $3=$NF="N"; $4="NHE" }/TER/ && f && NR-rn == 1{ $0=$1 }1' f|column -t
ATOM    2439  O    LEU  300  -4.699   34.599  65.335  1.00  83.23  O
ATOM    2440  N    LEU  301  -6.822   33.898  65.057  1.00  19.70  N
ATOM    2441  CA   LEU  301  -7.080   34.965  64.138  1.00  19.70  C
ATOM    2442  CB   LEU  301  -8.165   34.630  63.101  1.00  19.70  C
ATOM    2443  CG   LEU  301  -7.762   33.478  62.162  1.00  19.70  C
ATOM    2444  CD1  LEU  301  -8.849   33.207  61.110  1.00  19.70  C
ATOM    2445  CD2  LEU  301  -6.376   33.719  61.543  1.00  19.70  C
ATOM    2446  C    LEU  301  -7.556   36.168  64.946  1.00  19.70  C
ATOM    2447  O    LEU  301  -8.657   36.695  64.633  1.00  19.70  O
ATOM    2448  N    NHE  301  -6.821   36.580  65.884  1.00  19.70  N
TER
HETATM  2450  NA   NA   302  -13.016  13.036  54.214  1.00  44.33  NA
HETATM  2451  O    WAT  303  -18.411  13.587  59.094  1.00  27.41  O
HETATM  2452  O    WAT  304  -11.894  17.279  58.575  1.00  18.35  O
HETATM  2453  O    WAT  305  -15.811  12.728  54.157  1.00  39.81  O