我怎么排序在bash的关联数组?
例如,我有在bash数组:
[0,0]="Max"
[0,1]="25"
[1,0]="Vladimir"
[1,1]="0"
[2,0]="Mayki"
[2,1]="50"
输出必须是:
- Mayki - 50
- 马克斯 - 25
- 弗拉基米尔 - 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 < $1
}
getArray "log.txt"
有一对夫妇的方式解决这个问题。 一个最简单的可能是读取对串入索引数组,然后反向上的数字字段数值排序:
#!/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
我可能会切换到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