我试图在文本文件下面的间隔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
请建议。
谢谢..
答案 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 = ();
}
}
答案 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);