Bash
在 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 列,但使用相同的數據。而且,對我來說奇怪的是,第 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 $