bash에서 키 값 목록을 연관 배열로 변환하는 가장 최적의 코드 패턴은 무엇입니까?

rtx13

인덱스 배열에 저장된 키-값 목록이 주어지면 각 키와 값은 개별 요소입니다.

list=(
'key$1' "value 1 line 1
value 1 line 2
"
'key$2' $'another\nmulti-line\nvalue\n'
)

다음 코드는 키-값 쌍을 올바르게 반복하고 연관 배열을 생성합니다.

declare -A arr
for (( i=0; i<${#list[*]}; i+=2 )); do
    arr+=( ["${list[$i]}"]="${list[$((i+1))]}" );
done
$ declare -p arr
declare -A arr='([key2]="another
multi-line
value
" [key1]="value 1 line 1
value 1 line 2
" )'
$ 

이것을 달성하는 더 간단하거나 더 간결한 방법이 있습니까?

소코 위

대신 arr+=([key]=value)쓸 수 arr[key]=value있습니다. 또한 변수에 $(())대한 $접두사는 list[…].

declare -A arr
for (( i=0; i<"${#list[*]}"; i+=2 )); do
    arr["${list[i]}"]="${list[i+1]}"
done

그 외에는 스크립트가 괜찮아 보입니다. 내가 유일하고 진정한 대안은 명령 문자열과 만들 생각 eval/ declare하나입니다. 다음 명령어는에 키-값 쌍이 하나 이상 있다고 가정합니다 list.

declare -A "arr=($(printf '[%q]=%q ' "${list[@]}"))"

declare명령은 안전해야합니다. 또한 ARG_MAX내장 기능 만 사용 하므로 문제가 없어야합니다 . 그러나 루프는 한 단계 더 빠른 것 같습니다. 다음 벤치 마크를 참조하십시오. 실제 데이터를 사용하여 두 가지 접근 방식을 자유롭게 벤치마킹하십시오 (매우 긴 배열을 다룰 때만 가치가 있음).

randList() {
    # tr is necessary since the empty string cannot be used as a key
    mapfile -d '' -n "$1" list < <(tr -s \\0 < /dev/urandom)
}
testFor() { declare -A arr; for (( i=0; i<"${#list[*]}"; i+=2 )); do arr["${list[i]}"]="${list[i+1]}"; done; }
testDeclare() { declare -A "arr=($(printf '[%q]=%q ' "${list[@]}"))"; }
prettyTime() { { time "$@"; } 2>&1 | grep -Eom1 '[0-9.sm]+'; }
for size in {1,10,50}000; do
    randList "$size"
    echo "list size = $size"
    printf %s "for loop        "; prettyTime testFor
    printf %s "declare command "; prettyTime testDeclare
done

내 노트북 ​​(bash 5.0.16, intel i5 M 520)에서 다음과 같은 결과를 얻었습니다.

list size = 1000
for loop        0m0.059s
declare command 0m0.320s
list size = 10000
for loop        0m0.435s
declare command 0m2.395s
list size = 50000
for loop        0m2.540s
declare command 0m12.276s

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

PHP의 연관 배열에서 최대 키 / 값 쌍 배열을 얻는 방법은 무엇입니까?

분류에서Dev

키-값 파일에서 문자열 (string [strings])의 연관 배열을 만드는 방법은 무엇입니까?

분류에서Dev

Javascript : 연관 배열의 키로 변수 값을 설정하는 방법은 무엇입니까?

분류에서Dev

PHP에서 키-값 쌍으로 연관 배열을 명시 적으로 정의하는 방법은 무엇입니까?

분류에서Dev

Ruby에서 키 값 쌍 목록을 Hash로 변환하여 중복 키가있는 값이 배열에 저장되도록하는 방법은 무엇입니까?

분류에서Dev

문자열로 변환 된 열거 형 값을 보유하는 Seq에서 패턴 일치를 수행하는 가장 관용적 인 방법은 무엇입니까?

분류에서Dev

배열에서 특정 요소를 가져오고 배열 키 값의 비교를 기반으로 새 배열을 만드는 방법은 무엇입니까?

분류에서Dev

'AngularJS'를 사용하여 키-값 쌍을 배열 목록으로 변환하는 방법은 무엇입니까?

분류에서Dev

키 패턴을 기반으로 Postgress의 json에서 값을 추출하는 방법은 무엇입니까?

분류에서Dev

PHP : 키에 하이픈 / 대시가있는 연관 배열에서 값을 추출 ()하는 방법은 무엇입니까?

분류에서Dev

HTML 드롭 다운 목록의 여러 값을 배열에 저장하고 PHP를 사용하여 쉼표로 구분하는 방법은 무엇입니까?

분류에서Dev

다른 목록의 값을 기준으로 목록에서 값을 필터링하는 가장 효율적인 방법은 무엇입니까?

분류에서Dev

배열에 True 값이있을 때마다 배열의 다음 n 항목을 True로 만드는 가장 Pythonic 방법은 무엇입니까?

분류에서Dev

목록이 C의 행렬 행을 가리키는 연결 목록 배열을 만드는 방법은 무엇입니까?

분류에서Dev

드롭 다운 목록에서 값을 바인딩하는 데 사용할 수있는 배열로 JSON을 변환하는 방법은 무엇입니까?

분류에서Dev

목록을 반복하고 Python에서 적합한 문자열 패턴을 찾는 가장 빠르고 (가장 효율적인) 방법은 무엇입니까?

분류에서Dev

목록 목록을 한 줄에 하나의 내부 목록으로 문자열로 변환하는 가장 짧은 방법은 무엇입니까?

분류에서Dev

키가 변수 인 자바 스크립트 연관 배열을 정의하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

키 쌍의 값을 목록으로 변환하는 방법은 무엇입니까?

분류에서Dev

Perl에서 키워드로 분할하는 기본 배열에서 다른 배열의 값을 얻는 방법은 무엇입니까?

분류에서Dev

dict를 반복하고 목록에 값을 저장하기 위해 코드를 최적화하는 방법은 무엇입니까?

분류에서Dev

기존 배열의 키 / 값 쌍을 PHP에서 여러 값을 가진 키를 허용하는 연관 배열로 뒤집습니다.

분류에서Dev

각 요소의 개수가 키이고 값이 해당 요소의 목록 인 목록에서 사전을 만드는 방법은 무엇입니까?

분류에서Dev

Shell Script를 사용하여 연관 배열에 중복 키 값을 추가하는 방법은 무엇입니까?

분류에서Dev

가상 키 코드 배열의 순서는 무엇입니까?

분류에서Dev

키보드 키의 코드가 키맵을 일시적으로 변경하도록 허용하는 방법은 무엇입니까?

분류에서Dev

연관 배열을 PHP의 값으로 다른 연관 배열과 함께 키가있는 연관 배열로 변환

분류에서Dev

값에 의해 주어진 반복 횟수를 사용하여 사전을 키 목록으로 변환하는 방법은 무엇입니까?

분류에서Dev

stdout을 변수, 목록 또는 numpy 배열에 동적으로 저장하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    PHP의 연관 배열에서 최대 키 / 값 쌍 배열을 얻는 방법은 무엇입니까?

  2. 2

    키-값 파일에서 문자열 (string [strings])의 연관 배열을 만드는 방법은 무엇입니까?

  3. 3

    Javascript : 연관 배열의 키로 변수 값을 설정하는 방법은 무엇입니까?

  4. 4

    PHP에서 키-값 쌍으로 연관 배열을 명시 적으로 정의하는 방법은 무엇입니까?

  5. 5

    Ruby에서 키 값 쌍 목록을 Hash로 변환하여 중복 키가있는 값이 배열에 저장되도록하는 방법은 무엇입니까?

  6. 6

    문자열로 변환 된 열거 형 값을 보유하는 Seq에서 패턴 일치를 수행하는 가장 관용적 인 방법은 무엇입니까?

  7. 7

    배열에서 특정 요소를 가져오고 배열 키 값의 비교를 기반으로 새 배열을 만드는 방법은 무엇입니까?

  8. 8

    'AngularJS'를 사용하여 키-값 쌍을 배열 목록으로 변환하는 방법은 무엇입니까?

  9. 9

    키 패턴을 기반으로 Postgress의 json에서 값을 추출하는 방법은 무엇입니까?

  10. 10

    PHP : 키에 하이픈 / 대시가있는 연관 배열에서 값을 추출 ()하는 방법은 무엇입니까?

  11. 11

    HTML 드롭 다운 목록의 여러 값을 배열에 저장하고 PHP를 사용하여 쉼표로 구분하는 방법은 무엇입니까?

  12. 12

    다른 목록의 값을 기준으로 목록에서 값을 필터링하는 가장 효율적인 방법은 무엇입니까?

  13. 13

    배열에 True 값이있을 때마다 배열의 다음 n 항목을 True로 만드는 가장 Pythonic 방법은 무엇입니까?

  14. 14

    목록이 C의 행렬 행을 가리키는 연결 목록 배열을 만드는 방법은 무엇입니까?

  15. 15

    드롭 다운 목록에서 값을 바인딩하는 데 사용할 수있는 배열로 JSON을 변환하는 방법은 무엇입니까?

  16. 16

    목록을 반복하고 Python에서 적합한 문자열 패턴을 찾는 가장 빠르고 (가장 효율적인) 방법은 무엇입니까?

  17. 17

    목록 목록을 한 줄에 하나의 내부 목록으로 문자열로 변환하는 가장 짧은 방법은 무엇입니까?

  18. 18

    키가 변수 인 자바 스크립트 연관 배열을 정의하는 가장 좋은 방법은 무엇입니까?

  19. 19

    키 쌍의 값을 목록으로 변환하는 방법은 무엇입니까?

  20. 20

    Perl에서 키워드로 분할하는 기본 배열에서 다른 배열의 값을 얻는 방법은 무엇입니까?

  21. 21

    dict를 반복하고 목록에 값을 저장하기 위해 코드를 최적화하는 방법은 무엇입니까?

  22. 22

    기존 배열의 키 / 값 쌍을 PHP에서 여러 값을 가진 키를 허용하는 연관 배열로 뒤집습니다.

  23. 23

    각 요소의 개수가 키이고 값이 해당 요소의 목록 인 목록에서 사전을 만드는 방법은 무엇입니까?

  24. 24

    Shell Script를 사용하여 연관 배열에 중복 키 값을 추가하는 방법은 무엇입니까?

  25. 25

    가상 키 코드 배열의 순서는 무엇입니까?

  26. 26

    키보드 키의 코드가 키맵을 일시적으로 변경하도록 허용하는 방법은 무엇입니까?

  27. 27

    연관 배열을 PHP의 값으로 다른 연관 배열과 함께 키가있는 연관 배열로 변환

  28. 28

    값에 의해 주어진 반복 횟수를 사용하여 사전을 키 목록으로 변환하는 방법은 무엇입니까?

  29. 29

    stdout을 변수, 목록 또는 numpy 배열에 동적으로 저장하는 방법은 무엇입니까?

뜨겁다태그

보관