在bash中排序“键/值对”数组

时间:2012-05-26 08:19:32

标签: linux arrays bash sorting

如何通过值对bash中的“python字典样式”数组e.g. ( "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

如何对数组(或输出)进行排序,消除任何具有“0”值的对,以便得到如下结果:

Matched: 2; Claimed: 1; Unclaimed: 1

提前感谢您的任何帮助或建议。干杯!!

3 个答案:

答案 0 :(得分:2)

快速而肮脏的想法(这只是对输出进行排序,而不是数组):

echo ${WCUM[@]} | sed -e 's/; /;\n/g' | awk -F: '!/ 0;?/ {print $0}' | sort -t: -k 2 -r | xargs

答案 1 :(得分:1)

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附加一个分号,然后将其删除。

答案 2 :(得分:0)

使用某些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"