Я бы предложил предварительно обработать ввод в более простую форму с sed
, а затем повторить цикл.Предполагается, что chain=(...)
всегда является первым таким атрибутом в строке.
#!/bin/sh
# Replace 2ICQ_p chain=(A B C ... Z) attribs= ... with
# 2ICQ_p A B C ... Z
sed 's/ chain=\(//;s/\).*//' <proteome.pisa |
while read pdbid chain; do
chains=${chain/ /}
for c in $chain; do
test -e ${pdbid}_${c}_p.pdb || continue
cat ${pdbdid}_${c}_p.pdb
done >${pdbid}_p_${chains}.pdb
done
Это позволяет избежать использования временных файлов, которые пронизывают ваш первый скрипт;поиск сгенерированного файла также выглядит довольно поразительно, если не тревожно (обычно вы можете использовать обратные пометки для такого рода вещей, но они здесь на самом деле не требуются).некоторые (например, Linux) хотят, чтобы буквальные скобки были разделены обратной косой чертой, другие (например, Mac OSX) этого не делают.Если это не сработает, попробуйте удалить обратную косую черту.
read
с несколькими именами переменных разделяет входные данные на пробельные символы, так что имя первой переменной получает первый токен и т. Д .;последняя именованная переменная получает все, что осталось, без дополнительного разделения пробелов.continue
переходит к следующей итерации окружающего цикла for
или while
.Помимо этого, это должно быть довольно очевидно.Если вы действительно хотите сделать все это в чистой оболочке Bourne, замену sed
в начале, вероятно, можно заменить чем-то, включающим подстановку строк.