我被困在中间,我需要帮助。
我有两个文件:
总计X:
总y:
总计z:
总计t:
文件2:
4790351 4786929 3422 0
84860 84860 0 0
206626 206626 0 0
93902 93823 79 0
现在我希望在第三个文件
中输出这样的内容 总计X:4790351 4786929 3422 0while ( not eof $tata and not eof $outfh )
{
my @vals1 = split /":"/,<$tata>;
my @vals2 = split /\s+/, <$outfh>;
my @sum = join "\t", map { $vals1,$vals2[$_]} 0 .. $#vals2;
printf $_ for @sum,"\n";
}
答案 0 :(得分:1)
$.
$.
是文件中的当前行号(第一行/pperl_programs$ cat file1.txt
Total X : Total y : Total z : Total t :
~/pperl_programs$ cat file2.txt
4790351 4786929 3422 0
84860 84860 0 0
206626 206626 0 0
93902 93823 79 0
~/pperl_programs$ cat results.txt
~/pperl_programs$ perl myprog.pl
~/pperl_programs$ cat results.txt
Total X: 4790351 4786929 3422 0
Total y: 84860 84860 0 0
Total z: 206626 206626 0 0
Total t: 93902 93823 79 0
~/pperl_programs$
等于1)。
示例运行:
use strict;
use warnings;
use 5.020;
use autodie;
use Data::Dumper;
open my $FILE1, "<", "file1.txt";
open my $FILE2, "<", "file2.txt";
open my $OUTFILE, ">", "results.txt";
chomp(my @line_prefixes = <$FILE1>);
close $FILE1;
while (my $line = <$FILE2>) {
print {$OUTFILE} "$line_prefixes[$.-1] $line";
}
close $FILE2;
close $OUTFILE;
对于您的更改文件:
~/pperl_programs$ cat file1.txt
Total X :
Total y :
Total z :
Total t :
~/pperl_programs$ cat file2.txt
4790351 4786929 3422 0
84860 84860 0 0
206626 206626 0 0
93902 93823 79 0
~/pperl_programs$ cat results.txt
~/pperl_programs$ perl 1.pl
~/pperl_programs$ cat results.txt
Total X : 4790351 4786929 3422 0
Total y : 84860 84860 0 0
Total z : 206626 206626 0 0
Total t : 93902 93823 79 0
示例输出:
use strict;
use warnings;
use 5.020;
use autodie;
use Data::Dumper;
open my $FILE1, "<", "file1.txt";
open my $FILE2, "<", "file2.txt";
open my $OUTFILE, ">", "results.txt";
while (!eof($FILE1) and !eof($FILE2) ) {
my $line_prefix = <$FILE1>;
chomp $line_prefix;
my $numbers_line = <$FILE2>;
chomp $numbers_line;
my @numbers = split /\s+/, $numbers_line;
my $fifth_column = $numbers[1] / $numbers[0];
say {$OUTFILE} "$line_prefix $numbers_line $fifth_column";
}
close $FILE1;
close $FILE2;
close $OUTFILE;
如果您的文件很大,您可能不希望将整个第一个文件读入内存。如果是这种情况,您可以逐行阅读每个文件:
{{1}}
答案 1 :(得分:0)
您的规格有一些松散的目的;例如,如果file2
中有更多行,那么file1
中的总标签会怎样?您是否希望忽略第一个输入文件中的空格?您是否希望输出文件中的空格具体如图所示? ......你真的不想要计算任何总数吗?
我推测&#34;是&#34;对大多数这些问题。我的解决方案是由第二个数据文件驱动的 - 这意味着如果有更多的总标签,那么就会有数据行,它们将被忽略。这也意味着如果file2中有更多的数据行,那么file1中就有标签,程序就会组成标签 - No Label?
。
最后,如果您想在某个时刻添加这些数字,我已经加入,但评论了sum
中的List::Util
函数。
use v5.12;
use File::Slurp;
# use File::Util qw( sum );
my $file1 = "file1.txt";
my $file2 = "file2.txt";
my $file3 = "file3.txt";
open(my $outfh, '>', $file3) or die "$file3: $!";
my @vals1 = split /\s*:\s*\n/ , read_file($file1);
my @vals2 = read_file($file2);
while (my $line = shift @vals2) {
chomp $line;
# my $total = sum split(" ", $line);
printf $outfh "%s : %s\n" , shift @vals1 // "No Label?" , $line ;
}
#
# $ cat file3.txt
Total X : 4790351 4786929 3422 0
Total y : 84860 84860 0 0
Total z : 206626 206626 0 0
Total t : 93902 93823 79 0