bash에서 3개의 개별 배열을 하나의 다차원 배열로 병합

bash에서 3개의 개별 배열을 하나의 다차원 배열로 병합

Bash 스크립트에서 다차원 배열을 만들 수 있습니까?

내 3 개의 배열은 다음과 같습니다.

arrayCITY=( NewYork LasVegas Detroit )
arraySTREET=( RoadStreet TreeStreet HighStreet )
arrayNUMBER=( 20 455 300 )

이제 이 3개의 배열을 하나의 배열에 넣고 싶습니다. 이것이 가능합니까? 그런 다음 txt 파일로 표시하고 싶습니다. 이제 나는 이것을 한다:

for ((i=0; i<${#arrayCITY[*]}; i++));do
  echo "${arrayCITY[i]} ${arraySTREET[i]} ${arrayNUMBER[i]}" >> TEXT.txt
done

답변1

에서 man 1 bash:

Arrays
       Bash  provides one-dimensional indexed and associative array variables.  Any variable
       may be used as an indexed array; the  declare  builtin  will  explicitly  declare  an
       array.   There  is no maximum limit on the size of an array, nor any requirement that
       members be indexed or assigned contiguously.  Indexed  arrays  are  referenced  using
       integers  (including  arithmetic  expressions) and are zero-based; associative arrays
       are referenced using  arbitrary  strings.   Unless  otherwise  noted,  indexed  array
       indices must be non-negative integers.

핵심 단어:

Bash는 1차원 인덱스 및 연관 배열 변수를 제공합니다.

아니요, bash는 다차원 배열을 지원하지 않습니다.

답변2

방금 이것에 부딪쳤습니다. 나를 위해 일한 매우 간단한 솔루션이 있습니다. 장치 이름과 화면 위치가 포함된 배열을 사용하여 장치의 키맵을 표시하고 싶습니다. 나는 다음을 수행했습니다. 구분 기호를 사용하여 장치 이름과 관련 화면 위치를 문자열로 연결했습니다(제 경우에는 다음을 사용했습니다). .) 나는 그것이 내 가치에 나타나지 않을 것이라는 것을 알고 있습니다. 그런 다음 cut필요할 때 복합 값을 구성 요소 부분으로 분해 하는 경우가 많습니다 . 이 작업을 수행하는 더 깨끗하고 간단한 방법이 있을 수 있지만 이는 bash가 지원하지 않더라도 어느 정도 bash에서 다차원 배열을 생성할 수 있음을 보여줍니다.

#!/bin/bash

# List of devices and screen positions for key maps.
DEV_LIST=( g13.+2560+30 g510s.+3160+30 g502.+2560+555 )

# This just echoes the device name and the screen position.
for DEV in "${DEV_LIST[@]}"; do
    DEVICE=$(echo $DEV | cut -f1 -d.)
    SCREEN_POSITION=$(echo $DEV | cut -f2 -d.)
    echo "$DEVICE"
    echo "$SCREEN_POSITION"
done

exit

이는 다음과 다소 유사합니다.Coop.Computer의 답변.

답변3

이것은 나에게 맞는 솔루션입니다. 처음에 다음과 같이 배열을 설정하면:

    arrayCSR=( Placeholder_for_0_spot NewYork RoadStreet 20 LasVegas TreeStreet 455 Detroit HighStreet 300 )

자리 표시자는 0개의 인덱스를 처리하지 않기 위해 존재합니다.

그러면 각 "행"은 3으로 나눌 수 있는 임의의 숫자이고, 각 "열"은 "행" 숫자보다 1 또는 2가 적습니다.

${arrayCSR[${3}]} is 20
${arrayCSR[${2}]} is RoadStreet
${arrayCSR[${1}]} is NewYork

예시 스크립트는 다음과 같습니다.

    arrayCSR=( CsR NewYork RoadStreet 20 LasVegas TreeStreet 455 Detroit HighStreet 300 )

    for p in $( seq 1 ${#arrayCSR[*]} )
    do
        if [[ "${arrayCSR[${p}]}" == "" ]] # Don't run if empty
        then
            true
        elif [[ $((p % 3 )) -eq 0 ]] # We have 3 "columns" in the array
        then
            echo " ${arrayCSR[$(( p - 2 ))]} ${arrayCSR[$(( p - 1))]} ${arrayCSR[${p}]}"
        fi
    done

따라서 3으로 나누는 모든 인덱스는 "행"을 나타내고 해당 행의 세 번째 "열"도 나타냅니다. 두 번째 및 첫 번째 "열"을 얻으려면 그에 따라 1 또는 2를 뺍니다.

필요한 경우 확장할 수도 있습니다.

업데이트: 다음은 파일 이름의 문자열 대체 배열을 로드하는 데 사용하는 코드입니다. 첫 번째 배열은 파일에서 로드된 다음 2개의 개별 배열로 분할됩니다.

        readarray -t string_replace < ~/scripts/string_replace.lst # List of things to remove from name
    
        for p in $( seq 0 ${#string_replace[*]} ); do
            old_name_element[${p}]="${string_replace[${p}]%%,*}"
            new_name_element[${p}]="${string_replace[${p}]:$((${#old_name_element[${p}]}+1))}"
        done
        string_replace=() # Clear old array

답변4

나는 Bash를 좋아하지만 때로는 다른 언어로 전환하는 것이 합리적입니다. Python에서 사전을 사용하는 것은 매우 간단합니다.

#!/usr/bin/env python3

cities = { 
            "New York": { "Street": "Roadstreet", "Number": 20 },
            "Las Vegas": { "Street": "TreeStreet", "Number": 455 }    
         }

for city in cities:
    print(str(city) + ": " + str(cities[city]["Street"])
    + " " + str(cities[city]["Number"])) 

이 명령을 실행하면 다음이 생성됩니다.

./cities.py 
New York: Roadstreet 20
Las Vegas: TreeStreet 455

관련 정보