2

У меня есть 2 XML-файла. Во 2-м файле есть несколько новых записей, включая те же записи, что и в 1-м файле. Примеры 2 файлов приведены ниже.

Файл 1

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

Файл 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>

После слияния

<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>

Когда я объединяю 2-й файл с 1-м файлом, слияние должно происходить таким образом, что должны быть объединены только новые записи во 2-м файле, т. Е. Уже существующие записи в 1-м файле должны оставаться без изменений. Есть команда sdiff для слияния в интерактивном режиме. Но я хочу автоматизировать процесс слияния. Как мне объединить эти файлы?

1 ответ1

0

XML-файлы могут быть и, как правило, являются сложными для работы со старыми добрыми инструментами оболочки; нужно использовать парсеры XML, ища узлы. Однако, если и только если формат ваших файлов действительно прост, как написано (разрывы строк всегда присутствуют, важные теги не вложены в другие теги и они начинают строки), то это можно сделать с помощью start-tag-to -конечный тег соответствия.

 $ 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>

Порядок файлов в командной строке важен.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .