Bash

在 bash 中使用嵌套循環從數據文件填充 CSV 文件

  • September 15, 2018

我有一個文件,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 列,但使用相同的數據。而且,對我來說奇怪的是,第 4 列中的數據是 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

這個怎麼樣。單次執行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
$

引用自:https://unix.stackexchange.com/questions/467595