awkを使用してファイルから行列を読み取り、bashスクリプトで宣言された2D配列(行列)に割り当てる方法

awkを使用してファイルから行列を読み取り、bashスクリプトで宣言された2D配列(行列)に割り当てる方法

echo私の行列の要素を印刷するときに問題があります。最初のループからコメントアウトを削除すると、echo ${matrix[$i,$j]}プログラムは正常に機能しますが、2番目のループで印刷しようとすると、${matrix[$i,$j]}出力はNULL文字です。目的は、ファイルから行列を読み取り、スクリプトで宣言された行列を私の行列に割り当てることです。

function readMatrixFromFile() {
        local file="$1"
        declare -A matrix
        local num_rows=$(awk 'NR==1 {print $3}' $1)
        local num_colums=$(awk 'NR==2 {print $3}' $1)

        for ((i=3;i<=num_rows+2;i++)) do
                for ((j=1;j<=num_colums;j++)) do
                        k=i-2
                        matrix[$k,$j]=$(awk -v row=$i -v col=$j 'NR==row {print $col}' $file)
                        #echo ${matrix[$i,$j]}
                done
        done


        for ((i=1;i<=num_rows;i++)) do
               for ((j=1;j<=num_colums;j++)) do
                       echo ${matrix[$i,$j]}
               done
               echo
        done

}

function Main() {
        readMatrixFromFile Matrix3.txt
}

Main

これはMatrix3.txtです。

ここに画像の説明を入力してください。

出力は次のとおりです。

ここに画像の説明を入力してください。

ベストアンサー1

#!/bin/bash                                                                                                           

declare -A m

read_matrix() {
    local i=0
    local line
    local j
    # Ignore the first 2 lines containing size of the matrix
    read rows
    read cols
    while read -r line; do
        j=0
        # split on spaces
        for v in `echo $line`; do
            m[$i,$j]="$v"
            j=$((j+1))
        done
        i=$((i+1))
    done
}

read_matrix < matrix.file

echo ${m[1,2]}

おすすめ記事