2013-10-10 134 views
1

我正在嘗試將文件中的項目存儲到bash中的關聯數組中。關聯數組可能不是我的行爲的最佳路線,但從我的研究來看,這似乎是一個很好的選擇。我有一個看起來像一個文件中:Bash中的關聯數組

personid 
phone 
phone 
phone 
personid 
phone 
phone 
phone 

請注意,persionid永遠是20位,而手機始終10.有沒有別的在這個文件中,並沒有空格,只是其中的每行一個。我想將這些映射到一個關聯數組,我的密鑰是personid,我的價值是手機。

我就上這一塊工作的代碼如下:

declare -A person 

while read key; do 

    if [ ${#key} -eq 20 ] ; then 
     personID="$key" 
    else 
     phone="$key" 
    fi 

    person=(["$personID"]="$phone") 

done < myFile.txt 

for i in "${!person[@]}" 
do 
    echo "key: $i" 
    echo "value: ${person[$i]}" 
done 

它會正確地存儲和打印一個PERSONID的關鍵和一個手機作爲價值....但應該有手機的多個值。我在分配人的時候會想,我一定是做錯了,或者把它放在了錯誤的位置上。但我已經玩了很長一段時間了,無法做到。以前從未使用過關聯數組,所以有點麻煩。先謝謝您的幫助!

+0

關聯數組或地圖存儲鍵 - 值對。你想要的是一個multimap,它允許多個值與一個鍵相關聯。就個人而言,由於bash腳本變得太複雜了,我現在已經切換到了Python。 – Dennis

+0

謝謝丹尼斯,對我的關聯數組的誤解 – warlord786

+0

請記住,'bash'不是用於數據處理,而是用於運行其他進程。 – chepner

回答

1

關聯數組與任何其他數組沒有任何區別,因爲關鍵字(或索引)與值之間始終存在1:1的完全映射關係。在你的情況下,你需要從鍵(personID)到值(電話號碼)的1:多映射。一種方法可以簡單地存儲一個電話號碼列表,這些電話號碼實際上是映射到personID的「單個」值。您可以使用空格或逗號分隔符或其他任何名稱來構造您的列表。

例如,如果你想:爲你的分隔符,你可以這樣做,以每個電話號碼添加到列表中:

if [ -n ${person[$personID]} ] ; then 
    person[$personID]}="${person[$personID]}:$phone" 
else 
    person[$personID]}="$phone" 
fi 
+0

啊,好的,謝謝。關於我的關聯數組的誤解:) – warlord786

+1

@ warlord786 - 不用擔心:) - 你今天學到了一些東西 - 那是什麼讓它值得的! –