如何对关联数组进行排序并保留键?

dib*_*ibs 6 bash array sort

我有一个以文件名作为键和一个数值作为值的数组。

MYARRAY[00001.jpg] = 31
MYARRAY[00002.jpg] = 200
MYARRAY[00003.jpg] = 98
Run Code Online (Sandbox Code Playgroud)

我需要对它们进行排序,以便它们按值排序。我正在做的

IFS=$'\n' SORTED=($(sort <<<"${MYARRAY[*]}"))
Run Code Online (Sandbox Code Playgroud)

但是我丢失了钥匙,现在只有数字钥匙。

期望的输出是

00001.jpg:31
00003.jpg:98
00002.jpg:200
Run Code Online (Sandbox Code Playgroud)

我怎样才能以这种方式保留密钥?

Gil*_*il' 5

假设您的键不包含冒号或换行符,并且您的值不包含换行符:

for key in "${!MYARRAY[@]}"; do
  printf '%s:%s\n' "$key" "${MYARRAY[$key]}"
done | sort -t : -k 2n
Run Code Online (Sandbox Code Playgroud)

如果您需要按照值给定的顺序排列键,请读回输出:

IFS=$'\n'; set -f
sorted_keys=($(
    for key in "${!MYARRAY[@]}"; do
      printf '%s:%s\n' "$key" "${MYARRAY[$key]}"
    done | sort -t : -k 2n | sed 's/:.*//'))
unset IFS; set +f
Run Code Online (Sandbox Code Playgroud)