我制作了一个关联数组,如下所示。为了提供一些细节,键是指特定文件,因为我将在更大脚本的上下文中使用这个数组(其中包含文件的目录将是一个 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
UPDATE更新了 strategy2,它的输出更清晰。谢谢
同时
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句