2017-08-08 75 views
2

我有一个像通常的双数组一样的关联数组。在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.

谢谢。

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

”行为就像它通常的双数组“不,它总是*作为关联数组。 –

+1

echo $ {#array [@]} – py9

+0

@Ignacio Vazquez-Abrams,我的意思是它提醒了双数组。不行为,如果你会:) – MOPO3OB

回答

0
k=${!array[@]} 
n=0 
re="(\<$n,[0-9]+)" 
echo $k | grep -Eo $re | wc -l 
  1. 让您的阵列的键,
  2. 设定的行索引,
  3. 创建匹配的钥匙正则表达式,
  4. 过滤器使用正则表达式的按键和计数数量的比赛。

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

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

+0

它只能在没有*的RegEx中运行。 grep的2.5.1版本。 – MOPO3OB

+0

这个实现非常不幸。考虑如果你有一个文字星号作为键 - 'echo *'会发出一个文件名列表。 'grep -o'是一个GNUism,不受[grep的POSIX规范](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/grep.html)的保证。 –

+0

@CharlesDuffy在问题中的例子,这只是没关系。但我明白你的意思。欣赏这两个答案。这就是为什么我更新问题并指定选择答案的标准。 – MOPO3OB

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