在 bash 中使用嵌套循环从数据文件填充 CSV 文件

在 bash 中使用嵌套循环从数据文件填充 CSV 文件

我有一个文件,4.txt其中包含文件的完整路径*.cfg以及我需要为最终报告剥离的附加数据 ( 5.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
$

相关内容