Como ordenar uma matriz associativa e reter as chaves?

5

Eu tenho uma matriz com nomes de arquivos como chaves e um valor numérico como valores.

MYARRAY[00001.jpg] = 31
MYARRAY[00002.jpg] = 200
MYARRAY[00003.jpg] = 98

Eu preciso ordená-los para que eles sejam ordenados por valor. O que estou fazendo com

IFS=$'\n' SORTED=($(sort <<<"${MYARRAY[*]}"))

No entanto, eu perco as chaves e agora tenho as numéricas.

A saída desejada seria

00001.jpg:31
00003.jpg:98
00002.jpg:200

Como posso manter as chaves de tal forma?

    
por dibs 01.03.2015 / 03:57

1 resposta

4

Supondo que suas chaves não contêm dois pontos ou novas linhas e seus valores não contêm novas linhas:

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

Se você precisar organizar a chave na ordem dada pelos valores, leia a saída:

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
    
por 01.03.2015 / 04:04

Tags