Bash чтение из файла в ассоциативный массив - программирование
Подтвердить что ты не робот

Bash чтение из файла в ассоциативный массив

Я пытаюсь написать script в bash с помощью ассоциативного массива. У меня есть файл с именем data:

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

Следующий 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}

дает мне

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
4b9b3361

Ответ 1

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. Также добавлен -r в read, чтобы предотвратить обратную косую черту как escape-символ.

Улучшено на основе предложений @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