选取6,7,8,13行,然后使用perl将它们合并为一行

时间:2015-01-15 14:14:23

标签: perl

我试图在文本文件下面的间隔15之后读取第6行,第7行,第8行和第13行。

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

请建议。

谢谢..

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

保留一系列收集的“部分”。

my @parts = ();

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

对于第6行,第7行,第8行 - 在第一行:之后添加任何内容到部件列表。

  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

答案 2 :(得分: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);