【问题标题】:Making associative array based on another associative array基于另一个关联数组制作关联数组
【发布时间】:2019-01-30 20:20:52
【问题描述】:

我制作了一个关联数组,如下所示。为了提供一些细节,键是指特定的文件,因为我将在更大的脚本的上下文中使用这个数组(其中包含文件的目录将是一个 getopts 参数)。

declare -A BAMREADS
echo "BAMREADS array is initialized"

BAMREADS[../data/file1.bam]=33285268
BAMREADS[../data/file2.bam]=28777698
BAMREADS[../data/file3.bam]=22388955

echo ${BAMREADS[@]}  # Output: 22388955 33285268 28777698
echo ${!BAMREADS[@]} # Output: ../data/file1.bam ../data/file2.bam ../data/file3.bam

到目前为止,这个数组的行为似乎符合我的预期。现在,我想基于这个数组构建另一个关联数组。具体来说:我的第二个数组将具有与第一个数组相同的键,但我想将这些值除以一个名为 $MIN 的变量。

我不确定以下哪种策略最好,而且我似乎无法使任何一种工作。

策略一:复制数组并修改数组?

MIN=33285268

declare -A BRAMFRACS
echo "BAMFRACS array is initialized"
BAMFRACS=("${BAMREADS[@]}")

echo ${BAMFRACS[@]}  # Output: 22388955 33285268 28777698
echo ${!BAMFRACS[@]} # Output: 0 1 2

这不是我想要的钥匙。即使它有效,我也需要对所有值执行我提到的操作。

策略2:在循环第一个数组时构建第二个数组。

MIN=33285268

declare -A BRAMFRACS
echo "BAMFRACS array is initialized"

for i in $(ls $BAMFILES/*bam)
do
    echo $i
    echo ${BAMREADS[$i]}
    BAMFRACS[$i] = ${BAMREADS[$i]} 
done

echo ${BAMFRACS[@]}
echo ${!BAMFRACS[@]}


# When I run this, I get the following error which I am unsure how to solve:

../data/file1.bam
33285268
script.bash: line 108: BAMFRACS[../data/file1.bam]: No such file or directory
../data/file2.bam
28777698
script.bash: line 108: BAMFRACS[../data/file2.bam]: No such file or directory
../data/file3.bam
22388955

更新 更新了 strategy2,它的输出更加清晰。 谢谢

【问题讨论】:

    标签: arrays bash loops associative-array


    【解决方案1】:

    两者都有

    declare -A BRAMFRACS
    

    应该是

    declare -A BAMFRACS
    

    也就是说,您的名称中多了一个“R”,其中一个错误的原因是 BAMFRACS 是一个索引数组(默认),而不是关联数组。

    在策略 2 中:

    BAMFRACS[$i] = ${BAMREADS[$i]} 
    

    应该是

    BAMFRACS[$i]=${BAMREADS[$i]
    

    也就是说,= 周围不允许有空格。 BAMFRACS[$i] 被视为命令,因为命令由空格分隔。

    顺便说一句,

    for i in $(ls $BAMFILES/*bam) 
    

    可以写成:

    for i in "$BAMFILES"/*bam
    

    试试:

    MIN=33285268
    
    declare -A BAMFRACS
    
    for key in "${!BAMREADS[@]}"
    do
        val=${BAMREADS[$key]}
        BAMFRACS[$key]=$((val/MIN))
    done
    
    echo ${BAMFRACS[@]}  
    echo ${!BAMFRACS[@]} 
    

    给予:

    1 0 0
    ../data/file1.bam ../data/file2.bam ../data/file3.bam
    

    【讨论】:

      猜你喜欢
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-14
      相关资源
      最近更新 更多