如何排序关联数组bash脚本

How a sort associative array bash script

如何在 bash 中对关联数组进行排序?

例如,我在 bash 中有数组:

[0,0]="Max"
[0,1]="25"
[1,0]="Vladimir"
[1,1]="0"
[2,0]="Mayki"
[2,1]="50"

输出必须是:

  1. 梅基 - 50
  2. 最大 - 25
  3. 弗拉基米尔 - 0

我不知道如何对这个数组进行排序。

附加信息:我从文本文件解析 assoc 数组 ("log.txt")

    #!/bin/bash

declare -A b_array

# Read the file in parameter and fill the array named "array"
getArray() {

    i=0
    w=9

    count=10

    while read line # Read a line
    do
        k=0
        #array[i]=$line # Put it into the array

        #b_array[$i,0]=$(grep -Eo "(http|https)://[a-zA-Z0-9./?=_-]*" <<<"$line") 

        for word in $line;
          do  
                  #echo $k;
                  #echo $word;
                  if [ "$k" = "$w" ]; then
                      if [ $word != "-" ]; then
                        b_array[$i]=$word 
                        i=$(($i + 1))
                      fi 

                  fi 
                  k=$(($k + 1))
            done


    done < 
}

getArray "log.txt"

我可能会切换到 Perl 来完成如此复杂的任务,即使它在 bash 中仍然可行:

#!/bin/bash

declare -A arr
arr=([0,0]="Max"
     [0,1]="25"
     [1,0]="Vladimir"
     [1,1]="0"
     [2,0]="Mayki"
     [2,1]="50"
     [10,0]=Ivan
     [10,1]=10
    )

indices=( $( (IFS=$'\n' ; echo "${!arr[*]}") | grep ,0 | cut -d, -f1 | sort ) )

for i in "${indices[@]}" ; do
    echo ${arr[$i,0]} ${arr[$i,1]}
done | sort -rnk2

如果像

这样定义数组会简单很多
arr=([Max]=25
     [Vladimir]=0
     [Mayki]=50
     [Ivan]=10
    )

for paren in "${!arr[@]}" ; do
    echo $paren ${arr[$paren]}
done | sort -rnk2

有几种方法可以解决这个问题。最简单的方法之一可能是将字符串对读入索引数组,然后对数字字段进行反向数字排序:

#!/bin/bash

declare -A arr
declare -a sa

arr[0,0]="Max"
arr[0,1]="25"
arr[1,0]="Vladimir"
arr[1,1]="0"
arr[2,0]="Mayki"
arr[2,1]="50"

## convert associative array to 
#  indexed array of string pairs
#  (e.g. "Max - 25", "Mayki - 50" )
for i in ${!arr[@]}; do                         # for each key in ar

    x=${i%,*}                                   # separate x,y values
    y=${i#*,}
    (( y == 1 )) && continue                    # if y == 1, continue

    for j in ${!arr[@]}; do                     # for each key in ar

        _x=${j%,*}                              # separate _x,_y values
        _y=${j#*,}
        ((x != _x)) || ((_y == 0)) && continue  # if x != _x, or _y == 0, continue

        sa+=( "${arr[$i]} - ${arr[$j]}" )       # add combined string to indexed sa

    done
done

sort -r -k3 -n <<<"$(printf "%s\n" "${sa[@]}")" # numeric reverse sort sa on key3

exit 0

输出

$ bash sort_assoc.sh
Mayki - 50
Max - 25
Vladimir - 0