Комбинации координат x, y и z (хранятся в трех разных файлах) - PullRequest
0 голосов
/ 20 августа 2011

Я пишу bash-скрипт для автоматизации слепой стыковки (поиска сайтов связывания в белке).Для этого я разделил большую трехмерную сетку на меньшие перекрывающиеся сетки.

Я создал три файла, содержащих координаты x, y и z центров подрешеток соответственно.Другими словами, один файл содержит все возможные координаты x (по одной на строку), второй - все координаты y, а третий - все координаты z.Координаты имеют три десятичных знака и могут быть положительными или отрицательными.

Теперь я хотел бы найти все возможные комбинации x, y и z.Для каждой комбинации я хотел бы создать папку (называемую что-то вроде x1y1z1, x1y2z1, x1y3z1 и т. Д.), Содержащую текстовый файл с координатами x, y и z, которые соответствуют этой конкретной комбинации.

Я нашел решение связанных проблем, используя Python.Однако, так как я не знаком с Python и у меня уже есть большой bash-скрипт с множеством определенных переменных, я хотел бы знать, есть ли простой способ сделать это в bash или на любом другом языке, который я могу легко интегрироватьв моем существующем скрипте bash.

С уважением,

Miro

ОБНОВЛЕНИЕ:

Это адаптированная версия решения, указанная Мэттом 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 Ответ

1 голос
/ 20 августа 2011

Если вам нужны все комбинации содержимого, это будет тройной вложенный цикл.

#!/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
...