Связать соответствующие записи XML

У меня есть образец XML-файла input.xml:

<employee>
<userid>1</userid>
<name>Puneetha B M</name>
<designation>Developer</designation>
</employee>
<employee>
<userid>2</userid>
<name>Bhoomika</name>
<designation>Analyst</designation>
</employee>

Теперь мне нужно преобразовать его в следующий формат (имя выходного файла output.xmlb): Мне нужно вывести каждую запись в одну строку

<employee> <userid>1</userid> <name>Puneetha B M</name> <designation>Developer</designation> </employee>
<employee> <userid>2</userid> <name>Bhoomika</name> <designation>Analyst</designation> </employee>

Для этого преобразования автор использовал следующую команду в unix.

cat input.xml | tr -d '&' | tr '\n' ' ' | tr '\r' ' ' | sed 's|</employee>|</employee>\n|g' | grep -v '^\s*$' > output.xmlb

Кто-нибудь, пожалуйста, помогите мне понять, как работают эти команды Unix. Если вы не понимаете мой вопрос, пожалуйста, перейдите по ссылке: http://blog.puneethabm.in/load-xml-file-to-hive-without-java-code/ здесь я пытаюсь понять Шаг 1

2 ответа

Тест gawk в порядке

awk -F'<' '!a{a=$2;next}{if($0~a){print FS a,b,$0;a=b=""}else{b=b?b" "$0:$0}}' file
<employee> <userid>1</userid> <name>Puneetha B M</name> <designation>Developer</designation> </employee>
<employee> <userid>2</userid> <name>Bhoomika</name> <designation>Analyst</designation> </employee>

ИЛИ Используйте Sed

sed '/employee/{:a;N;/<\/employee>/!ba;s/\n/ /g;}' file

Использовать этот:

tr '\n' ' ' <infile | sed 's|\(</employee>\) |\1\n|g' >outfile
  • tr заменяет все символы новой строки пробелами.
  • sed добавляет новую строку после закрывающего тега сотрудника.

Выход:

<employee> <userid>1</userid> <name>Puneetha B M</name> <designation>Developer</designation> </employee>
<employee> <userid>2</userid> <name>Bhoomika</name> <designation>Analyst</designation> </employee>
Другие вопросы по тегам