2014-05-03 32 views

cevap

15
:

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} 

bana

a ---> a b c d e f 

g ---> g h i j k l 

ben olmak benim çıkış gerek verir bir dosya data denilen var

veriler:

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

Çıktı:

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

almak için buraya ${array[@]:2}Substring Expansion kullanır assoc dizinin değeri olarak gerekli alt dize. Ters eğik çizgi bir kaçış karakteri olarak hareket etmesini önlemek için -r ila read'a eklendi.

@ gniourf_gniourf önerilerine göre Geliştirilmiş: 'Oku' komutu için `, 1. koyun` IFS = değil `tasarrufu IFS` ve restore keman var:

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

Birkaç iyileştirmeler ekleyebilirsiniz . 2. Döngüde ekle '(($ {# dizi [@]}> = 2)) || devam ya da boş satırlardan kurtulmak için benzer bir şey. 3. Ödevinizi "assoc [" $ {array [@] :: 2} "] = $ {array [@]: 2}' olarak yazın. –

+0

@gniourf_gniourf, $ $ {array [@] :: 2} '$ {parameter: offset: length} 'biçimini ommited' offset ile ve sonra offset' sıfır olarak mı varsayılır? – Ashkan

+0

Evet, doğru! –

İlgili konular