combinando 3 arrays separados para um array multidimensional no bash

2

É possível criar matrizes multidimensionais no script bash?

Estes são meus três arrays:

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

Agora quero colocar esses três arrays em apenas um array - isso é possível? Então eu quero mostrá-los em um arquivo txt. Agora eu faço assim:

for ((i=0; i<${#arrayCITY[*]}; i++));do
  echo "${arrayCITY[i]} ${arraySTREET[i]} ${arrayNUMBER[i]}" >> TEXT.txt
done
    
por sanderfcb95 16.11.2016 / 20:29

3 respostas

3

De 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.

Frase-chave:

Bash provides one-dimensional indexed and associative array variables.

Portanto, não, o bash não suporta matrizes multidimensionais.

    
por 16.11.2016 / 20:35
1

Aqui está uma solução que funciona para mim. Se primeiro configurarmos o array assim:

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

O espaço reservado está lá para evitar ter que lidar com um índice 0.

Em seguida, cada "linha" é qualquer coisa que possa ser dividida por 3 e cada "coluna" é 1 ou 2 menor que o número da "linha".

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

Um exemplo de script está abaixo:

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

Assim, qualquer índice que possa dividir por 3 indica uma "linha" e também a terceira "coluna" na linha. Para obter a segunda e primeira "coluna", subtraia 1 ou 2 de acordo.

Isso também pode ser ampliado, se necessário.

    
por 10.11.2017 / 08:38
-1

Por mais que eu goste do Bash, faz sentido às vezes mudar para outros idiomas. Isso é bastante simples usando um dicionário em 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"])) 

A execução desse rendimento:

./cities.py 
New York: Roadstreet 20
Las Vegas: TreeStreet 455
    
por 16.11.2016 / 21:26