0

e.g. ( "A: 2" "B: 3" "C: 1" )bashの「pythondictionary-style」配列を値でソートするにはどうすればよいですか?このコードスニペットは、私の質問についてもう少し明確になると思います。

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

ヘルプや提案を事前に感謝します。乾杯!!

4

3 に答える 3

3

迅速で汚い考えは次のようになります(これは配列ではなく出力をソートするだけです):

echo ${WCUM[@]} | sed -e 's/; /;\n/g' | awk -F: '!/ 0;?/ {print $0}' | sort -t: -k 2 -r | xargs
于 2012-05-26T08:26:13.900 に答える
1
echo -e ${WCUM[@]} | tr ';' '\n' | sort -r -k2 | egrep -v ": 0$"

並べ替えとフィルタリングは独立した手順であるため、0の値のみをフィルタリングする場合は、はるかに簡単です。

追加する

 | tr '\n' ';'

最後に再び1行にそれを取得します。

nonull=$(for n in ${!WCUM[@]}; do echo ${WCUM[n]} | egrep -v ": 0;"; done | tr -d "\n")

$ W $ C $ Uをセミコロンで終了する正当な理由はわかりませんが、$ Mはそうではないので、コードをこの区別に適合させる代わりに、この特殊なケースを排除します。不可能な場合は、$ Mに一時的なセミコロンを追加し、最後に削除します。

于 2012-05-26T10:13:20.210 に答える
0

いくつかの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"
于 2012-05-26T10:10:27.670 に答える