[英]sorting a “key/value pair” array in bash
如何按值对bash中的“ python词典样式”数组eg ( "A: 2" "B: 3" "C: 1" )
进行排序? 我认为,此代码段将使我的问题更加清楚。
State="Total 4 0 1 1 2 0 0"
W=$(echo $State | awk '{print $3}')
C=$(echo $State | awk '{print $4}')
U=$(echo $State | awk '{print $5}')
M=$(echo $State | awk '{print $6}')
WCUM=( "Owner: $W;" "Claimed: $C;" "Unclaimed: $U;" "Matched: $M" )
echo ${WCUM[@]}
这将只打印数组: Owner: 0; Claimed: 1; Unclaimed: 1; Matched: 2
Owner: 0; Claimed: 1; Unclaimed: 1; Matched: 2
如何对数组(或输出)进行排序,消除值“ 0”的任何对,结果如下:
Matched: 2; Claimed: 1; Unclaimed: 1
在此先感谢您的帮助或建议。 干杯!!
快速而肮脏的想法是(这只是对输出进行排序,而不是对数组进行排序):
echo ${WCUM[@]} | sed -e 's/; /;\n/g' | awk -F: '!/ 0;?/ {print $0}' | sort -t: -k 2 -r | xargs
echo -e ${WCUM[@]} | tr ';' '\n' | sort -r -k2 | egrep -v ": 0$"
排序和过滤是独立的步骤,因此,如果您只想过滤0个值,则将更加容易。
附加一个
| tr '\n' ';'
最后将其重新放置到一行中。
nonull=$(for n in ${!WCUM[@]}; do echo ${WCUM[n]} | egrep -v ": 0;"; done | tr -d "\n")
我看不出用分号结尾$ W $ C $ U的充分理由,但是$ M没有,所以我不用修改我的代码来适应这种区别,我会消除这种特殊情况。 如果不可能的话,我会在$ M后面加上一个分号临时符号,最后将其删除。
使用某些bash功能但仍需要sort的另一尝试是至关重要的:
#! /bin/bash
State="Total 4 1 0 4 2 0 0"
string=$State
for i in 1 2 ; do # remove unnecessary fields
string=${string#* }
string=${string% *}
done
# Insert labels
string=Owner:${string/ /;Claimed:}
string=${string/ /;Unclaimed:}
string=${string/ /;Matched:}
# Remove zeros
string=(${string[@]//;/; })
string=(${string[@]/*:0;/})
string=${string[@]}
# Format
string=${string//;/$'\n'}
string=${string//:/: }
# Sort
string=$(sort -t: -nk2 <<< "$string")
string=${string//$'\n'/;}
echo "$string"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.