2014-05-03 9 views
10

Sto provando a scrivere uno script in bash utilizzando un array associativo. Ho un file chiamato data:Lettura di blocchi da un file a un array associativo

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

Il seguente script:

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} 

mi dà

a ---> a b c d e f 

g ---> g h i j k l 

ho bisogno la mia uscita di essere:

a b ---> c d e f 

g h ---> i j k l 

risposta

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} 

dati:

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

uscita:

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

Utilizzi Substring Expansion qui ${array[@]:2} per ottenere sottostringa necessari come il valore della matrice assoc. È inoltre stato aggiunto -r a read per impedire che il backslash funga da carattere di escape.

migliorato sulla base di @ gniourf_gniourf suggerimenti:

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

si potrebbe aggiungere alcuni miglioramenti: 1. mettere 'IFS =,' per il comando 'read' e non avere a giocherellare risparmio' IFS' e ripristinandola . 2. Nel ciclo aggiungi '(($ {# array [@]}> = 2)) || continua o qualcosa di simile per sbarazzarsi delle linee vuote. 3. Scrivi il tuo compito come 'assoc [" $ {array [@] :: 2} "] = $ {array [@]: 2}'. –

+0

@gniourf_gniourf, è '$ {array [@] :: 2}' forma di '$ {parametro: offset: length}' con ommited 'offset' e quindi' offset' è assunto zero? – Ashkan

+0

Sì, è vero! –