簡體   English   中英

Bash 對 Map 的值進行降序排序

[英]Bash sorting the values of Map in descending order

我在 bash 中聲明了一個 map,如下所示

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)

我想拆分具有分隔符 (:) 的 Key 中的字符串,並像這樣按值的降序獲取 output

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

我正在嘗試的代碼如下

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

但是使用我的代碼的 output 是這樣的

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

有沒有簡單的方法來實現這一目標?

如果您打印原始鍵和值,請按第二列 ( k2 ) 排序,數字n r

#! /bin/bash
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)

for k in ${!myMap[@]} ; do
    echo $k ${myMap[$k]}
done | sort -rnk2 | sed 's/[: ]/ - /g'

如果拆分key,需要按第九列排序:

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

使用文件名通配符對鍵進行排序的替代方法。

#!/usr/bin/env bash

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)

tmpDir=
trap 'rm -fr "$tmpDir"' EXIT INT
tmpDir=$(mktemp -d)

myKeys=("${!myMap[@]}")

# Create a file per key in the temp directory
touch "${myKeys[@]/#/$tmpDir/}"

# Load keys from temp directory benefiting from auto sorting
myKeys=("$tmpDir/"*)

# Strip file path from keys
myKeys=("${myKeys[@]##*/}")

# Iterate keys in reverse order
for (( i=${#myKeys[@]}-1; i>=0; i-- )); do

  k=${myKeys[i]}

  # Split key by :
  IFS=: read -ra ka <<<"$k"

  # Get corresponding value
  v=${myMap[$k]}

  # Print joined key elements with " - " followed by value
  printf '%s%s%s%s%s\n' "${ka[@]/%/ - }" "$v"
done

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM