我有两个简单的 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>
其实我是用as 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}
在读取第一个文件 (f1
) 时,将所有行存储在数组a[]
中, 其索引为<id>
值(value)。 -
($2 in a) {if (f!=$2) {f=$2; print a[$2]} if (f==$2) {print}}
在读取第二个文件(f2
)时,打印 file1 中的相应行或 file2 中的行,只要它们共享id
。 .
关于xml - 如何在unix中比较和合并两个xml文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26624539/