Мое решение состоит в том, чтобы собрать часть вашего скрипта awk в bash, в частности функцию соответствия.
Похоже, вы хотите, чтобы поля, соответствующие $1 == "ATOM" && ($5==c[0] || $5==c[1]...) {print $0}
, были экспортированы в файл.
В bash создайте функцию сопоставления следующим образом:
cmatch="\$5==\"${chain[0]}\""
for element in $(seq 1 $((${#chain[@]} - 1))); do cmatch+=" || \$5==\"${chain[$element]}\""; done
#cmatch should now be of the form "$5==A || $5==B"
#do the same thing for rmatch
rmatch="\$4==\"${hresname[0]}\""
for element in $(seq 1 $((${#hresname[@]} - 1))); do rmatch+=" || \$4==\"${hresname[$element]}\""; done
Теперь ваши awk-скрипты можно настроить так, чтобы они включали необходимые биты: (Кавычки по-прежнему трудны, так как вам нужно убедиться, что $ 1 сводится к awk без изменений, но $ cmatch оценивается.)
rmatch='$1=="HETATM" && ('"$cmatch"') && ('"$rmatch"')' #order is important here :)
cmatch='$1=="ATOM" && ('"$cmatch"')'
Итак, ваш соответствующий скрипт должен быть завершен.
awk "$cmatch" ${pdbid}.pdb >> ../../properpdb/${pdbid}_c.pdb
awk "$rmatch" ${pdbid}.pdb >> ../../properpdb/${pdbid}_c.pdb
Я не совсем понимаю имя выходного файла, ../../properpdb/${pdbid}_${c}.pdb
, так как это может показывать отдельные файлы для каждого элемента c, что вам не нужно?
Если вы хотите, чтобы они были разделены на элементы c, то немного проще, создайте массив rmatch, как описано выше, а затем сделайте что-то вроде
for c in "${chain[@]}" ; do
awk -v c="$c" '$1=="ATOM" && $5==c' ${pdbid}.pdb >> ../../properpdb/${pdbid}_${c}.pdb
awk -v c="$c" '$1=="HETATM" && $5==c && ('"$rmatch"')' ${pdbid}.pdb >> ../../properpdb/${pdbid}_${c}.pdb
done
Если вы хотите сначала все элементы ATOM или ...
for c in "${chain[@]}" ; do
awk -v c="$c" '$5==c && ($1=="ATOM" || ($1=="HETATM" && ('"$rmatch"')))' ${pdbid}.pdb >> ../../properpdb/${pdbid}_${c}.pdb
done
если вы хотите, чтобы они смешались