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

관련 정보