x,y和z坐标的组合(存储在三个不同的文件中)

时间:2011-08-19 20:21:16

标签: bash coordinates permutation combinations

我正在编写一个bash脚本,用于自动盲目对接(在蛋白质中发现结合位点)。为此,我将较大的3D网格划分为较小的重叠网格。

我创建了三个文件,分别包含子网格中心的x,y和z坐标。换句话说,一个文件包含所有可能的x坐标(每行一个),第二个全部是y坐标,第三个是所有z坐标。坐标有三个小数位,可以是正数或负数。

现在我想找到x,y和z的所有可能组合。对于每个组合,我想创建一个文件夹(称为x1y1z1,x1y2z1,x1y3z1等),其中包含一个文本文件,其中x,y和z坐标对应于该特定组合。

我找到了使用Python的相关问题的解决方案。但是,由于我不熟悉Python并且我已经有一个包含大量变量的大型bash脚本,我想知道是否有一种简单的方法可以用bash或其他任何我可以轻松集成的语言来实现在我现有的bash脚本中。

亲切的问候,

米罗

更新:

这是Matt 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 个答案:

答案 0 :(得分: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