在 bash 中对"key/value pair"数组进行排序



如何按值对 bash 中e.g. ( "A: 2" "B: 3" "C: 1" )的"python 字典样式"数组进行排序?我认为,这个代码片段将使我的问题更加清晰。

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

如何对数组(或输出)进行排序,消除任何值为"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功能,但仍然需要排序,这是至关重要的:

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

最新更新