레코드 구분 기호(RS = "\n \n")로 인해 출력 XML 형식에 문제가 있습니다. 데이터 세트는 빈 줄로 구분됩니다. 어떤 제안이라도 원하는 결과를 얻는 데 매우 도움이 될 것입니다.
다음은 input.txt에 있는 내 입력입니다.
Alex
Marks300
SubjectScience
Robin
Marks200
SubjectChemistry
다음과 같은 출력을 얻으려고합니다.
<candidate>
<name>Alex</name>
<marks>Marks300</marks>
<subject>SubjectScience</subject>
</candidate>
<candidate>
<name>Robin</name>
<marks>Marks200</marks>
<subject>SubjectChemistry</subject>
</candidate>
다음 코드를 사용하려고 하는데 작동하지 않습니다.
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
위의 코드를 사용하면 다음과 같은 결과를 얻습니다.
<candidate>
<name>alex<\name>
<marks><\marks>
<subject><\subject>
<name>Marks300<\name>
<marks><\marks>
<subject><\subject>
<name>SubjectScience<\name>
<marks><\marks>
<subject><\subject>
<name>Robin<\name>
<marks><\marks>
<subject><\subject>
등.
답변1
다음과 같은 것을 시도해 볼 수 있습니다.
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
이것이 내가 얻는 것입니다:
[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>
답변2
awk의 닫는 작은따옴표를 놓치지 않으셨기를 바랍니다. 오타였기를 바랍니다! 또한 많은 개별 인쇄 명령 대신 "\n"만 인쇄할 수 있다는 점을 명심하세요(세미콜론을 사용하여 구분하는 경우도 있음).
답변3
XML 구문 분석에 awk를 사용하지 마십시오. XML은 줄 바꿈, 들여쓰기, 속성 줄 바꿈 및 단항 태그와 같은 기능을 지원하기 때문에 이는 나쁜 생각입니다. 이는 모두 줄/필드/정규식 지향 접근 방식을 사용할 때 의미상 동일한 XML이 중단된다는 의미입니다.
따라서 XML 도구를 사용하여 XML을 작성하는 것이 좋습니다. 예를 들면 다음과 같습니다.
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;
따라서 컨텐츠 표시에 가장 적합한 형식으로 출력 형식을 자유롭게 지정할 수 있습니다. "올바른" 유효한 XML을 생성하려면 다음을 포함해야 할 수도 있습니다.
$twig -> set_xml_version('1.0');
$twig -> set_encoding('utf-8');