2016-05-30 6 views
0

化学構造のデカルトxyz座標を含む膨大な数のプレーンテキストファイルがあります。試料がそのようになります。この場合xyzはsedまたはawkを使って座標を操作します

B     -1.38372433 0.56274955 2.22204795 
B     0.01637488 1.69210489 1.81167819 
B     0.29103422 -0.35499374 0.15388510 
B     1.14485163 0.19631678 1.74992009 
Fe    -0.92583118 1.01775624 0.27450973 
S     -0.35374797 -1.05624221 1.74656393 
C     -1.87367299 1.66919492 -1.27526252 
O     -2.42173866 2.04584255 -2.17123145 
H     -2.54747585 0.75818308 2.22742141 
H     0.62677160 -0.81072498 -0.88156036 
H     0.38495881 2.74424131 2.19841880 
H     2.25808628 0.09159351 1.37282254 

を、各H原子が1.18オングストロームの距離とB原子に結合しています。私がしなければならないのは、各頂点をP頂点で順番に変えることです。 bashを使って、最初に出会った最初のB原子の座標をとり、これを球の原点として使用し、結合した水素原子の半径1.18オングストローム内で検索することで、すべてのテキストファイルを一度に処理したいと思いますこのH原子をその座標で削除し、B原子をP原子に変更する。私はしばらく前に似た何かをやったが、それは1.2オングストロームの距離でH原子のXYZ座標を追加して

P     -1.38372433 0.56274955 2.22204795 
B     0.01637488 1.69210489 1.81167819 
B     0.29103422 -0.35499374 0.15388510 
B     1.14485163 0.19631678 1.74992009 
Fe    -0.92583118 1.01775624 0.27450973 
S     -0.35374797 -1.05624221 1.74656393 
C     -1.87367299 1.66919492 -1.27526252 
O     -2.42173866 2.04584255 -2.17123145 
H     0.62677160 -0.81072498 -0.88156036 
H     0.38495881 2.74424131 2.19841880 
H     2.25808628 0.09159351 1.37282254 

:Anは上記のサンプルの出力は、そのようなものになるだろうと予想

既存のB原子から。私がいた当時どのような使用:

for i in *.inp; do awk '/^B/{ print; if (++count == 1) printf("%-10.8f %-14.8f %-14.8f %s\n", "H", $2+1.2, $3+1.2, $4+1.2); next } { print }' $i > temp/`basename $i`--H.inp; done 

しかし、私はまだ私の現在の問題を解決するために類似した何かを考え出すことに成功していませんよ。

すべてのヘルプは本当に事前に おかげ

+1

与えられた入力に対する期待される出力は何ですか? – choroba

+0

@choroba:返事をありがとう。私は操作の期待される出力を与えるために質問を編集しました。 – nytrook

答えて

1

Perlが解決高く評価され:

#!/usr/bin/perl 
use warnings; 
use strict; 

my @P; 
my $deleted; 
while (<>) { 
    my @F = split; 
    $F[0] = 'P', @P = @F if ! @P && 'B' eq $F[0]; 
    if ('H' eq $F[0] && ! $deleted) { 
     die "No B found yet!\n" unless @P; 
     my $close = grep abs($F[$_] - $P[$_]) <= 1.18001, 1, 2, 3; 
     $deleted = 1, next if 3 == $close; 
    } 
    print "@F\n"; 
} 
+0

あなたは素晴らしいです! – nytrook

+0

もう一度お世話になります。 1回目の質問ではなく、例えば2番目のB原子または3番目の原子に作用したいのですか? – nytrook

+0

@nytrook:あなたが必要なものに遭遇するまで、Bの数を数えます。 – choroba

関連する問題