Bash에서 중첩 루프를 사용하여 데이터 파일에서 CSV 파일 채우기

Bash에서 중첩 루프를 사용하여 데이터 파일에서 CSV 파일 채우기

최종 보고서를 위해 제거해야 하는 4.txt파일의 전체 경로와 추가 데이터()가 포함된 파일이 있습니다 .*.cfg5.csv

예를 들어/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>

(이 순서는 약 238회 반복되며, 와 사이의 데이터는 <ListVariable * >다릅니다 </ListVariable>.

이제 이 파일에서 4개의 값을 가져와서 csv 파일로 파이프해야 합니다. 예:

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

이 데이터를 얻으려면 처음 3개 열에는 잘 작동하지만 네 번째 열에는 잘 작동하지 않는 다음 루프가 있습니다.

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

그래서 다음과 같은 중첩 루프를 시도했습니다.

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

그러면 네 번째 열이 채워지지만 동일한 데이터로 채워집니다. 그리고 이상한 점은 네 번째 열의 데이터가 4.txt에서 마지막으로 조회한 절대 이름의 값인 "'name = "lookup_name" value = XYZ'"라는 것입니다.

예를 들어

DOM,    PROJ, CFG,      LOOKUP NAME VALUE(s) 
source, EDGE, test.cfg, XYZ
      ,     ,         , XYZ
... repeat for all cfg files in 4.txt

답변1

이건 어때. 단일 실행은 awk원래 스크립트에 비해 상당히 빠를 것입니다.

$ 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
$

또는 더 예쁜 형식을 사용하면 다음과 같습니다.

$ 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
$

관련 정보