Problema de formatação do awk para XML

0

Existe um problema com o formato XML de saída devido ao Separador de registro (RS="\ n \ n"). O grupo de dados é separado por uma linha vazia. Qualquer sugestão seria muito útil para obter o resultado desejado.

A seguir, minha entrada está presente em input.txt

Alex e Marks300 e SubjectScience

Robin e Marks200 e SubjectChemistry

Estou tentando obter uma saída como abaixo:

<candidate>
<name>Alex</name>
<marks>Marks300</marks>
<subject>SubjectScience</subject>
</candidate>

<candidate>
<name>Robin</name>
<marks>Marks200</marks>
<subject>SubjectChemistry</subject>
</candidate>

Estou tentando usar o seguinte código, mas não está funcionando:

awk 'BEGIN{FS = "\n";RS = "\n\n";
print " "}
{ print "<candidate>" }
{ print "<name>"$1"</name>" }
{ print "<marks>"$2"</marks>" }
{ print "<subject>"$3"</subject>" }
{ print "</candidate>" }
{print " " }' input.txt > candiatefinaloutput.xml

Com o código acima, obtendo uma saída como abaixo:

<candidate> em <name>alex<\name> em <marks><\marks> em <subject><\subject>

<name>Marks300<\name> e <marks><\marks> e <subject><\subject>

<name>SubjectScience<\name> e <marks><\marks> e <subject><\subject>

<name>Robin<\name> e <marks><\marks> e <subject><\subject>

e assim por diante.

    
por alex 07.05.2015 / 06:35

3 respostas

1

Você pode tentar algo como

awk 'BEGIN{FS = "\n";RS = "\n\n";
print " "}
{ print "<candidate>" }
{ print "<name>"$1"</name>" }
{ print "<marks>"$2"</marks>" }
{ print "<subject>"$3"</subject>" }
{ print "</candidate>" }
{print " " }' input.txt > candiatefinaloutput.xml

E tem o que eu recebo:

[romeo.romeo-PC] ➤ cat 3
Alex
Marks300
SubjectScience

Robin
Marks200
SubjectChemistry
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
[2015-05-07 09:00.04]  ~/tmp
[romeo.romeo-PC] ➤ awk 'BEGIN{FS = "\n";RS = "\n\n";
print " "}
{ print "<candidate>" }
{ print "<name>"$1"</name>" }
{ print "<marks>"$2"</marks>" }
{ print "<subject>"$3"</subject>" }
{ print "</candidate>" }
{print " " }' 3

<candidate>
<name>Alex</name>
<marks>Marks300</marks>
<subject>SubjectScience</subject>
</candidate>

<candidate>
<name>Robin</name>
<marks>Marks200</marks>
<subject>SubjectChemistry </subject>
</candidate>
    
por 07.05.2015 / 06:43
0

Espero que não seja que você esteja perdendo a frase final de fechamento do awk - esperamos que seja um erro de digitação! Lembre-se também que você pode simplesmente imprimir "\ n" em vez de vários comandos de impressão separados (ou até usar um ponto-e-vírgula para separá-los).

    
por 07.05.2015 / 07:40
0

Por favor, não use o awk para análise XML. Isso é uma má ideia, porque o XML suporta coisas como alimentação de linha, recuo, quebra de linha em atributos e tags unárias - o que significa que quebra XML semanticamente idêntica quando você usa uma abordagem orientada a linha / campo / regex.

Por isso, sugiro usar uma ferramenta XML para criar seu XML - e como exemplo:

use strict;
use warnings;
use XML::Twig;

my $twig = XML::Twig->new( 'pretty_print' => 'indented_a' );
$twig->set_root( XML::Twig::Elt->new('root') );

open( my $input, "<", "input.txt" ) or die $!;

local $/ = "\n\n";

while (<$input>) {
    my ( $name, $marks, $subject ) = (m/(\w+)\nMarks(\d+)\nSubject(\w+)/s);
    my $candidate = $twig->root->insert_new_elt( 'last_child', 'candidate' );
    $candidate->insert_new_elt( 'last_child', 'name',    $name );
    $candidate->insert_new_elt( 'last_child', 'marks',   $marks );
    $candidate->insert_new_elt( 'last_child', 'subject', $subject );
}
close($input);
$twig->print;

Como resultado, você pode definir arbitrariamente seu formato de saída para algo que seja mais adequado para exibir seu conteúdo. No interesse de gerar um XML válido 'adequado', você provavelmente também deseja incluir:

$twig -> set_xml_version('1.0');
$twig -> set_encoding('utf-8'); 
    
por 20.05.2015 / 16:10

Tags