parsing usando loop e atribuindo números de linha ao arquivo

0

É um pouco complicado. Eu tenho um arquivo de configuração. parece algo assim.

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

Agora, a primeira coluna contém todas as chaves e o que quer que esteja após o = ser o valor de cada chave. É como este formato:

key=value

Como posso escrever uma função onde ele chamará esse arquivo e armazenará cada chave e valor em duas matrizes separadas, onde a mesma posição de cada matriz conterá a chave e o valor correspondentes. Por favor, note que eu não posso usar o nome da minha chave na função em qualquer lugar nem eu posso grep usando o nome da chave exata. Alternativamente, tenho pensado em uma maneira de resolver isso atribuindo números de linha ao arquivo de configuração e "cortar" cada par de chave e valor com base no uso de grep em um loop para localizar os números de linhas individuais. algo assim:

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
}

Se você puder me informar o que está errado nessa função ou sugerir algum outro método para obter pares separados de valores-chave em diferentes matrizes. Agradecemos antecipadamente.

    
por Aditya Agarwal 15.06.2016 / 10:36

2 respostas

0

com o awk:

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

Com = como separador de campo e variável i com valor inicial 0 , awk imprimirá "arr1["i"]="$1";arr2["i"]="$2 para cada linha em que $1 terá a chave e $1 terá o valor e incremento i para cada linha.

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

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

Em seguida, use eval na saída do awk para atribuir matrizes.

    
por 15.06.2016 / 11:45
0

Você pode analisá-lo diretamente usando a função read do bash shell, definindo o separador de campo como =

while IFS== read -r name value; do 
  arr1+=("$name")
  arr2+=("$value") 
done < model.conf

Os arrays serão indexados como zero por padrão, ou seja,

$ echo "${arr1[0]}"
customer
$ echo "${arr2[0]}"
"airtel"

Como as variáveis (incluindo arrays) têm escopo global, a menos que explicitamente declarado como local , você pode colocar o loop de análise em uma função, se desejar. Para ilustrar:

#!/bin/bash

function parse() {
while IFS== read -r name value; do
  arr1+=("$name")
  arr2+=("$value")
done < model.conf
}

# call the function to extract key=value pairs from file to arrays
parse

# now we can use the arrays e.g.
for i in "${!arr1[@]}"; do
  printf 'key: %s\tvalue: %s\n' "${arr1[$i]}" "${arr2[$i]}"
done

Resultado

key: customer   value: "airtel"
key: model_name value: fast
key: programmer_typ_of  value: "dev"
    
por 15.06.2016 / 14:06