Gabungkan hanya entri baru dari satu file xml ke yang lain

2

Saya punya 2 file xml. File ke-2 memiliki beberapa entri baru termasuk entri yang sama dengan file ke-1. Contoh 2 file diberikan di bawah ini.

File 1

<SERVERNAME_ONE>
        <Protocol>FTP</Protocol>
        <ServerIP>192.168.0.231</ServerIP>
</SERVERNAME_ONE>

File 2

<SERVERNAME_ONE>
        <Protocol>FTP</Protocol>
        <ServerIP>192.168.1.21</ServerIP>
</SERVERNAME_ONE>
<SERVERNAME_TWO>
        <Protocol>FTP</Protocol>
        <ServerIP>192.168.13.231</ServerIP>
</SERVERNAME_TWO>

Setelah bergabung

<SERVERNAME_ONE>
        <Protocol>FTP</Protocol>
        <ServerIP>192.168.0.231</ServerIP>
</SERVERNAME_ONE>
<SERVERNAME_TWO>
        <Protocol>FTP</Protocol>
        <ServerIP>192.168.13.231</ServerIP>
</SERVERNAME_TWO>

Ketika saya menggabungkan file ke-2 dengan file ke-1, gabungan tersebut harus terjadi sedemikian rupa sehingga hanya entri baru dalam file ke-2 yang harus digabung, yaitu, entri yang sudah ada dalam file ke-1 harus tetap seperti semula. Ada perintah sdiff untuk bergabung secara interaktif. Tetapi saya ingin mengotomatiskan proses penggabungan. Bagaimana cara saya menggabungkan file-file ini?

Mathew
sumber

Jawaban:

0

XML bisa dan biasanya rumit untuk ditangani dengan alat shell yang baik; kita harus menggunakan parser XML, mencari node. Namun, jika dan hanya jika format file Anda benar-benar sesederhana yang tertulis (jeda baris selalu ada, tag penting tidak bersarang di tag lain dan mereka memulai baris) maka itu dapat dilakukan dengan mulai-tag-to pencocokan pola akhir tag.

 $ cat mergexml.awk

FILENAME!=fn { ++fcnt; fn = FILENAME }

fcnt == 1 {
   print
   str = $0
   if ( inside ) {
      if ( str ~ "^ *</ *" tag " *> *$") {
         inside = 0
      }
   } else {
      gsub( /^ *< *| *> *$/, "", str)
      if ( str ~ /^[[:alnum:]_]+$/) {
         tag = str
         f1tags[tag] = ""
         inside = 1
      }
   }
}

fcnt == 2 {
   str = $0
   if ( inside ) {
      print
      if ( str ~ "^ *</ *" tag " *> *$") {
         inside = 0
      }
   } else {
      gsub( /^ *< *| *> *$/, "", str)
      if ( str ~ /^[[:alnum:]_]+$/) {
         tag = str
         if ( ! (tag in f1tags)) {
            inside = 1
            print
         }
      }
   }
}

$ awk -f mergexml.awk file1 file2
<SERVERNAME_ONE>
        <Protocol>FTP</Protocol>
        <ServerIP>192.168.0.231</ServerIP>
</SERVERNAME_ONE>
<SERVERNAME_TWO>
        <Protocol>FTP</Protocol>
        <ServerIP>192.168.13.231</ServerIP>
</SERVERNAME_TWO>

Urutan file dalam baris perintah penting .

Gombai Sándor
sumber
@ Sándor, ketika saya menjalankan kode di atas saya mendapatkan awk kesalahan berikut: kesalahan sintaks dekat baris 7 awk: pernyataan ilegal dekat baris 7 awk: kesalahan sintaks dekat baris 10 awk: bailing out dekat baris 10
Mathew
Saya menguji ini menggunakan gnu awk tapi saya tidak berpikir ada sesuatu di dalamnya yang nawk atau mawk tidak akan tahu. Tapi hanya untuk memastikan, Anda dapat mencobanya dengan memanggilnya seperti ini: gawk -f mergexml.awk file1 file2. Di sisi lain, jika Anda meletakkan file yang Anda coba di tempat umum, saya juga dapat memeriksa apakah ada sesuatu di dalamnya yang tidak kami harapkan.
Gombai Sándor