【发布时间】:2011-11-05 22:11:29
【问题描述】:
我有两组元素数量可变的数组,例如:
链=(B C)
hresname=(BMA MAN NAG NDG)
我正在解析许多文件,这些文件可能在给定位置包含来自数组链的元素,在不同位置包含数组 hresname 的元素(在这两种情况下位置始终是固定的)。这是数据样本:
ATOM 5792 CB MET D 213 49.385 -5.683 125.489 1.00142.66 C
ATOM 5793 CG MET D 213 50.834 -5.674 125.990 1.00154.50 C
ATOM 5794 SD MET D 213 51.530 -7.337 126.277 1.00164.73 S
ATOM 5795 CE MET D 213 52.854 -7.386 125.068 1.00169.73 C
HETATM 5797 C1 NAG B 323 70.090 50.934 125.869 1.00 86.35 C
HETATM 5798 C2 NAG B 323 69.687 52.074 126.879 1.00 95.95 C
HETATM 5799 C3 NAG B 323 68.377 52.740 126.390 1.00 87.65 C
HETATM 5800 C4 NAG B 323 68.598 53.314 125.014 1.00 83.97 C
首先我需要复制以 ATOM 开头的行,其第 5 列与数组链中的每个元素匹配到单独的文件:
while read pdb ; do
for c in "${chain[@]}" ; do
#if [ ${#chain[@]} -eq 1 ] && \
if [ $(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
这很好用(缓慢但肯定)。注释版本和未注释版本都有效。
接下来我想复制以 HETATM 开头并且其第 4 列与 hresname 的元素匹配的行,但前提是这些行也与第 5 列的链数组中的元素匹配:
while read pdb ; do
for c in "${chain[@]}" ; do
for h in "${hresname[@]}" ; do
if [ ${#chain[@]} -eq 1 ] && \
[ $(echo "$pdb" | cut -c1-6) == "HETATM" ] && \
[ $(echo "$pdb" | cut -c22-23) == "${chain[$c]}" ] \
[ $(echo "$pdb" | cut -c18-20) == "${hresname[$h]}" ] ; then
echo "$pdb" >> ../../properpdb/${pdbid}_${chain[$c]}.pdb
fi
done
done
done < ${pdbid}.pdb
但是,这不起作用。我反复收到错误:
line 66: [: too many arguments
第 66 行是:
[ $(echo "$pdb" | cut -c22-23) == "${chain[$c]}" ] \
这让我感到困惑,因为即使我将循环限制为包含单个元素的链数组,也会发生错误。
根据其他 StackOverflow 问题,应该完全可以在 bash 中执行此操作。知道问题可能是什么吗?
【问题讨论】: