我有一个文件,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
$