Массив Bash в двойном цикле (while / for / if) - PullRequest
1 голос
/ 29 августа 2011

Я анализирую несколько файлов и копирую строки, соответствующие двум условиям, в новый файл. Сценарий ведет себя по-разному в зависимости от размера массива:

while read pdb ; do
# for c in "${chain[@]}" ; do
for ((c=0; c<${#chain[@]}; c++)) ; do
if [ ${#chain[@]} -eq 1 ] && [ "$(echo "$pdb" | cut -c1-4)" == "ATOM" ] && [ "$(echo "$pdb" | cut -c22-23)" == "${chain[$c]}" ] ; then
echo "$pdb" >> ../../properpdb/${pdbid}_${chain[$c]}.pdb
fi
done
done < ${pdbid}.pdb

Это работает, но только если я удалю последнее условие (которое ссылается на определенный элемент массива). Я пробовал много разных синтаксисов (двойные квадратные скобки, используя $ {c} вместо $ {chain [$ c]} и т. Д.) Безрезультатно.

Это $ {pdbid} .pdb

ATOM     13  CA  SER A   9     107.761  75.138  27.465  1.00 24.92           C  
ATOM     14  C   SER A   9     107.081  73.915  26.851  1.00 21.25           C  
ATOM     15  O   SER A   9     105.984  73.987  26.313  1.00 24.75           O  
ATOM     16  CB  SER A   9     107.956  76.218  26.399  1.00 30.66           C  

Это один из массивов:

chain=(A)

Debug:

+ read pdb
+ for c in '"${chain[@]}"'
+ '[' 1 -eq 1 ']'
++ echo 'ATOM   1916  CZ3 TRP B  43     -15.691  19.837  49.406  1.00 12.45           C'
++ cut -c1-4
+ '[' ATOM == ATOM ']'
++ echo 'ATOM   1916  CZ3 TRP B  43     -15.691  19.837  49.406  1.00 12.45           C'
++ cut -c22-23
+ [[ A == B  ]]
+ read pdb

Все кажется правильным, за исключением того, что последнее условие не заключено в одинарные кавычки. Нет выходных данных, даже если A == A. Если я уберу это условие, оно будет работать.

1 Ответ

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

Проблема в том, что вы вырезали два символа в тестовом выражении, оно должно быть:

if [ ${#chain[@]} -eq 1 ] && \
   [ $(echo "$pdb" | cut -c1-4) == "ATOM" ] && \
   [ $(echo "$pdb" | cut -c22-22) == "${chain[$c]}" ]; then     
    echo "$pdb" >> ${pdbid}_${chain[$c]}.pdb
fi

Вы должны использовать cut -c22-22 вместо -c22-23. Я удалил двойные кавычки вокруг подстановки команд, чтобы они также убрали для вас пробелы.

...