배열을 추출한 다음 해당 일치 항목을 추출합니다.

배열을 추출한 다음 해당 일치 항목을 추출합니다.

저는 Perl을 처음 접했습니다. 배열을 추출하여 아래 열에 인쇄해야 합니다. 까다로운 부분은 각 단어가 서로 다른 소리 유형(P 또는 S로 지정)을 갖고 있고 각 유형이 해당 소리 및 음절 모양과 연관되어 있다는 것입니다.

array[]를 사용하여 추출해 보았지만 코드가 꽤 깁니다. 이것을 인코딩하는 더 효율적인 방법이 있습니까?

입력(데이터는 celex corpus에 있음). 다음은 수천 줄에 대한 예입니다.

31259\open\635\3\P\5-p@n\[VV][CVC]\[@U][p@n]\P\5-pH\[VV][CS]\[@U][pn,]\S\5-pF\[VV][CS]\[@U][pm,]
........
........

  내 출력은 다음과 같아야 합니다.

WordForm   Frequency    Type      Pronunciation SyllableShape 

open         635       P.          [@U] [p@n]      [VV] [CVC]

open         635       P.          [@U] [pn,]          [VV] [CS] 

open         635       S           [@U] [pm,]          [VV] [CS] 

...

...

답변1

.그 뒤에 가 있는지 확인하는 방법을 모르지만 P이것이 4개의 요소 그룹과 5개의 요소 헤더라고 가정하면 awk솔루션은 어떻습니까?

awk -F '\' 'BEGIN{ print "WordForm Frequency Type Pronunciation Syllableshape"}{
     for (i=5;i<=NF;i+=4) print $2, $3, $i, $(i+3), $(i+2)
}' file | column -t

산출

WordForm  Frequency  Type  Pronunciation  Syllableshape
open      635        P     [@U][p@n]      [VV][CVC]
open      635        P     [@U][pn,]      [VV][CS]
open      635        S     [@U][pm,]      [VV][CS]

편집하다

아래 게시물에 따라, 그리고 단지 재미를 위해(어제 밤 이전에는 스크립팅 목적을 고려한 적이 없었기 때문에 ) 작동하는 것처럼 보이는 스크립트에 perl위의 루프를 입력했습니다 . perl아래 내용은 아무런 지식도 없이 처음부터 짜맞추어 만든 것이기 때문에 오류가 많을 것이라 확신합니다. 따라서 이것이 정말 나쁜 코딩이라면 논평하거나 비판하지 말고 교육을 위해 올바른 방법을 게시하십시오.

#!/bin/perl

open(my $filehandle, '<', './file')
    or die "Unable to open file, $!";
    print "WordForm  Frequency  Type  Pronunciation  Syllableshape\n";
    while (<$filehandle>) { 
        chomp($_);
        @c = split (/\\/, $_);
        for ($i=4;$i<=(@c-4);$i+=4) {
            print "@c[1] @c[2] @c[$i] @c[$i+3] @c[$i+2]\n";
        }
        print "\n";
    }
close($filehandle)
    or warn "Unable to close the file handle: $!";

답변2

Perl 스크립트를 약간 단순화했습니다. 이 "스크립트"는 를 호출하는 데 사용할 수 있습니다 perl script file.

print "WordForm Frequency  Type  Pronunciation  Syllableshape\n";
while (<>) {
        chomp;
        @c = split(/\\/);
        for ($i=4; $i<$#c; $i+=4) {
            print "$c[1] $c[2]";
            print " $c[$i] $c[$i+3] $c[$i+2]\n";
        }
}

$i<$#c;대신에 $i<@c-4;나는 "보안"에서 4를 뺀 값을 뺐습니다(기록이 깨진 경우에만 중요함).

$#c@c스칼라 값 배열, 즉 마지막 인덱스입니다.


awk()와의 유일한 차이점은 첫 번째 요소가 Perl에 있다는 i=5것입니다 .$i=4$c[0]

관련 정보