如何排序的关联数组bash脚本 [英] How a sort associative array bash script

查看:161
本文介绍了如何排序的关联数组bash脚本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我如何排序在bash的关联数组?

例如,我在bash数组:

  [0,0] =最大
[0,1] =25
[1,0] =弗拉基米尔
[1,1] =0
[2,0] =Mayki
[2,1] =50

输出必须是:


  1. Mayki - 50

  2. 马克斯 - 25

  3. 弗拉基米尔 - 0

我不知道怎么样这个数组。

附加信息:我从解析文本文件assoc命令阵列(log.txt中)

 #!/斌/庆典声明-A b_array#阅读参数文件,并填写命名为阵阵
的getArray(){    I = 0
    W = 9    数= 10    同时读取线#读取一行
    做
        K = 0
        #array [I] = $行#放入数组        #b_array [$ I,0] = $(grep的-eo(HTTP | HTTPS):// [a-zA-Z0-9./?=_-] *<<<$线 )        在$行字;
          做
                  #echo $ K表;
                  #echo $字;
                  如果[$ K=$ W];然后
                      如果[$字= - !]然后
                        b_array [$ i] = $字
                        I = $(($ I + 1))的
                      科幻                  科幻
                  K = $(($ K + 1))
            DONE
    完成< $ 1
}的getArray的log.txt


解决方案

有几个方法解决这个问题。一个最简单的可能就是阅读的字符串对入索引数组,然后反向的号码字段中数字排序:

 #!/斌/庆典声明-A ARR
声明-a SAARR [0,0] =最大
ARR [0,1] =25
ARR [1,0] =弗拉基米尔
改编[1,1] =0
ARR [2,0] =Mayki
改编[2,1] =50##关联数组转换为
#字符串对索引数组
#(例如,马克斯 - 25,Mayki - 50)
因为我在$ {常用3 [@]!};做#在AR每个键    X = $ {I%,*}#分立的x,y值
    Y = $ {I#*,}
    ((Y == 1))及&放大器;继续#如果y == 1,继续    为$ j中{!常用3 [@]};做#在AR每个键        _x = $ {Ĵ%,*}#独立_x,_y值
        _y = $ {J#*,}
        ((X!= _x))|| ((_y == 0))及和放大器;继续#如果X!= _x,_y或== 0,继续        SA + =($ {改编[$ i]} - $ {改编[$ J]})#将合并字符串索引SA    DONE
DONE排序-r -K3 -n<<<$(printf的%S \\ n$ {SA [@]})#数字逆向排序上KEY3 SA退出0

输出

  $庆典sort_assoc.sh
Mayki - 50
马克斯 - 25
弗拉基米尔 - 0

How do I sort an associative array in bash?

For example, I have array in bash:

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

Output must be:

  1. Mayki - 50
  2. Max - 25
  3. Vladimir - 0

I don't know how sort this array.

Additional Info: I parse assoc array from text file ("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 < $1
}

getArray "log.txt"

解决方案

There are a couple of approaches to this problem. One of the easiest is probably to read the pairs of strings into an indexed array and then reverse numeric sort on the number field:

#!/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

Output

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

这篇关于如何排序的关联数组bash脚本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆