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

How to total the columns in a tab delimited file with unknown number of columns using split?

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

__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/, ;
        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 ...

所以每列的总数。

你快到了。要使 @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