将两个数组配对为一个关联数组

时间:2019-09-25 14:57:40

标签: arrays bash associative-array

我有两个数组:

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 个答案:

答案 0 :(得分:1)

您的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" )