BashにMapを挿入して並べ替える

BashにMapを挿入して並べ替える

Bashにソートされた(挿入による)マッピングはありますか?

私も一つあることを知って連想配列bashのデータ構造ですが、繰り返すときの要素の順序は挿入順序ではありません。以下の例

地図を挿入順に維持したい。

連想配列は挿入順序を維持しません。

declare -A REPLACE_MAP
REPLACE_MAP['b']='2'
REPLACE_MAP['a']='1'
for key in "${!REPLACE_MAP[@]}"; do
    echo "$key - ${REPLACE_MAP["$key"]}"
    value=${REPLACE_MAP["$key"]}
done

結果:

a - 1
b - 2

私は以下を生成するデータ構造が欲しい。

b - 2
a - 1

答え1

〜のようにマイケル・ウェルズつまり、bashの連想配列は挿入順序を維持しません。これが「特徴」である一般的な連想配列。 Bashの「魔法」は、次の場合に発生します。ハッシュ library.c

バッシュはありませんインデックス配列、掲載申込書の指標として使用できます。

declare -A REPLACE_MAP
declare -a REPLACE_MAP_INDEX
REPLACE_MAP['b']='2'
REPLACE_MAP_INDEX+=('b')
REPLACE_MAP['a']='1'
REPLACE_MAP_INDEX+=('a')
for key in "${REPLACE_MAP_INDEX[@]}"; do
    printf "%s - %s\n" "$key" "${REPLACE_MAP["$key"]}"
    value=${REPLACE_MAP["$key"]}
done

データに応じて別のオプションは、元のキーと値がどのように結合された単一のインデックス配列です(ここではスペースを使用)。

unset arr
declare -a arr
arr+=("b 2")
arr+=("a 1")
for ckey in "${arr[@]}"; do
  key=${ckey% *}
  value=${ckey#* }
  printf "%s - %s\n" "$key" "$value"
done

...しかし、スペースがキーまたは値の有効な部分である場合は、パイプ記号など、使用されていない他の項目を選択してください。

unset arr
declare -a arr
arr+=("b|2")
arr+=("a|1")
for ckey in "${arr[@]}"; do
  key=${ckey%|*}
  value=${ckey#*|}
  printf "%s - %s\n" "$key" "$value"
done

関連情報