在 Bash 中获取部分关联数组(双精度)的长度
Getting length of part of associative array (double) in 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
如何获取 array[0] 和 array[1] 的长度?在本例中:2 和 3.
谢谢。
P.S。我试图搜索重复项。没有成功。如果不清楚:我不知道数组的长度。
效率测试后选择了答案。这是基于@RenaudPacalet 的回答的函数示例:
function getLength() {
local k=$(eval "echo ${![@]}")
local re="(\<,[0-9])"
echo $k | grep -Eo $re | wc -l
}
用法示例:getLength array 1
returns 3 在这个问题的案例中。
请记住,使用 $(eval "echo ${![@]}")
比 ${!array[@]}
慢得多。
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
可以统计它们。
您将不得不遍历数组键并计算您关心的键:没有像 ${array[0,*])
这样的语法
n0=0
n1=0
for key in "${!array[@]}"; do
[[ $key == 0,* ]] && ((n0++))
[[ $key == 1,* ]] && ((n1++))
done
echo $n0
echo $n1
或者,使用数组来记录所有 "first level" 索引
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
我有一个关联数组,它的行为就像它通常的双数组。
结构类似于:[ [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 ${![@]}")
local re="(\<,[0-9])"
echo $k | grep -Eo $re | wc -l
}
用法示例:getLength array 1
returns 3 在这个问题的案例中。
请记住,使用 $(eval "echo ${![@]}")
比 ${!array[@]}
慢得多。
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
可以统计它们。
您将不得不遍历数组键并计算您关心的键:没有像 ${array[0,*])
n0=0
n1=0
for key in "${!array[@]}"; do
[[ $key == 0,* ]] && ((n0++))
[[ $key == 1,* ]] && ((n1++))
done
echo $n0
echo $n1
或者,使用数组来记录所有 "first level" 索引
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