使用perl

时间:2016-04-10 08:44:47

标签: perl parsing

我被困在中间,我需要帮助。

我有两个文件:

  • 文件1:

总计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 0
   总计y:84860 84860 0 0
   总计z:206626 206626 0 0
   总计t:93902 93823 79 0

这是我下面的代码尝试解析:请帮我获取所需的输出

while ( 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";

   }

2 个答案:

答案 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