xml - 如何在unix中比较和合并两个xml文件

标签 xml performance 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>

其实我是用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/

相关文章:

PHP 将具有多条记录的 XML 文件转换为 JSON

c++ - 如何使用 Xerces-C 从 C++ 中的 XML 文件中删除子节点?

javascript - 有没有一种运行时更有效的方法来迭代这个数组? (JavaScript)

xml - UML 到 XML 表示

Python--从一个非空的multiprocessing.Queue中获取Queue.Empty异常

c++ - 如何有效地将 STL 容器恢复到旧值

python - 如何在 python 中导入已完成进程的环境变量?

linux - 如何删除具有特定字符串的所有行,但不删除同一文件的特定部分中包含相同字符串的行

java - ProcessBuilder 不使用通配符执行命令

php - 这 2 个 XPath 查询之间的区别