- 论坛徽章:
- 0
|
回复 #1 ghostgorst 的帖子
用下面的shell脚本,把多个xml文件合并成一个,结果有问题,<bill_run>节点出现了多次.
cat ${BILLING_HOME}/log/.file_path.log|xargs awk '/^<?xml/,/^]>/{
if(!a[$0]++)
if(NR==FNR) h=h"n"$0
else sub(/n]>/,"n"$0"n]>",h)
next
}
/<bill /,/</bill>/{print;next}
/^</bill_run>/{next}
NR==FNR&&!a[$0]++
END{
print "</bill_run>"
print h > t".xml"
}' t=$$ > $$ |
cat $$.xml $$ > merge.xml
${BILLING_HOME}/log/.file_path.log中存放的是xml文件的绝对路径:总共有21个,这里没全列出来,太多了
telfort1:/kfbuild/x144378/billing/log>cat ${BILLING_HOME}/log/.file_path.log
/kfbuild/x144378/billing/BILL/REAL_BILL/XML/00/20090508/TBM/20090508-3101000802010.xml
/kfbuild/x144378/billing/BILL/REAL_BILL/XML/00/20090508/TBM/20090508-3101000908137.xml
/kfbuild/x144378/billing/BILL/REAL_BILL/XML/01/20090508/TBM/20090508-3101000966135.xml
/kfbuild/x144378/billing/BILL/REAL_BILL/XML/02/20090508/TBM/20090508-3101000804442.xml
但是相同的shell,只是文件名不一样合并结果却是正确的
cat merge.log|xargs awk '/^<?xml/,/^]>/{
if(!a[$0]++)
if(NR==FNR) h=h "n" $0
else sub(/n]>/,"n"$0"n]>",h)
next
}
/<bill /,/</bill>/{print;next}
/^</bill_run>/{next}
NR==FNR&&!a[$0]++
END{
print "</bill_run>"
print h > t".xml"
}' t=$$ > $$ |
cat $$.xml $$ > merge.xml
文件merge.log中存放了59个xml文件,
telfort1:/kfbuild/x144378/billing/BILL/REAL_BILL/XML/00/20090508/MM>cat merge.log
20090508-3101000798010.xml
20090508-3101000804020.xml
20090508-3101000804030.xml
20090508-3101000804040.xml
20090508-3101000804050.xml
20090508-3101000804060.xml
20090508-3101000804070.xml
20090508-3101000804080.xml
请大家点拨下这是什么原因啊?第一个脚本不对是因为文件包括了路径,超出了awk能接受的参数长度了么?
[ 本帖最后由 ghostgorst 于 2009-8-28 11:16 编辑 ] |
|