我有一个关联数组,就像它常用的双数组一样。
结构类似于:[[0,1],[0,1,2]]。代码:
declare -A array
array[0,0]=0
array[0,1]=1
array[1,0]=0
array[1,1]=1
array[1,2]=2
如何获得 array [0] 和 array [1] 的长度?在这个例子中:2和3。
谢谢。
P.S。我试图搜索重复项。没有成功。如果不清楚:我不知道阵列的长度。
在效率测试后选择了答案。以下是基于@ RenaudPacalet的答案的函数示例:
function getLength() {
local k=$(eval "echo \${!$1[@]}")
local re="(\<$2,[0-9])"
echo $k | grep -Eo $re | wc -l
}
使用示例:getLength array 1
在此问题的情况下返回3。
请注意,使用$(eval "echo \${!$1[@]}")
要慢于${!array[@]}
。
答案 0 :(得分:3)
你必须迭代数组键并计算你关心的数据:${array[0,*])
n0=0
n1=0
for key in "${!array[@]}"; do
[[ $key == 0,* ]] && ((n0++))
[[ $key == 1,* ]] && ((n1++))
done
echo $n0
echo $n1
或者,使用数组来计算所有“第一级”索引
n=()
for key in "${!array[@]}"; do (( n[${key%%,*}]++ )); done
# then, print out the counts
for ind in "${!n[@]}"; do printf "%s\t%s\n" $ind "${n[$ind]}"; done
答案 1 :(得分:0)
k=${!array[@]}
n=0
re="(\<$n,[0-9]+)"
echo $k | grep -Eo $re | wc -l
如果需要,请与其他行索引重复。正则表达式有点棘手。 \<
是单词的开头(以避免10,10
匹配0,
)。 $n,[0-9]+
是当前行索引,后跟逗号和一个或多个数字。括号括起来分隔一个子表达式。
grep的-Eo
选项将其置于扩展正则表达式模式,并将匹配的字符串与新行分开,以便wc -l
可以对它们进行计数。