Preencher um arquivo CSV do arquivo de dados com loops aninhados no bash

2

Eu tenho um arquivo, 4.txt que contém caminhos completos para *.cfg arquivos, bem como dados adicionais que eu preciso remover para o relatório final ( 5.csv ).

Por exemplo, /source/EDDG/env1/dom1/proj/config/test.cfg

<ListVariable name="selected_lookups">          
 <CompoundVariableValue>
  <StringVariableValue name="lookup_name" value="CUSTOMER_1"/>
  <StringVariableValue name="business_name" value="DEVCUSTOMER"/>
  <StringVariableValue name="sample_data_path"value="/dev/.dat"/>
 </CompoundVariableValue>
 <CompoundVariableValue>
   <StringVariableValue name="lookup_name" value="CODE_1"/>
   <StringVariableValue name="business_name"value="CONCUSTOMER"/>
 </CompoundVariableValue>
</ListVariable>

(E ESTA SEQUÊNCIA REPETIR POR ~ 238 VEZES COM DADOS DIFERENTES ENTRE <ListVariable * > e </ListVariable> .

Agora eu preciso obter 4 valores deste arquivo canalizado para um arquivo csv ... por exemplo,

DOM,    PROJ, CFG,      LOOKUP NAME VALUE(s) (thr can be many per cfgfile) 
source, EDGE, test.cfg, CUSTOMER_1
                      , CONCUSTOMER  (second lookup name value)
... repeat for all cfg files in 4.txt

Para adquirir esses dados, eu tenho o seguinte loop e funciona muito bem para as primeiras 3 colunas, mas não para a quarta coluna.

for COL_VAL in 'cat 4.txt | grep '/source/EDDG*'' ;
do
    DOM='echo "${COL_VAL}" | awk -F'/' '{ print $7 }''
    PROJ='echo "${COL_VAL}" | awk -F'/' '{ print $8 }''
    CGF='echo "${COL_VAL}" | awk -F'/' '{ print $10 }''
    LKP='echo "${COL_VAL}" | grep 'name="lookup_name" value="' | awk -F'value="' '{ print $2 }' | awk -F'_1' '{ print $1 }''

    echo "${DOM},${PROJ},${CFG},${LKP}"

   done < ${TMPDIR}/4.txt > ${TMPDIR}/5.csv

Então, tentei algo parecido com esse loop aninhado:

for COL_VAL in 'cat 4.txt | grep '/source/EDDG*'' ;
do
    DOMN='echo ${COL_VAL} | awk -F'/' '{ print $7 }''
    PROJ='echo ${COL_VAL} | awk -F'/' '{ print $8 }''
    APFG='echo ${COL_VAL} | awk -F'/' '{ print $10 }''

    for LOOK_UP in 'cat 4.txt | grep 'name="lookup_name" value="'' ;
    do
        ULKP='echo "${LOOK_UP}" |  awk -F'value="' '{ print $2 }' | awk -F'_1' '{ print $1 }''
    done

    echo "${DOMN},${PROJ},${APFG},${ULKP}"

done < ${TMPDIR}/4.txt > ${TMPDIR}/5.csv

Isso preenche a quarta coluna, mas com os mesmos dados. E, estranhamente para mim, os dados que correm no quarto col são o valor do último nome de pesquisa absoluta em 4.txt que é "name=" lookup_name "value = XYZ '"

por exemplo,

DOM,    PROJ, CFG,      LOOKUP NAME VALUE(s) 
source, EDGE, test.cfg, XYZ
      ,     ,         , XYZ
... repeat for all cfg files in 4.txt
    
por SSDdude 07.09.2018 / 19:48

1 resposta

2

Que tal isso. Execução única de awk , provavelmente muito rápida em comparação com o script original.

$ awk -F/ 'BEGIN{print "DOM,    PROJ, CFG,      LOOKUP NAME VALUE(s)"}/source\/EDDG/{a=$2", "$3", "substr($8,0,length($8)-2)", "}/lookup_name/{gsub(/^.*value="/,"");gsub(/".*/,"");print a$0}' 4.txt
DOM,    PROJ, CFG,      LOOKUP NAME VALUE(s)
source, EDDG, test.cfg, CUSTOMER_1
source, EDDG, test.cfg, CODE_1
$

Ou formatado melhor:

$ awk -F/ 'BEGIN {
            print "DOM,    PROJ, CFG,      LOOKUP NAME VALUE(s)"
           }
           /source\/EDDG/ {
            a=$2", "$3", "substr($8,0,length($8)-2)", "}
           /lookup_name/ {
            gsub(/^.*value="/,"")
            gsub(/".*/,"")
            print a$0
           }' 4.txt
DOM,    PROJ, CFG,      LOOKUP NAME VALUE(s)
source, EDDG, test.cfg, CUSTOMER_1
source, EDDG, test.cfg, CODE_1
$
    
por 07.09.2018 / 21:01