2015-01-15 2 views
0

텍스트 파일 아래에서 15 간격 후에 6, 7, 8 및 13 번째 라인을 읽으려고합니다.6,7,8,13 라인을 선택하고 perl을 사용하여 단일 라인으로 병합

REPORT ID : XZ-12      ABC SERVICES COMPANY      RUN DATE: 08/05/2014 
PROGRAM  : XYZ       SYSTEM        PAGE: 0001 
BUSINESS DAY : 08/04/14     MONTHLY REPORT       TIME: 06:28:35 

NAME   : FUND11 
SRC NUMBER : 3978 
JOB CODE  : 80 

    ABC     DEF    RISK    AZ FUND    ASZ   ADS 
    FEE     FEE    FEE     FEE     FEE    FEE 
================== ================== ================== ================== ================== ================== 
       0.00    0.00    0.00    0.00    0.00    141.00 

DATE: 08/05/2014        

REPORT ID : XZ-12     ABC SERVICES COMPANY      RUN DATE: 08/05/2014 
PROGRAM  : XYZ       SYSTEM        PAGE: 0002 
BUSINESS DAY : 08/04/14     MONTHLY REPORT       TIME: 06:28:35 

NAME   : FUND12 
SRC NUMBER : 4027 
JOB CODE  : 82 

    ABC     DEF    RISK    AZ FUND    ASZ   ADS 
    FEE     FEE    FEE     FEE     FEE    FEE 
================== ================== ================== ================== ================== ================== 
       0.00    0.00    0.00    0.00    0.00  136.64 

DATE: 08/05/2014        

REPORT ID : XZ-12      ABC SERVICES COMPANY     RUN DATE: 08/05/2014 
PROGRAM  : XYZ       SYSTEM        PAGE: 0003 
BUSINESS DAY : 08/04/14     MONTHLY REPORT       TIME: 06:28:35 

NAME   : FUND13 
SRC NUMBER : 4193 
JOB CODE  : 90 

    ABC     DEF    RISK    AZ FUND    ASZ   ADS 
    FEE     FEE    FEE     FEE     FEE    FEE 
================== ================== ================== ================== ================== ================== 
       0.00    0.00    0.00    0.00    0.00  116.64 

DATE: 08/05/2014    

아래의 Perl 스크립트를 사용하여 시도했지만 회선 만 가져올 수있었습니다. 이제 선을 병합하고 싶습니다. 내 스크립트 :

#!/usr/bin/perl 

use strict; 
use warnings; 

my $fn = shift || "testf1"; 

open(my $fh, "<", $fn) or die "Could not open file '$fn' : $!\n"; 
while (<$fh>) 
    { 
    print ((6 == $. % 15) ? $_ : ""); 
    print ((7 == $. % 15) ? $_ : ""); 
    print ((8 == $. % 15) ? $_ : ""); 
    print ((13 == $. % 15) ? $_ : ""); 
} 
close ($fh); 

그리고 출력 아래에 있어요 :

NAME  : FUND11 
SRC NUMBER : 3978 
JOB CODE : 80 
0.00    0.00    0.00    0.00    0.00  141.00 
NAME  : FUND12 
SRC NUMBER : 4027 
JOB CODE : 82 
0.00    0.00    0.00    0.00    0.00  136.64 
NAME  : XYZ12 
SRC NUMBER : 4193 
JOB CODE : 90 
0.00    0.00    0.00    0.00    0.00  116.64 

하지만 출력으로 사용할 :

FUND11  3978  80  0.00    0.00    0.00    0.00    0.00  141.00 
FUND12  4027  82  0.00    0.00    0.00    0.00    0.00  136.64 
FUND13  4193  90  0.00    0.00    0.00    0.00    0.00  116.64 

제안하십시오.

감사합니다 ..

+1

이 보이는, 당신은 그냥 당신이 원하는 방식으로 포맷해야합니다. –

답변

5

당신이 요청으로이 할 것입니다. 필드를 배열 @output에 저장하고 각 블록의 13 행에 내용을 인쇄합니다.

use strict; 
use warnings; 

my $fn = shift || 'testf1'; 

open my $fh, '<', $fn or die "Could not open file '$fn': $!"; 

my @output; 

while (<$fh>) { 

    my $offset = $. % 15; 

    if ($offset >= 6 and $offset <= 8) { 
    s/.*://; 
    push @output, split; 
    } 
    elsif ($offset == 13) { 
    push @output, split; 
    print "@output\n"; 
    @output =(); 
    } 
} 

출력

FUND11 3978 80 0.00 0.00 0.00 0.00 0.00 141.00 
FUND12 4027 82 0.00 0.00 0.00 0.00 0.00 136.64 
FUND13 4193 90 0.00 0.00 0.00 0.00 0.00 116.64 
0

수집 된 "부품"의 배열을 유지하십시오. 6, 7, 8 라인의 경우

my @parts =(); 

while (<$fh>) 
{ 
    my $lno = $. % 15; 

는 - 부품 목록에 첫 번째 : 후 아무것도를 추가합니다.

if (($lno >= 6) && ($lno <= 8)) 
    { 
    /^.+?\:\s+(.+)/; 
    push @parts, $1; 
    } 

13 번째 줄에는 전체 줄을 추가하고 인쇄 한 다음 목록을 지 웁니다.

elsif ($lno == 13) 
    { 
    chomp; 
    push @parts, $_; 

    print join("\t", @parts) . "\n"; 
    @parts =(); 
    } 
} 

예 : https://ideone.com/rA4Ivd

0

또 다른 방법 : 당신은 당신이 원하는 모든 데이터를 가지고있는 것처럼

use strict; 
use warnings; 

my $fn = shift || "testf1"; 

open(my $fh, "<", $fn) or die "Could not open file '$fn' : $!\n"; 
$/ = "\nREPORT ID : "; 
while (my $report = <$fh>) { 
    printf "%-11s %-11s %-7s %s\n", $report =~ /^NAME +: (.*)\nSRC NUMBER +: (.*)\nJOB CODE +: (.*)\n.*\n.*\n.*\n.*\n +(.*\S)/m; 
} 
close ($fh); 
관련 문제