web-dev-qa-db-ja.com

bashで3つの個別の配列を1つの多次元配列に組み合わせる

Bashスクリプトで多次元配列を作成することは可能ですか?

これらは私の3つの配列です。

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

次に、これらの3つの配列を1つの配列に配置します-これは可能ですか?次に、それらをtxtファイルで表示します。今私はこのようにします:

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

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は多次元配列をサポートしていません。

3
jayhendren

たまたまこれに遭遇しました。私のために働いたかなり単純な解決策があります。デバイス名と画面位置を含む配列を使用して、デバイスのキーマップを表示したいと思いました。私は次のことを行いました:区切り文字を使用して、デバイス名と関連する画面位置を1つの文字列に連結しました(私の場合、を使用しました).)私がどの値にも表示されないことを知っていました。次に、cutを使用して、必要に応じて複合値をコンポーネントに分解しました。これを行うためのよりクリーンでシンプルな方法があるかもしれませんが、これは、多次元配列を、たとえそれがサポートされていなくても、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の回答 に似ています。

2
Llewen

ここに私のために働く解決策があります。最初に次のように配列を設定すると、

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で割り切れるインデックスはすべて「行」を示し、行の3番目の「列」も示します。 2番目と1番目の「列」を取得するには、それに応じて1または2を引きます。

これは、必要に応じて拡大することもできます。

1
Coop.Computer