根据另一个关联数组制作关联数组

时间:2018-08-24 10:56:58

标签: arrays bash loops associative-array

我做了如下的关联数组。为了提供一些细节,这些键引用了特定的文件,因为我将在更大的脚本的上下文中使用此数组(其中包含文件的目录将是一个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的变量。

我不确定以下哪种策略是最好的,而且我似乎都做不到。

策略1 :要复制数组并修改数组吗?

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,其输出更加清晰。 谢谢

1 个答案:

答案 0 :(得分:2)

两者都

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