私はbashスクリプトで連想配列の最後のいくつかの項目を繰り返したいと思います。この場合は、その値を要約するためのものです。私は以下を試しました:
SUM="0"
for last_element in $(printf "%s\n" "${!ELEMENTS[@]}" | tail -100); do
ELEMENT_SUM="$(echo "scale=5; $SUM + ${ELEMENTS[$last_elements]}" | bc)"
done
実際に起こるのは、$last_element
各要素を繰り返すのではなく、リスト全体(この場合は100要素)を印刷することです。したがって${ELEMENTS[$last_elements]}
、失敗します。
${ELEMENTS[-100]}
いくつかのアプローチ(たとえば、負のインデックス付けを含む)を試しましたが、成功しませんでした。何が間違っているのかわかりません...
どんなアドバイスやアイデアにも感謝します。
ありがとうございます!
ベストアンサー1
Bashの連想配列は本質的に順序付けされていないため、最後の要素または最後の100要素という概念はありません。
ただし、擬似乱数順に配列から抽出された100要素の値を合計するには、次のようにします。
e100=$(printf "%s\n" "${elements[@]}" | tail -n 100)
sum=$(echo ${e100//$'\n'/+} | bc)
echo $sum
最初の行は、printf
連想配列の100個の要素を改行文字で区切られた$elements
変数に格納します$e100
。
2行目は、echo
bash引数パターン置換を使用してすべての改行をシンボルに変更し、計算を実行するために+
パイプに接続します。bc
結果は変数に保存されます$sum
。
ところで、これは価値連想配列を直接使用すると、配列のインデックスを繰り返す必要はありません。
これを行うより良い方法があり、「まあ、そこに行きたいならここで始めない」という古いジョークのように、bashはあらゆる種類のデータ処理のための良い出発点ではありません。 awk、perl、python、シェルではないほとんどすべてを使用してください。
おそらく、あなたは浮動小数点数で作業していて、bashが整数演算しか実行できないことに気づいたので、bc
この問題を解決するためにそれを使用しています。そのような基本的なタスクを実行する際の制限を解決する必要がない言語を使用することをお勧めします。