Perl 如果第一列在1到10000范围内,我想添加第二列和第三列
这是选项卡分离的示例文件Perl 如果第一列在1到10000范围内,我想添加第二列和第三列,perl,Perl,这是选项卡分离的示例文件 2000 46 26 3000 52 25 5149 4 3 10000 104 32 10500 20 12 13397 0 3 20000 20 12 24489 8 0 我用我的Perl代码尝试了一下,这在一个条件下可以正常工作,但当条件增加到10001到20000,30001到40000等等,直到文件结束时,我无法执行同样的操作 我希望输出为:- 1 10000 102 54
2000 46 26
3000 52 25
5149 4 3
10000 104 32
10500 20 12
13397 0 3
20000 20 12
24489 8 0
我用我的Perl代码尝试了一下,这在一个条件下可以正常工作,但当条件增加到10001到20000,30001到40000等等,直到文件结束时,我无法执行同样的操作
我希望输出为:-
1 10000 102 54
10001 20000 124 47
20001 30000 28 12 so on.....
#! /usr/bin/perl
my $file = "$ARGV[0]";
open (f, $file);
@f = <f>;
foreach $F1 (@f) {
($a, $b, $c) = split(/\t/, $F1);
$x = "1";
$y = "10000" ;
if ( ( $a > $x ) && ( $a <= $y ) ) {
$total += $b ;
$total_1 += $c;
}
#$x = $y;
#$y = $y*2;
}
print "$x\t$y\t$total\t$total_1\n" ;
1 10000 102 54
10001 20000 124 47
20001 30000 28 12等等。。。。。
#! /usr/bin/perl
my$file=“$ARGV[0]”;
打开(f$文件);
@f=;
foreach$F1(@f){
($a,$b,$c)=拆分(/\t/,$F1);
$x=“1”;
$y=“10000”;
如果($a>$x)&($a从简单的案例开始,然后尝试在这个案例的基础上进行构建,那么实际上你让事情变得比需要的更难。这是一个看到更大的图景有助于简化代码的示例
您正在将数据拆分为“bucket”——使用第一列确定记录应该进入哪个bucket,然后对bucket中的第二列和第三列求和
我会这样写
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
# Store bucket totals here
my @totals;
# Read from STDIN
while (<>) {
# Skip blank lines
next unless /\S/;
# Split the data on white space
my @cols = split;
# Calculate the bucket.
# 1 - 10,000 is bucket 0
# 10,001 - 20,000 is bucket 1
# etc...
my $bucket = int($cols[0] / 10_000);
# Each element in @totals is a two-element array.
# The first element is the sum of column two.
# The second element is the sum of column three
$totals[$bucket][0] += $cols[1];
$totals[$bucket][1] += $cols[2];
}
# Walk the @totals array and display the results.
for (0 .. $#totals) {
my $start = ($_ * 10_000) + 1;
my $end = ($_ + 1) * 10_000;
say "$start $end $totals[$_][0] $totals[$_][1]";
}
我得到的结果是:
1 10000 102 54
10001 10001 124 47
20001 10002 28 12
在我看来,这是正确的。如果您有任何问题,请告诉我。您显示的代码似乎有效。请显示不起作用的程序。请添加您期望的输出。目前还不清楚您所说的“当条件增加到10001到20000和30001到40000等时,我无法执行相同操作”是什么意思.@DaveCross我编辑了我的问题。很抱歉反应太晚。@Borodin是的,此代码正在工作,但它不在循环中工作…我有大量数据,所以我想在10000个窗口中添加所有内容。很抱歉反应太晚。我是此论坛的新手。很抱歉给您带来不便。:)是的,它工作得很好。非常感谢。它对我很有帮助,因为在它之前,我是用awk命令完成的。
1 10000 102 54
10001 10001 124 47
20001 10002 28 12