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

Picking the 6,7,8,13 line and then merging them into a single line using 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

求推荐。

谢谢..

保存收集的数组 "parts"。

my @parts = ();

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

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

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

对于第 13 行,添加整行,打印,然后清除列表。

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

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

示例:https://ideone.com/rA4Ivd

这将按照您的要求进行。它将字段存储在数组 @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

另一种方式:

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);