选择 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 = ();
}
}
这将按照您的要求进行。它将字段存储在数组 @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);
我正在尝试从下面的文本文件中读取间隔 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 = ();
}
}
这将按照您的要求进行。它将字段存储在数组 @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);