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