获取 Bash 中关联数组部分(双精度)的长度



我有一个关联数组,就像它通常的双数组一样。

结构类似于:[ [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

如何获取数组 [0] 和数组 [1]的长度?在此示例中:2 和 3。

谢谢。

附言我试图搜索重复项。没有成功。如果不清楚:我不知道数组的长度。


答案是在效率测试后选择的。以下是基于 @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[@]}慢得多。

您必须遍历数组键并计算您关心的键:没有类似${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 "%st%sn" $ind "${n[$ind]}"; done
k=${!array[@]}
n=0
re="(<$n,[0-9]+)"
echo $k | grep -Eo $re | wc -l
  1. 获取数组的密钥,
  2. 设置行索引,
  3. 为匹配键创建一个正则表达式,
  4. 使用正则表达式筛选键并计算匹配数。

如果需要,对其他行索引重复此操作。正则表达式有点棘手。<是单词的开头(以避免10,100,匹配(。$n,[0-9]+是当前行索引,后跟逗号和一个或多个数字。括括号分隔子表达式。

grep 的-Eo选项将其置于扩展正则表达式模式,并用新行分隔匹配的字符串,以便wc -l可以对它们进行计数。

相关内容

  • 没有找到相关文章