ループを使用してファイルに行番号を解析して割り当てます。

ループを使用してファイルに行番号を解析して割り当てます。

これは少し複雑です。構成ファイルがあります。こんな感じです。

customer="airtel"
model_name=fast
programmer_typ_of="dev"

最初の列にはすべてのキーが含まれ、次の内容は=各キーの値です。次の形式です。

key=value

このようなファイルを呼び出し、各キーと値を2つの別々の配列に格納する関数をどのように書くことができますか?各配列の同じ位置に対応するキーと値が含まれます。関数のどこでも私のキー名を使用できず、正確なキー名でgrepすることもできません。または、設定ファイルに行番号を割り当て、grepループの使用に応じて個々の行番号を見つけて、各キーと値のペアを「切断」してこの問題を解決する方法を考えました。このような:

function parse() {
    i=0
    declare -a arr1
    declare -a arr2
    cat -n model.conf    #assigns row numbers to model.conf

    while true; do
    var1=$(cat model.conf |  grep ^$i | cut -d '=' -f1)    #gets the key and stores it in variable var1
    var2=$(cat model.conf |  grep ^$i | cut -d '=' -f2)    #gets the value and stores it in variable var2
    arr1[$i]=$var1    #array containing keys
    arr2[$i]=$var2    #array containing values
    i=$(( $i  + 1 ))
    done
}

この関数に何が問題なのかを教えてください。個々のキーと値のペアを別の配列にインポートする別の方法を提案できますか?

ベストアンサー1

awkを使用してください:

eval $(awk -F= -v i=0 '{print "arr1["i"]="$1";arr2["i"]="$2;i++}' model.conf)

=変数をフィールド区切り文字として使用し、i初期値を使用すると、各行が印刷され、その中にキーが含まれ0、各行awkの値と増分が得られます。"arr1["i"]="$1";arr2["i"]="$2$1$1i

awk -F= -v i=0 '{print "arr1["i"]="$1";arr2["i"]="$2;i++}' model.conf出力:

arr1[0]=customer;arr2[0]="airtel"
arr1[1]=model_name;arr2[1]=fast
arr1[3]=programmer_typ_of;arr2[3]="dev"

次に、awk出力を使用してeval配列を割り当てます。

おすすめ記事