2014-05-03 40 views
10

我正在嘗試使用關聯數組在bash中編寫腳本。 我有一個文件名爲dataBash從文件讀取到關聯數組

a,b,c,d,e,f 
g,h,i,j,k,l 

下面的腳本:

oldIFS=${IFS} 
IFS="," 

declare -A assoc 
while read -a array 
do 
    assoc["${array[0]}"]="${array[@]" 
done 

for key in ${!assoc[@]} 
do 
    echo "${key} ---> ${assoc[${key}]}" 
done 

IFS=${oldIFS} 

給我

a ---> a b c d e f 

g ---> g h i j k l 

我需要我的輸出是:

a b ---> c d e f 

g h ---> i j k l 

回答

15
oldIFS=${IFS} 
IFS="," 

declare -A assoc 
while read -r -a array 
do 
    assoc["${array[0]} ${array[1]}"]="${array[@]:2}" 
done < data 

for key in "${!assoc[@]}" 
do 
    echo "${key} ---> ${assoc[${key}]}" 
done 

IFS=${oldIFS} 

數據:

a,b,c,d,e,f 
g,h,i,j,k,l 

輸出:

a b ---> c d e f 
g h ---> i j k l 

用途Substring Expansion這裏${array[@]:2}獲得所需的子字符串作爲assoc陣列的價值。還加入-rread以防止反斜槓充當轉義字符。

改進的基於@ gniourf_gniourf的建議:

declare -A assoc 
while IFS=, read -r -a array 
do 
    ((${#array[@]} >= 2)) || continue 
    assoc["${array[@]:0:2}"]="${array[@]:2}" 
done < data 

for key in "${!assoc[@]}" 
do 
    echo "${key} ---> ${assoc[${key}]}" 
done 
+5

你可以添加一些改進:1.把'IFS ='的'read'命令,而不必亂動節約'IFS'和恢復它。 2.在循環中添加'(($ {#array [@]}> = 2))||繼續'或類似的東西來擺脫空行。 3.將你的任務寫成'assoc [「$ {array [@] :: 2}」] = $ {array [@]:2}''。 –

+0

@gniourf_gniourf,是'$ {array [@] :: 2''的形式,其中'$ {parameter:offset:length}'帶有ommited'offset',然後'offset'假定爲零? – Ashkan

+0

是的,沒錯! –