2016-05-30 51 views
0

我有大量純文本文件包含笛卡爾xyz座標的化學結構。樣品可以看起來像這樣:使用sed或awk進行xyz座標操作

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原子。我應該做的是依次改變每個BH頂點的P頂點。 使用bash,我想通過對所遇到的第一個B原子的座標立即處理所有文本文件,並將其用作球體的原點,並在1.18埃的半徑範圍內搜索鍵合的氫原子,用它的座標刪除這個H原子,然後把B變成一個P原子。

一個預期的上述樣品的輸出將是類似的東西:

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 

我已經做了類似的東西而回,但以1.2埃的距離H原子的這是添加XYZ座標來自現有的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

再次感謝您的幫助。只是一個問題,如果我想要在第二個B原子或第三個原子上運行,而不是第一個遇到的問題,那麼該怎麼辦? – nytrook

+0

@nytrook:然後數B,直到遇到你需要的。 – choroba