2011-08-29 161 views
0

我有兩套陣列與元件的可變數量,例如:嵌套循環與兩個陣列

鏈=(BC)

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其第五列匹配每個陣列鏈單獨的文件中的元素組成:

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的元素開始的行,但只有當這些線路也匹配的元件形成在cloumn數第五鏈數組:

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中做到這一點。任何想法可能是什麼問題?

回答

1

您對於GET添加&&,改變這一行:

[ $(echo "$pdb" | cut -c22-23) == "${chain[$c]}" ] \ 

[ $(echo "$pdb" | cut -c22-23) == "${chain[$c]}" ] &&\ 

更新: 你在劇本有太多的錯誤,我固定它和它現在的工作。我建議你先閱讀bash手冊中的for循環語法。

chain=(B C)                                 
hresname=(BMA MAN NAG NDG) 
while read pdb ; do 
    for c in ${chain[@]} ; do 
     for h in ${hresname[@]} ; do 
      if [ $(echo "$pdb" | cut -c1-6) == "HETATM" ] && \ 
       [ $(echo "$pdb" | cut -c22-23) == "$c" ] && \ 
       [ $(echo "$pdb" | cut -c18-20) == "$h" ] ; then 
       echo "$pdb" >> ../../properpdb/${pdbid}_${chain[$c]}.pdb 
      fi 
     done 
    done 
done 
+0

而你是對的(再次)。太感謝了。 – mirix