Соедините два массива в один ассоциативный массив - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть два массива:

SUBJECT_IDS=(44456 11123 77789)
DCM_FILES=("./77789/77789/"DICOM"" "./11123/11123/"DICOM"" "./44456/44456/77789/"DICOM"" )

, которые я затем отсортировал, чтобы упростить индексирование / уже сортировал его по индексу:

IFS=$'\n'
sorted_SUBJECT_IDS=($(sort <<<"${SUBJECT_IDS[*]}"))
sorted_DCM_FILES=($(sort <<<"${DCM_FILES[*]}"))

Как бы я создал ассоциативный массив путем объединения двух массивов по индексу?

headers=(
    [11123]=./11123/11123/DICOM
    [44456]=./44456/44456/DICOM
    [77789]=./77789/77789/DICOM
)

Вот мои попытки создания ассоциативного массива:

Попытка 1:

declare -A headers
i=0
for i in "${sorted_SUBJECT_IDS[@]}"
do
  headers["$i"]="${sorted_DCM_FILES[i]}";
  echo "$i" : "${sorted_DCM_FILES[i]}"
  ((i++))
done

Выход:

11123 :
44456 :
77789 :

Попытка 2:

typeset -A hash
hash=("$(@){sorted_SUBJECT_IDS:^sorted_DCM_FILES}")

Выход:

bash: hash: "$(@){sorted_SUBJECT_IDS:^sorted_DCM_FILES}": mustuse subscript when assigning associative array

1 Ответ

1 голос
/ 25 сентября 2019

Ваш sort работает не так, как вы хотите, и, кроме того, ваша итерация массива должна быть по индексу, а не по элементам.

Вы можете использовать:

sorted_SUBJECT_IDS=($(sort -n <(printf '%s\n' "${SUBJECT_IDS[@]}")))
sorted_DCM_FILES=($(sort -n <(printf '%s\n' "${DCM_FILES[@]}")))

declare -A headers

for i in "${!sorted_SUBJECT_IDS[@]}"; do 
   headers["${sorted_SUBJECT_IDS[i]}"]="${sorted_DCM_FILES[i]}"
done

# check header associative array

declare -p headers

declare -A headers=([77789]="./77789/77789/DICOM" [44456]="./44456/44456/77789/DICOM" [11123]="./11123/11123/DICOM" )
...