Как разделить файл журнала с 4-мя xml-узлами на 4 файла с помощью Bash? - PullRequest
0 голосов
/ 26 сентября 2019

Мне нужно разделить файл XML с 4 узлами на 4 файла.Имея такой файл:

sddskjdsfds
asdadsa
20:15:12 st: <aRoot>
   <aNode>v</aNode>
   <otherNode a="2"/>
</aRoot>
kjfsdfj
20:15:59 r: <otherRoot>
   <bNode>h</bNode>
</otherRoot>
sddskjdsfds
asdadsa
22:31:32 st: <aRoot>
   <aNode>a</aNode>
   <otherNode a="1"/>
</aRoot>
kjfsdfj
22:31:39 r: <otherRoot>
   <bNode>o</bNode>
</otherRoot>
other-random-lines

Мне нужно разбить его на 4 файла: *aRoot_1.xml, aRoot_2.xml, otherRoot_1.xml, otherRoot_2.xml.

Пока что яВы достигли:

awk '/st:/,/<\/aRoot>/' file.txt > all_aRoots.txt

И аналогичный подход для <otherRoot>: еще один вызов awk, запись в all_otherRoots.txt и т. д.

Но это сохраняет все символы до </aroot>, и в результате все <aRoot> находятся в outputfile.

Как разделить файл журнала с 4-мя узлами xml на 4 файла, используя Bash? ОБНОВЛЕНИЕ # 1 : Обратите внимание, строки не-xml должны быть исключены, и, если возможно, из строк с XML, начинающихся с текста не-xml, должна сохраняться только часть XML

ОБНОВЛЕНИЕ № 2 : Пример выходного файла из ответа RavinderSingh13:

sddskjdsfds
asdadsa
20:15:12 st: <aRoot>
   <aNode>v</aNode>
   <otherNode a="2"/>

1 Ответ

0 голосов
/ 26 сентября 2019

Не могли бы вы попробовать следующее.

awk -F"[><]" '
/^<\//{
  out_file=ind"_"array[ind]".xml"
  print val > (out_file)
  close(out_file)
  val=ind=""
}
/^[0-9][0-9]:[0-9][0-9]:[0-9][0-9]/{
  ind=$(NF-1)
  array[$(NF-1)]++
}
{
  val=(val?val ORS:"")$0
}
'  Input_file


РЕДАКТИРОВАТЬ: Добавление кода для удаления начальных нежелательных строк с помощью OP.

awk -F"[><]" '
/^<\//{
  out_file=ind"_"array[ind]".xml"
  flag=1
  if(val){
    print val > (out_file)
  }
  close(out_file)
  val=ind=""
}
/^[0-9][0-9]:[0-9][0-9]:[0-9][0-9]/{
  ind=$(NF-1)
  array[$(NF-1)]++
}
flag{
  val=(val?val ORS:"")$0
}
'  Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...