ファイルの3番目の列(特定の文字まで)を別のファイルで置き換える方法

ファイルの3番目の列(特定の文字まで)を別のファイルで置き換える方法

bor.mol2とbor.comという2つのファイルがあります。 bor.mol2には原子のX、Y、Z座標があり、@<TRIPOS>ATOMファイル@<TRIPOS>BONDのキーワード列3、4、5は原子の座標です。たとえば、H1 の座標は -0.1660 2.5890 -0.2030 です。

他のファイルはbor.comで、列2、3、4はX、Y、Z座標( 0 1との間1 2 1.0)です。 bor.mol2座標をbor.com座標に置き換えて、以下のようにboron.mol2を取得したいと思います。

awkまたはgrepを使用してこれをどのように実行できますか?

ホウ素ほくろ2

@<TRIPOS>MOLECULE
MOL
   19    18     1     0     0
SMALL
resp


@<TRIPOS>ATOM
      1 H1          -0.1660     2.5890    -0.2030 H          1 MOL       0.425234
      2 O1          -0.6950     1.8160    -0.3360 O          1 MOL      -0.740851
      3 B1          -0.0040     0.6800    -0.0410 B          1 MOL       0.916675
      4 O2           1.2760     0.7930     0.3900 O          1 MOL      -0.584834
      5 C1           2.0810    -0.3200     0.7070 C          1 MOL       0.351772
      6 C2           2.8020    -0.8460    -0.5220 C          1 MOL      -0.254733
      7 H2           3.3950    -0.0620    -0.9800 H          1 MOL       0.065923
      8 H3           2.0930    -1.2150    -1.2550 H          1 MOL       0.065923
      9 H4           3.4660    -1.6630    -0.2510 H          1 MOL       0.065923
     10 H5           1.4780    -1.0990     1.1550 H          1 MOL      -0.005252
     11 H6           2.7960     0.0200     1.4450 H          1 MOL      -0.005252
     12 O3          -0.5850    -0.5340    -0.1770 O          1 MOL      -0.584834
     13 C3          -1.9220    -0.7000    -0.5940 C          1 MOL       0.351772
     14 C4          -2.8780    -0.6420     0.5840 C          1 MOL      -0.254733
     15 H7          -3.8950    -0.8350     0.2550 H          1 MOL       0.065923
     16 H8          -2.8530     0.3360     1.0520 H          1 MOL       0.065923
     17 H9          -2.6110    -1.3870     1.3260 H          1 MOL       0.065923
     18 H10         -2.1780     0.0530    -1.3290 H          1 MOL      -0.005252
     19 H11         -1.9740    -1.6700    -1.0740 H          1 MOL      -0.005252
@<TRIPOS>BOND
     1     1     2 1   
     2     2     3 1   
     3     3     4 1   
     4     3    12 1   
     5     4     5 1   
     6     5     6 1   
     7     5    10 1   
     8     5    11 1   
     9     6     7 1   
    10     6     8 1   
    11     6     9 1   
    12    12    13 1   
    13    13    14 1   
    14    13    18 1   
    15    13    19 1   
    16    14    15 1   
    17    14    16 1   
    18    14    17 1   
@<TRIPOS>SUBSTRUCTURE
     1 MOL         1 TEMP              0 ****  ****    0 ROOT

bor.com:

%nprocshared=4
%mem=1GB
# am1 geom=connectivity sp

MOL

0 1
 H                 -0.16720146    2.58919775   -0.19942423
 O                 -0.69500000    1.81600000   -0.33600000
 B                 -0.00400000    0.68000000   -0.04100000
 O                 -0.38867986   -0.48241992   -0.62214658
 C                  0.24973028   -1.71425091   -0.37253088
 C                 -0.34829932   -2.40893346    0.83855738
 H                 -1.41561875   -2.54983268    0.70799890
 H                 -0.18501334   -1.82371627    1.73688335
 H                  0.11053291   -3.38414892    0.98087325
 H                  1.31216868   -1.56088464   -0.23520857
 H                  0.10760188   -2.31766293   -1.25975262
 O                  1.04303104    0.71384972    0.81482310
 C                  1.49768870    1.90335555    1.42093890
 C                  2.50478033    2.62078365    0.54000342
 H                  2.89233808    3.49938587    1.04758216
 H                  2.04460091    2.94105867   -0.38832398
 H                  3.33724896    1.96604913    0.30506364
 H                  0.65864568    2.55057309    1.64429105
 H                  1.95688815    1.61234302    2.35819638

 1 2 1.0
 2 3 1.0
 3 4 1.0 12 1.0
 4 5 1.0
 5 6 1.0 10 1.0 11 1.0
 6 7 1.0 8 1.0 9 1.0
 7
 8
 9
 10
 11
 12 13 1.0
 13 14 1.0 18 1.0 19 1.0
 14 15 1.0 16 1.0 17 1.0
 15
 16
 17
 18
 19

結果は次のようにboron.mol2でなければなりません。

@<TRIPOS>MOLECULE
MOL
   19    18     1     0     0
SMALL
resp


@<TRIPOS>ATOM
      1 H1           -0.16720146    2.58919775   -0.19942423 H          1 MOL       0.425234
      2 O1           -0.69500000    1.81600000   -0.33600000 O          1 MOL      -0.740851
      3 B1           -0.00400000    0.68000000   -0.04100000 B          1 MOL       0.916675
      4 O2           -0.38867986   -0.48241992   -0.62214658 O          1 MOL      -0.584834
      5 C1            0.24973028   -1.71425091   -0.37253088 C          1 MOL       0.351772
      6 C2           -0.34829932   -2.40893346    0.83855738 C          1 MOL      -0.254733
      7 H2           -1.41561875   -2.54983268    0.70799890 H          1 MOL       0.065923
      8 H3           -0.18501334   -1.82371627    1.73688335 H          1 MOL       0.065923
      9 H4            0.11053291   -3.38414892    0.98087325 H          1 MOL       0.065923
     10 H5            1.31216868   -1.56088464   -0.23520857 H          1 MOL      -0.005252
     11 H6            0.10760188   -2.31766293   -1.25975262 H          1 MOL      -0.005252
     12 O3            1.04303104    0.71384972    0.81482310 O          1 MOL      -0.584834
     13 C3            1.49768870    1.90335555    1.42093890 C          1 MOL       0.351772
     14 C4            2.50478033    2.62078365    0.54000342 C          1 MOL      -0.254733
     15 H7            2.89233808    3.49938587    1.04758216 H          1 MOL       0.065923
     16 H8            2.04460091    2.94105867   -0.38832398 H          1 MOL       0.065923
     17 H9            3.33724896    1.96604913    0.30506364 H          1 MOL       0.065923
     18 H10           0.65864568    2.55057309    1.64429105 H          1 MOL      -0.005252
     19 H11           1.95688815    1.61234302    2.35819638 H          1 MOL      -0.005252
@<TRIPOS>BOND
     1     1     2 1   
     2     2     3 1   
     3     3     4 1   
     4     3    12 1   
     5     4     5 1   
     6     5     6 1   
     7     5    10 1   
     8     5    11 1   
     9     6     7 1   
    10     6     8 1   
    11     6     9 1   
    12    12    13 1   
    13    13    14 1   
    14    13    18 1   
    15    13    19 1   
    16    14    15 1   
    17    14    16 1   
    18    14    17 1   
@<TRIPOS>SUBSTRUCTURE
     1 MOL         1 TEMP              0 ****  ****    0 ROOT

答え1

私はawkをよく知らず、sedを使います。

sed -rn '/^ [A-Z]/{H;x;s/^\n//;x};/^ *[0-9]+ +[A-Z]+[0-9]+/{G;s/^( *[^ ]+ +[^ ]+) +[^ ]+ +[^ ]+ +[^ ]+([^\n]+)\n *[^ ]+( *[^ ]+ +[^ ]+ +[^\n]+).*/\1\3\2/;x;s/^[^\n]+\n//;x};/MOLECULE/,$p' bor.com bor.mol2 > boron.mol2

出力:ホウ素ほくろ2

@<TRIPOS>MOLECULE
MOL
   19    18     1     0     0
SMALL
resp


@<TRIPOS>ATOM
      1 H1                 -0.16720146    2.58919775   -0.19942423 H          1 MOL       0.425234
      2 O1                 -0.69500000    1.81600000   -0.33600000 O          1 MOL      -0.740851
      3 B1                 -0.00400000    0.68000000   -0.04100000 B          1 MOL       0.916675
      4 O2                 -0.38867986   -0.48241992   -0.62214658 O          1 MOL      -0.584834
      5 C1                  0.24973028   -1.71425091   -0.37253088 C          1 MOL       0.351772
      6 C2                 -0.34829932   -2.40893346    0.83855738 C          1 MOL      -0.254733
      7 H2                 -1.41561875   -2.54983268    0.70799890 H          1 MOL       0.065923
      8 H3                 -0.18501334   -1.82371627    1.73688335 H          1 MOL       0.065923
      9 H4                  0.11053291   -3.38414892    0.98087325 H          1 MOL       0.065923
     10 H5                  1.31216868   -1.56088464   -0.23520857 H          1 MOL      -0.005252
     11 H6                  0.10760188   -2.31766293   -1.25975262 H          1 MOL      -0.005252
     12 O3                  1.04303104    0.71384972    0.81482310 O          1 MOL      -0.584834
     13 C3                  1.49768870    1.90335555    1.42093890 C          1 MOL       0.351772
     14 C4                  2.50478033    2.62078365    0.54000342 C          1 MOL      -0.254733
     15 H7                  2.89233808    3.49938587    1.04758216 H          1 MOL       0.065923
     16 H8                  2.04460091    2.94105867   -0.38832398 H          1 MOL       0.065923
     17 H9                  3.33724896    1.96604913    0.30506364 H          1 MOL       0.065923
     18 H10                  0.65864568    2.55057309    1.64429105 H          1 MOL      -0.005252
     19 H11                  1.95688815    1.61234302    2.35819638 H          1 MOL      -0.005252
@<TRIPOS>BOND
     1     1     2 1   
     2     2     3 1   
     3     3     4 1   
     4     3    12 1   
     5     4     5 1   
     6     5     6 1   
     7     5    10 1   
     8     5    11 1   
     9     6     7 1   
    10     6     8 1   
    11     6     9 1   
    12    12    13 1   
    13    13    14 1   
    14    13    18 1   
    15    13    19 1   
    16    14    15 1   
    17    14    16 1   
    18    14    17 1   
@<TRIPOS>SUBSTRUCTURE
     1 MOL         1 TEMP              0 ****  ****    0 ROOT

答え2

1つの方法は次のとおりです。

$ awk '{
  if(/@<TRIPOS>ATOM/){a=1; print; next}
  if(/@<TRIPOS>BOND/){a=0}
  if(NR==FNR){
      val[FNR][2]=$2;
      val[FNR][3]=$3;
      val[FNR][4]=$4;
  }
  else{
    if(a){
      OFS="\t"
      $3=val[a][2];
      $4=val[a][3];
      $5=val[a][4]
      a++;
    }
    print $0
  }
}' <(grep '^ [A-Z]' bor.com) bor.mol2 

上記の結果は次のとおりです。

@<TRIPOS>MOLECULE
MOL
   19    18     1     0     0
SMALL
resp


@<TRIPOS>ATOM
1   H1  -0.16720146 2.58919775  -0.19942423 H   1   MOL 0.425234
2   O1  -0.69500000 1.81600000  -0.33600000 O   1   MOL -0.740851
3   B1  -0.00400000 0.68000000  -0.04100000 B   1   MOL 0.916675
4   O2  -0.38867986 -0.48241992 -0.62214658 O   1   MOL -0.584834
5   C1  0.24973028  -1.71425091 -0.37253088 C   1   MOL 0.351772
6   C2  -0.34829932 -2.40893346 0.83855738  C   1   MOL -0.254733
7   H2  -1.41561875 -2.54983268 0.70799890  H   1   MOL 0.065923
8   H3  -0.18501334 -1.82371627 1.73688335  H   1   MOL 0.065923
9   H4  0.11053291  -3.38414892 0.98087325  H   1   MOL 0.065923
10  H5  1.31216868  -1.56088464 -0.23520857 H   1   MOL -0.005252
11  H6  0.10760188  -2.31766293 -1.25975262 H   1   MOL -0.005252
12  O3  1.04303104  0.71384972  0.81482310  O   1   MOL -0.584834
13  C3  1.49768870  1.90335555  1.42093890  C   1   MOL 0.351772
14  C4  2.50478033  2.62078365  0.54000342  C   1   MOL -0.254733
15  H7  2.89233808  3.49938587  1.04758216  H   1   MOL 0.065923
16  H8  2.04460091  2.94105867  -0.38832398 H   1   MOL 0.065923
17  H9  3.33724896  1.96604913  0.30506364  H   1   MOL 0.065923
18  H10 0.65864568  2.55057309  1.64429105  H   1   MOL -0.005252
19  H11 1.95688815  1.61234302  2.35819638  H   1   MOL -0.005252
@<TRIPOS>BOND
     1     1     2 1   
     2     2     3 1   
     3     3     4 1   
     4     3    12 1   
     5     4     5 1   
     6     5     6 1   
     7     5    10 1   
     8     5    11 1   
     9     6     7 1   
    10     6     8 1   
    11     6     9 1   
    12    12    13 1   
    13    13    14 1   
    14    13    18 1   
    15    13    19 1   
    16    14    15 1   
    17    14    16 1   
    18    14    17 1   
@<TRIPOS>SUBSTRUCTURE
     1 MOL         1 TEMP              0 ****  ****    0 ROOT

このコマンドは空白で始まり、後に大文字が続くgrep '^ [A-Z]' bor.com行だけを印刷します。bor.comこれが私たちが望む唯一の行ですbor.com。 bashの設定を使用して、grep出力をファイルハンドルにawkに渡します<()valスクリプトが読み取っているファイルが入力ファイルの最初のファイルである場合、スクリプトは配列に値を格納します(2番目の文字列とNR==FNR)文字列@<TRIPOS>ATOMの間@<TRIPOS>BONDにある場合は3番目、4番目のファイルを置き換えます)。 5番目のフィールドは配列の値に関連付けられていますval

関連情報