如何使用拆分对列数未知的制表符分隔文件中的列进行总计?
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
我有一个制表符分隔的文件,如下所示:
__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