1

私はこの配列を持っています:

array=(1 2 3 4 4 3 4 3)

次の方法で最大数を取得できます。

echo "num: $(printf "%d\n" ${array[@]} | sort -nr | head -n 1)"
#outputs 4

しかし、私はすべての 4 の合計を取得したいので、代わりに 12 (4 が 3 回出現) を出力したいと考えています。何か案は?

4

4 に答える 4

5
dc <<<"$(printf '%d\n' "${array[@]}" | sort -n | uniq -c  | tail -n 1) * p"
  1. sort最後に最大値を取得する
  2. uniq -c出現回数をカウントして、一意の値のみを取得する
  3. tail最後の行のみを取得する (最大値とそのカウントを含む)
  4. dc値にカウントを掛ける

dcRPN であるため、乗算ステップを選択したため、uniq -c出力を分割して途中に何かを挿入する必要はありません。最後に何かを追加するだけです。

于 2012-12-03T11:59:18.660 に答える
3

awk の使用:

$ printf "%d\n" "${array[@]}" | sort -nr | awk 'NR>1 && p!=$0{print x;exit;}{x+=$0;p=$0;}'
12

sort を使用すると、数字は逆順 (-r) にソート (-n) され、awk は前の数字とは異なる数字が見つかるまで数字を合計し続けます。

于 2012-12-03T12:00:07.517 に答える
2

あなたはこれを行うことができますawk

awk -v RS=" " '{sum[$0]+=$0; if($0>max) max=$0} END{print sum[max]}' <<<"${array[@]}"

(レコード区切り文字) をスペースに設定RSすると、配列エントリを個別のレコードとして読み取ることができます。

sum[$0]+=$0;手段sumは、各入力値の累積合計のマップです。if($0>max) max=$0これまでに見た最大数を計算します。END{print sum[max]}最後に見られる最大数の合計を出力します。

<<<"${array[@]}"は、文字列 (この場合は配列のすべての要素) を stdin として にフィードできるようにするヒアドキュメントですawk

この方法では、パイピングやループは必要ありません。単一のコマンドですべての作業が行われます。

于 2012-12-03T11:55:55.763 に答える
-1

bash のみを使用:

echo $((${array// /+}))

すべてのスペースをプラスに置き換え、二重括弧式を使用して評価します。

于 2014-11-26T08:46:01.847 に答える