[英]how to compare and merge two xml files in unix
我有两个简单的XML文件,并寻找一种比较和合并的简单方法。
文件1 :将具有这样的结构
<lab><id>101</id><name>AAA</name></lab>
<lab><id>102</id><name>AAC</name></lab>
<lab><id>105</id><name>AAB</name></lab>
<lab><id>104</id><name>CCC</name></lab>
文件2 :将具有这样的结构
<drugs><id>101</id><test>bun</test><results>20.45</results></drugs>
<drugs><id>101</id><test>wbc</test><results>20.45</results></drugs>
<drugs><id>101</id><test>rbc</test><results>20.45</results></drugs>
<drugs><id>103</id><test>bun</test><results>20.45</results></drugs>
<drugs><id>103</id><test>crea</test><results>20.45</results></drugs>
<drugs><id>103</id><test>rdw</test><results>20.45</results></drugs>
我想要一个看起来像这样的输出文件
<lab><id>101</id><name>AAA</name></lab>
<drugs><id>101</id><test>bun</test><results>20.45</results></drugs>
<drugs><id>101</id><test>wbc</test><results>20.45</results></drugs>
<drugs><id>101</id><test>rbc</test><results>20.45</results></drugs>
实际上,我使用id
作为比较:
while read line
do
for i in `echo $line | sed -e 's%.*<id>\(.*\)</id>.*%\1%p'`
do
if grep -q "$i" file2.xml ; then
echo $line >> file3.xml
grep -i "$i" file2.xml >> file3.xml
sed -i "/$i/d" file2.xml
fi
break
done
done < file1.xml
我工作但是当线数很大时它很慢。 我需要一个更好的方法来做到这一点。
假设您要打印所有那些<id>
在两个文件中的行,这个awk
脚本会使它成为:
awk -v FS="<id>|</id>" 'FNR==NR {a[$2]=$0; next} ($2 in a) {if (f!=$2) {f=$2; print a[$2]} if (f==$2) {print}}' f1 f2
对于您的示例输入,它返回:
<lab><id>101</id><name>AAA</name></lab>
<drugs><id>101</id><test>bun</test><results>20.45</results></drugs>
<drugs><id>101</id><test>wbc</test><results>20.45</results></drugs>
<drugs><id>101</id><test>rbc</test><results>20.45</results></drugs>
-v FS="<id>|</id>"
将字段分隔符设置为<id>
或</id>
。 这样,我们可以轻松找到id
。 FNR==NR {a[$2]=$0; next}
FNR==NR {a[$2]=$0; next}
而读取所述第一文件( f1
),存储在数组中的所有行a[]
其索引为的<id>
值。 ($2 in a) {if (f!=$2) {f=$2; print a[$2]} if (f==$2) {print}}
在读取第二个文件( f2
)时打印($2 in a) {if (f!=$2) {f=$2; print a[$2]} if (f==$2) {print}}
,打印file1中的相应行或file2中的行,只要它们共享id
。 要从命令行操作XML,您可以使用XMLStarlet ,它允许您通过XPath查询查询文档,该查询对XML输出格式具有弹性(即,在漂亮打印时它仍然可以工作)。
您要使用的命令是xml sel
,如:
xml sel -t -v "/lab/id" -v "/drugs/id" file1.xml file2.xml
我不是那个曾经用过那个漂亮的小工具的超级用户,但值得指点一下。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.