Substitua vários valores de variáveis em um arquivo com valores de entrada fornecidos (de um arquivo)

0

Se eu tiver dois arquivos de entrada com o conteúdo abaixo: Como posso substituir network_name (por exemplo: P1MSVmgmtvM substitua por / rest / ethernet-networks / 2bf8bc44-5b31-4e6c-99ed-d68b1e9acf9e).

Arquivo1: (arquivo de entrada)

Data_NetworkSet_A
 P1MSVmgmtvM
 P1MSVvMotion
Data_NetworkSet_B
 P2MSVmgmtvM
 P2MSVvMotion
Edge_NetworkSet_A
 E1MSVEDGEiDMZRUE1
 E1MSVEDGEiEXPRUE1

Arquivo 2: (com valores para netowrk_name)

    "name": "P2MSVvMotion",
    "uri": "/rest/ethernet-networks/1d3188e4-9c06-4e92-92fd-dde4d6985151",
    "name": "P1MSVmgmtvM",
    "uri": "/rest/ethernet-networks/2bf8bc44-5b31-4e6c-99ed-d68b1e9acf9e",
    "name": "P2MSVmgmtvM",
    "uri": "/rest/ethernet-networks/8be8cdd2-e9a6-4ecd-9aa3-435e810c68e9",
    "name": "E1MSVEDGEiEXPRUE1",
    "uri": "/rest/ethernet-networks/97a47127-5c28-4c5b-891a-5ea3736306d3",
    "name": "P1MSVvMotion",
    "uri": "/rest/ethernet-networks/c16f119a-b556-464d-96dd-7fee9fd8dbc2",
    "name": "E1MSVEDGEiDMZRUE1",
    "uri": "/rest/ethernet-networks/cbb509aa-ab8a-4d85-886b-0899424f324c",

esperado o / p:

Data_NetworkSet_A
 - /rest/ethernet-networks/2bf8bc44-5b31-4e6c-99ed-d68b1e9acf9e
 - /rest/ethernet-networks/c16f119a-b556-464d-96dd-7fee9fd8dbc2
Data_NetworkSet_B
 - /rest/ethernet-networks/8be8cdd2-e9a6-4ecd-9aa3-435e810c68e9
 - /rest/ethernet-networks/1d3188e4-9c06-4e92-92fd-dde4d6985151
Edge_NetworkSet_A
 - /rest/ethernet-networks/cbb509aa-ab8a-4d85-886b-0899424f324c
 - /rest/ethernet-networks/97a47127-5c28-4c5b-891a-5ea3736306d3
    
por Prajith P 15.04.2018 / 01:11

3 respostas

1

Além dos campos que estão sendo citados e divididos em duas linhas, essa é uma tarefa de pesquisa bastante normal para awk :

awk -F: '
function strip(x) {
  gsub(/[",]/,"",x)
  return x
}
  NR==FNR {
    i = strip($2)
    if (getline > -1) {
      a[i] = strip($2)
    }
    next
  } 
  $1 in a {
    $1 = " -"a[$1]
  } 1' file2 file1

dando

Data_NetworkSet_A
 - /rest/ethernet-networks/2bf8bc44-5b31-4e6c-99ed-d68b1e9acf9e
 - /rest/ethernet-networks/c16f119a-b556-464d-96dd-7fee9fd8dbc2
Data_NetworkSet_B
 - /rest/ethernet-networks/8be8cdd2-e9a6-4ecd-9aa3-435e810c68e9
 - /rest/ethernet-networks/1d3188e4-9c06-4e92-92fd-dde4d6985151
Edge_NetworkSet_A
 - /rest/ethernet-networks/cbb509aa-ab8a-4d85-886b-0899424f324c
 - /rest/ethernet-networks/97a47127-5c28-4c5b-891a-5ea3736306d3
    
por 15.04.2018 / 02:40
0
  1. Você converte o arquivo 1 para que os nomes se tornem referências de variáveis:

    awk '$0 !~ /^ / { print; next; }; { sub("^ *","&$"); print; }' file1         
        Data_NetworkSet_A
         $P1MSVmgmtvM
         $P1MSVvMotion
         ...
    
  2. Você lê os dados do arquivo 2 em variáveis shell (assumindo que nenhum nome "perigoso" (como PATH ) ocorre):

     while read dummy varname; read dummy varvalue; do
         eval "export ${varname%,}=${varvalue%,}"
     done <file2
    
  3. Você tem envsubst substituir os nomes pelos valores:

     envsubst <file2
         Data_NetworkSet_A
          /rest/ethernet-networks/2bf8bc44-5b31-4e6c-99ed-d68b1e9acf9e
          /rest/ethernet-networks/c16f119a-b556-464d-96dd-7fee9fd8dbc2
    
por 15.04.2018 / 01:45
0

Outra solução (tudo em um):

IFS=''    #prevent ending/trailing whitespace from being trimmed.
while read line in
do
        if [ ! "$(echo $line | grep -e'^\s')" ] # if the word is not begins from space
        then
                # just write it to result_file
                echo $line >> result_file
        else
                # cut leading space => grep in file_2 (get 1 line after match too) => grep for uri => cut no needed symbols => write it to result_file  
                echo " - $(grep -A1 $(echo "$line" | tr -d ' ') file_2 | grep uri | cut -d ':' -f2 | tr -d '", ')" >> result_file
        fi
done < file_1

Este script lê a partir de file_1 e compara as linhas com file_2 . Resultado enviado em result_file .

    
por 15.04.2018 / 02:31