Мне нужно запустить программу ( hole2 для тех, кто заинтересован) в директории, полной итеративно названных файлов. Я написал скрипт bash
для циклического перебора нужных файлов, редактирования требуемого файла конфигурации и запуска программы.
У меня возникли проблемы с командами sed
внутри цикла, так как они, похоже, неправильно расширяют переменные.
Код ниже;
#!/bin/bash
cd /path/to/hole/dir
shopt -s nullglob
for i in /path/to/files/*.pdb;
do
echo $i
sed -i "s=coord /path/to/files/=coord ${i}=g" config_file.inp
var=${i:72}
hole < configfile.inp > hole_out_$var.txt
sed -i "s=coord ${i}=coord /path/to/files=g" config_file.inp
done
Кажется, что $i
не расширяется; Я знаю, что есть некоторые подобные сообщения SO на эту тему, но ни один из ответов, похоже, не помог в этом случае. Я пытался заключить команду sed
в двойные или одинарные кавычки, пытался заключить в $i
двойные, одинарные или обе кавычки, с и без фигурных скобок, но моя переменная $i
записывается как $ i в моем конфигурационном файле, а не в расширенном пути к файлу, который должен быть.
Надеюсь, вышесказанное имеет смысл. Я не настроен на использование bash
и открыт для альтернативных способов достижения этого.
Добавление обоих комментариев от kasul (который, увы, я уже пробовал) и kvantour (установите -x в shebang) приводит к следующему выводу
код:
set -x
cd /home/jonah/hole2
shopt -s nullglob
for i in /media/psf/Lickitung/1-PROJECTS/Trigger_Pore/_Analysis/CLUSTERS/c_align/*.pdb;
do
# echo $i
sed -i "s=coord /media/psf/Lickitung/1-PROJECTS/Trigger_Pore/_Analysis/CLUSTERS/c_align/=coord '"${i}"'=g" hole.inp
var=${i:72}
hole < hole.inp > hole_c_$var.txt
sed -i "s=coord '"${i}"'=coord /media/psf/Lickitung/1-PROJECTS/Trigger_Pore/_Analysis/CLUSTERS/c_align/=g" hole.inp
done
На этот раз я оставил полные пути к файлам для ясности (/ laze)
выход
sed -i 's=coord '\''/media/psf/Lickitung/1-PROJECTS/Trigger_Pore/_Analysis/CLUSTERS/c_align/tst10705.pdb'\''=coord /media/psf/Lickitung/1-PROJECTS/Trigger_Pore/_Analysis/CLUSTERS/c_align/=g' hole.inp
+ for i in /media/psf/Lickitung/1-PROJECTS/Trigger_Pore/_Analysis/CLUSTERS/c_align/*.pdb
+ sed -i 's=coord /media/psf/Lickitung/1-PROJECTS/Trigger_Pore/_Analysis/CLUSTERS/c_align/=coord '\''/media/psf/Lickitung/1-PROJECTS/Trigger_Pore/_Analysis/CLUSTERS/c_align/tst10706.pdb'\''=g' hole.inp
+ var=tst10706.pdb
+ hole
+ sed -i 's=coord '\''/media
Я убил его до того, как он пробежал все 20k кластеров *, но
Вывод из программы отверстия для tst10706 все еще читает;
ошибка
Не удается открыть входной файл с координатами pdb:
$ Я
NB. Любой, кто ловко хотел бы указать на кластерный анализ 20-килограммовых структур, глуп, пожалуйста, не стесняйтесь, с тех пор я исправил эту ужасно ошибочную методологию, но я все же хотел бы найти проблему с кодом для будущего использования. .
Спасибо