2011-08-19 99 views
0

我正在寫一個bash腳本來自動盲目停靠(在蛋白質中發現綁定站點)。爲此,我在一個較小的重疊網格中劃分了一個大的3D網格。x,y和z座標的組合(存儲在三個不同的文件中)

我已經創建了三個文件,分別包含子網格中心的x,y和z座標。換句話說,一個文件包含所有可能的x座標(每行一個),第二個所有y座標和第三個所有z座標。座標有三位小數,可以是正數也可以是負數。

現在我想找到所有可能的x,y和z的組合。對於每個組合,我想創建一個文件夾(稱爲x1y1z1,x1y2z1,x1y3z1等),其中包含一個文本文件,其中包含與該特定組合相對應的x,y和z座標。

我找到了解決方案,使用Python的相關問題。但是,由於我對Python不熟悉,而且我已經定義了大量變量,所以我想知道是否有一種簡單的方法可以在bash或其他任何可以輕鬆集成的語言中執行此操作在我現有的bash腳本中。

親切的問候,

米羅

UPDATE:

這是馬特·d表示該解決方案的改編版本(感謝一百萬):

for x in $(cat centrex.tmp) ; do 
for y in $(cat centrey.tmp) ; do 
    for z in $(cat centrez.tmp) ; do 
     xvar=$(expr "$x" : '\(.*\)=.*') 
     yvar=$(expr "$y" : '\(.*\)=.*') 
     zvar=$(expr "$z" : '\(.*\)=.*') 
     folder="${xvar}${yvar}${zvar}" 
     mkdir $folder 
     echo "center_x = "${x#*=} >> vinapar.conf 
     echo "center_y = "${y#*=} >> vinapar.conf 
     echo "center_z = "${z#*=} >> vinapar.conf 
     cp vinapar.conf $folder/ 
     rm vinapar.conf 
    done 
done 
done 

的理由這是最後我用這種方式格式化我的centreX.tmp文件:

x00=-15.349 
x01=-10.349 
x02=-5.349 
... 

這使我可以在等號(x01y23z09)之前根據塊命名文件夾,然後創建包含實際座標的文件。

回答

1

如果你想要所有內容的組合,這將是一個三重嵌套循環。

#!/bin/bash 
for x in $(cat xfile) ; do 
    for y in $(cat yfile) ; do 
    for z in $(cat zfile) ; do 
     filename="$x$y$z" 
     mkdir $filename 
     # makes a file called xyz in dir xyz with contents "xyz" 
     echo $filename > $filename/$filename 
    done 
    done 
done 

編輯:這種形式將使用read(沒有測試)

#!/bin/bash 
while read x ; do 
    while read y ; do 
    while read z ; do 
     filename="$x$y$z" 
     mkdir $filename 
     # makes a file called xyz in dir xyz with contents "xyz" 
     echo $filename > $filename/$filename 
    done < zfile 
    done < yfile 
done < xfile 
+0

不使用'$(貓xfile)',使用'而讀取X;執行echo $ x done

+0

偉大的解決方案,謝謝。不幸的是,我是新的,我沒有足夠的「聲譽」來給你的答案投票。我編輯了我的原始問題以添加適合我的問題的解決方案,以防有人發現它有用。 – mirix

+0

嗨弗雷德裏克,感謝您的提示。出於好奇,在這種情況下使用「while」的優勢是什麼? – mirix

相關問題