如何排序的关联数组bash脚本 [英] How a sort associative array bash script
本文介绍了如何排序的关联数组bash脚本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我如何排序在bash的关联数组?
例如,我在bash数组:
[0,0] =最大
[0,1] =25
[1,0] =弗拉基米尔
[1,1] =0
[2,0] =Mayki
[2,1] =50
输出必须是:
- Mayki - 50
- 马克斯 - 25
- 弗拉基米尔 - 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:
- Mayki - 50
- Max - 25
- 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屋!
查看全文