es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Ordenación de los valores del Map en Bash en orden descendente

He declarado un mapa en bash de la siguiente manera:

declare -A myMap
myMap=( [A:B:C:D]=813.0 [P:Q:R:S]=2346957.02 [W:X:Y:Z]=53831.93 [E:F:G:H]=113770.0)

Quiero dividir la cadena en clave utilizando el delimitador (:) y obtener el resultado en orden descendente de valor de esta manera:

P - Q - R - S - 2346957.02
E - F - G - H - 113770.0
W - X - Y - Z - 53831.93
A - B - C - D - 813.0

El código que estoy intentando es el siguiente:

for k in "${!myMap[@]}"
do
  arrIN=(${k//:/ })
  echo ${arrIN[0]} ' - ' ${arrIN[1]} ' - ' ${arrIN[2]} ' - ' ${arrIN[3]} ' - ' ${myMap["$k"]}
done | sort ${myMap["$k"]}

Pero la salida usando mi código es la siguiente:

E - F - G - H - 113770.0
W - X - Y - Z - 53831.93
P - Q - R - S - 2346957.02
A - B - C - D - 813.0

¿Hay alguna manera fácil de lograr esto?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, en lugar de ordenar la salida del bucle, puedes usar el comando sort directamente en el array asociativo con el siguiente comando:

    for k in "${!myMap[@]}"; do
        arrIN=(${k//:/ })
        echo ${arrIN[0]} '-' ${arrIN[1]} '-' ${arrIN[2]} '-' ${arrIN[3]} '-' ${myMap["$k"]}
    done | sort -rk5
    

    La opción -rk5 le indica al comando sort que ordene en orden inverso por la quinta columna (que es la columna de valor en nuestra salida). Esto te dará la salida deseada:

    P - Q - R - S - 2346957.02
    E - F - G - H - 113770.0
    W - X - Y - Z - 53831.93
    A - B - C - D - 813.0
    

Comments are closed.