2016-08-17 8 views
0

私は与えられたファイルを読み込んで2次元配列に格納するシェルスクリプト関数を書いています。Bashシェルファイルを配列に読み込む関数

File.txt 

a1 b1 c1 
a2 b2 c2 
a3 b3 c3 
# Let's just assume 3 rows 

アイデアは、私が何を得る

declare -a array 
num_rows=0 
read_data File.txt array num_rows 

の下に呼び出した後、関数のシグネチャread_data File.txt array num_rows

read_data() { 

    if [ ! -f $1 ]; then 
    echo "Failed to read hosts ($1 not found)"; 
    exit; 
    fi 

    while read -r line; do 

    # skip the comments 
    { [[ "$line" =~ ^#.*$ ]] || [[ -z $line ]] ;} && continue 

    # Parse the line 
    read -a tokens <<< $line 

    if [ ${#tokens[@]} == 3 ]; then 

     # Extract the user/host/home 
     eval $2[\$$3, 0]=\${tokens[0]} 
     eval $2[\$$3, 1]=\${tokens[1]} 
     eval $2[\$$3, 2]=\${tokens[2]} 
     eval $3=$(($3+1)) 

    else 
     echo "Wrong line format '$line'" 
    fi 

    done < $1 
} 

で、evalを使用してreferenceして、ストレージを渡すことですnum_rowsある3に等しいが、配列に格納されているコンテンツは

です。 0
pnt_data() { 
    for ((i=0; i<$2; i++)); do 

     eval a=\${$1[$i, 0]} 
     eval b=\${$1[$i, 1]} 
     eval c=\${$1[$i, 2]} 

     echo $a $b $c 
    done 
} 

pnt_data array num_rows 

a3 b3 c3 
a3 b3 c3 
a3 b3 c3 

これはどうなりますか?私の機能に何か問題はありますか?

+0

Bashは2D配列をサポートしていないため、別の言語を選択してください。 awkはそれをサポートしています。個人的に私はPerlまたはPythonを検討します。 – cdarke

答えて

4

配列インデックスは算術コンテキストで評価され、カンマ演算子は左側のオペランドを評価し、無視して右側のオペランドに評価することによって動作します。たとえば:

$ echo $((3,0)) 
0 
$ echo $((3+9,0)) 
0 
$ echo $((a,0)) 
0 

その結果、次の割り当てのすべてがfoo[0]=barに等価です:あなたは多次元インデックスをシミュレートしたい場合は、連想配列を使用する必要があります

foo[3,0]=bar  # ignore 3 
foo[3+9,0]=bar # 3+9=12, ignore 12 
foo[a,0]=bar  # ignore whatever the value of a is 

ので、インデックスとして使用される文字列は、それを使用する前に算術展開されません。

declare -A array # capital A, not lowercase a 
num_rows=0 
read_data File.txt array num_rows 
+0

もっと詳しく説明できますか? – Jes

関連する問題