2017-08-08 77 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