标题可能不那么具有描述性。让我解释一下:
我有一个文件(说文件1)有一些数字 [由空格] 分隔。看到这里,
1 2 3 4 5
1 2 8 4 5 6 7
1 9 3 4 5 6 7 8
..... n lines (length of each line varies).
我有另一个文件(说文件2)有一些数字 [由标签] 分隔。看到这里,
1 1 1 1 1 1 0 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 0 1 1 1 1 1
1 1 1 1 1 1 0 1 1 1 1 1
..... m lines (length of each line fixed).
我想要文件2,第1行的1 2 3 4 5(文件1第1行)位置的总和
我想要1 2 3 4 5 6 7 th (文件1第2行) 文件2,第1行的位置等等。
我想要文件2 的行方向和文件1 中所有行的位置
它看起来像:
5 6 6 …n columns (File 1)
1 8 3
9 8 4
… m rows (File 2)
我是通过以下代码完成的:
open( FH1, "File1.txt" );
@index = <FH1>;
open( FH2, "File2.txt" );
@matrix = <FH2>;
open( OUTPUT, ">sum.txt" );
foreach $xx (@matrix) {
@k1 = split( /\t/, "$xx" );
foreach $yy (@index) {
@k2 = split( / /, "$yy" );
$ssum = 0;
foreach $zz (@k2) {
$zz1 = $zz - 1;
if ( $k1[$zz1] == 1 ) {
$ssum++;
}
}
printf OUTPUT"$ssum\t";
$ssum = 0;
}
print OUTPUT"\n";
}
close FH1;
close FH2;
close OUTPUT;
除了对大文件的时间要求是巨大的以外,它的工作原理非常好。 (例如1000行文件1 X 25000行文件2:时间 8分钟
我的数据可能超过此示例的4倍。这对我的用户来说是不可接受的。
如何实现这一目标,消耗的时间要少得多。或任何其他概念。
答案 0 :(得分:2)
始终在每个PERL脚本中包含use strict;
和use warnings;
。
您可以通过多次处理第一个文件来简化脚本。而且,你的编码风格已经过时了。您可以使用Modern Perl Book中的一些课程。
以下是您的脚本简化,以利用更现代的风格和技术。请注意,它当前从脚本内部而不是外部源加载文件数据:
use strict;
use warnings;
use autodie;
use List::Util qw(sum);
my @indexes = do {
#open my $fh, '<', "File1.txt";
open my $fh, '<', \ "1 2 3 4 5\n1 2 8 4 5 6 7\n1 9 3 4 5 6 7 8\n";
map { [map {$_ - 1} split ' '] } <$fh>
};
#open my $infh, '<', "File2.txt";
my $infh = \*DATA;
#open my $outfh, '>', "sum.txt";
my $outfh = \*STDOUT;
while (<$infh>) {
my @vals = split ' ';
print $outfh join(' ', map {sum(@vals[@$_])} @indexes), "\n";
}
__DATA__
1 1 1 1 1 1 0 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 0 1 1 1 1 1
1 1 1 1 1 1 0 1 1 1 1 1
输出:
5 6 7
5 7 8
5 6 7
5 6 7