【问题标题】:Nested loop with two arrays带有两个数组的嵌套循环
【发布时间】: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 中执行此操作。知道问题可能是什么吗?

【问题讨论】:

    标签: arrays bash loops nested


    【解决方案1】:

    你要添加&amp;&amp;,更改这一行:

    [ $(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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-26
      • 1970-01-01
      • 1970-01-01
      • 2021-06-19
      • 2022-01-13
      • 1970-01-01
      相关资源
      最近更新 更多