如何使用拆分对包含未知列数的制表符分隔文件中的列进行总计?

时间:2015-03-17 12:50:53

标签: arrays perl split tsv

我有一个制表符分隔文件,如下所示:

__DATA__
0    0    1    0    1 ...
1    1    0    0    0 ...
1    0    0    0    0 ...
0    1    1    1    1 ...

列数和行数未指定。列可以是5 - 20 +。

目前,我一直在寻找文件,并按" \ t"分割线条。

下面只是所需代码的一部分,请注意,我使用strict和-w,并声明所有变量。

open(IN, "../../Desktop/$out") or die "Could not open $out";
my @sums;
while (<IN>) {
    if ($_ =~ /([[01]\t]*)/) {
        my @fields = split /\t/, $1;
        foreach my $i (0..$#fields) {
            $sums[$i] += $fields[$i];
        }
    } 
}
print join("\n", @sums), "\n";

如果你能想出一个更好的理想方法,我很乐意尝试。 当我跑步时,我想出来:

__OUTPUT__
0
1
1

当我想要的是每个列的总数时,以可打印的格式的总和加到每列的底部。我以前没有使用过split函数,所以解释如何正确使用它,并访问它产生的数组(?)数组会很棒。谢谢!

__WantedOutput__
2    2    2    1    2 ...

每列的总数。

1 个答案:

答案 0 :(得分:3)

你快到了。为了让@sums在循环中存活,你必须在它开始之前声明它。如果您希望输出在一行上,请不要使用换行符加入,但使用标签:

#!/usr/bin/perl
use warnings;
use strict;

my @sums;
while (<DATA>) {
    if (/^[01] (?: \t [01] )+ $/x) {
        my @fields = split;
        for my $i (0 .. $#fields) {
            $sums[$i] += $fields[$i];
        }
    }
}
print join("\t", @sums), "\n";

__DATA__
0   0   1   0   1
1   1   0   0   0
1   0   0   0   0
0   1   1   1   1