これは少し複雑です。構成ファイルがあります。こんな感じです。
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
$1
i
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
配列を割り当てます。