Eu preciso criar um array multidimensional com o bash e li que não existem arrays multidimensionais no bash.
Aqui estão meus dados possíveis, como eles se parecem e o que eu preciso. Este não é um array bash:
DATACOL = [
"1"=>("Santiago","Barcelona","AWG","6792992","Male"),
"2"=>("Santi","Texas","BGG","6792992","Male"),
"3"=>("Tiago","Rio","GHA","6792992","Female")
]
Como posso fazer algo semelhante com um script simples? Eu sou um novato completo para bater.
Você não. Se você precisar de algo como uma matriz multidimensional, isso é uma indicação muito forte de que você deve usar uma linguagem de programação real em vez de um shell. Os shells não são realmente linguagens de programação e, embora possam ser (ab) usados como um, isso deve ser apenas para coisas simples. Infelizmente, muitas pessoas parecem pensar que o shell é a ferramenta certa para todas as situações e isso leva a muito esforço desperdiçado tentando fazer algo que o shell não pode fazer ou pode fazer muito mal, em vez de usar uma ferramenta projetada para o trabalho.
Dito isso, você pode hackear algo usando namerefs :
Por exemplo, assim:
Que produz:
É muito complicado, frágil e não vale o esforço. Em vez disso, use uma linguagem de script real.
Você não pode no Bash, não sem truques. Ksh93 tem matrizes multidimensionais nativas, no entanto.
Um truque comum é usar um array associativo (
declare -A arr
) e usar chaves como1,2
, com vários índices separados por uma vírgula literal. Embora iterar sobre uma única "linha" ou "coluna" não seja tão simples. É também assim que o AWK implementa arrays multidimensionais, veja, por exemplo, o manual do GNU AWK .Em ksh:
estampas
Mas, realmente, este é um daqueles casos em que você provavelmente deveria considerar mudar para, por exemplo, Python (ou Perl, ou...), a menos que seu caso de uso seja bastante especial. As linguagens do shell facilitam a inicialização de programas externos, mas o manuseio de estruturas de dados é muito mais difícil.
É claro que existem situações em que um shell script é mais simples/prático do que um script Python ou Perl ..., como quando um script serve como "cola" entre uma fonte de entrada e o processamento subsequente.
OP não mencionou o que eles queriam fazer com os dados, então o seguinte é um resumo de algumas das possibilidades de lidar com dados de valor-chave no script de shell. Também presumi que os campos na entrada são separados por vírgula (como seria o caso de en_US-locale *.csv, por exemplo).
Possibilidade #1: processamento linear com um array por linha de um arquivo de entrada
Possibilidade #2: processamento linear usando a lista de elementos posicionais, por exemplo, entrada de uma função/programa
Possibilidade nº 3: carregar dados em uma matriz multidimensional para processamento não linear subsequente
Aqui, o "separador de dimensão" é um ponto, mas qualquer outro caractere não-dígito também estaria ok. Pode-se usar qualquer caractere (incluindo $'\n',$'\a' etc) que não apareça em nenhum nome de dimensão.