Linux

使用循環解析並將行號分配給文件

  • March 9, 2019

這有點複雜。我有一個配置文件。它看起來像這樣。

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

現在第一列包含所有鍵,後面的=就是每個鍵的值。就像這樣的格式:

key=value

我如何編寫一個函式,它將呼叫這樣的文件並將每個鍵和值儲存到兩個單獨的數組中,其中每個數組的相同位置將包含相應的鍵和值。請注意,我不能在函式中的任何地方使用我的密鑰名稱,也不能使用確切的密鑰名稱進行 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
}

如果你能告訴我這個函式有什麼問題,或者你能建議一些其他方法來獲取不同數組中的單獨鍵值對。

使用 awk:

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

使用=as 欄位分隔符和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"

然後eval在 awk 輸出上使用來分配數組。

引用自:https://unix.stackexchange.com/questions/289857