linux - 使用由另一列中的值定义的滑动窗口对数字列求和

标签 linux perl unix awk

我现在面临一个问题,即用由另一列中的值定义的滑动窗口对数字列求和。

(1) 我的数据以制表符分隔,有两个数字列:

1000 12
2000 10
3000 9
5000 3
9000 5
10000 90
30000 20
31000 32
39000 33
40000 28

(2) 我想将第 2 列与第 1 列定义的窗口相加,窗口大小为(第 1 列 + 3000)。这意味着我需要添加第 3 列(第 3 列 = 总和(第 1 列行中第 2 列的所有值到第 1 列 +3000))。

看起来像这样:

1000 12 12+10+9
2000 10 10+9+3
3000 9 9
5000 3 3
9000 5 5+90
10000 90 90
30000 20 20+32
31000 32 32
39000 33 33
40000 28

(3) 我是编程新手。我尝试了 awk,但失败了。

我不知道如何控制第一列的窗口

awk '(i = 1; i <= NR; i++) { sum[i]+=$2 } END {print $1,$2,sum}' mydata

谁能就这个问题给我任何建议/指导?提前致谢。

最好的,

最佳答案

我不太擅长 awk,但这里有一些我用 perl 编写的东西,如果你在 unix 系统上,它也应该可以运行。假设您将其保存为名为 window.pl 的文件:

#!/usr/bin/perl -w
use strict;

# Usage: window.pl < [filepath or text stream]
# Example: window.pl < window.txt

my $window = 3000;
my @lines = <STDIN>;
my $i = 0;
my $last_line = $#lines;

# Start reading each line
while ($i<= $last_line)
{
    my $current_line = $lines[$i];
    my ($col1, $col2) = ( $current_line =~ /(\d+)\s+(\d+)/ );
    my $ubound = $col1 + $window;
    my @sums = $col2;
    my $lookahead = $i + 1;

    # Start looking at subsequent lines within the window
    while ($lookahead <= $last_line)
    {
        my $next_line = $lines[$lookahead];
        my ($c1, $c2) = ( $next_line =~ /(\d+)\s+(\d+)/ );
        if ($c1 <= $ubound)
        {
            push @sums, $c2;
            ++$lookahead;
        }
        else
        {
            last;
        }
    }

    my $output;
    if ( $#sums > 0 )
    {
        my $sum = join "+", @sums;
        $output = "$col1 $sum\n";
    }
    else
    {
        $output = "$col1 $col2\n";
    }
    print $output;
    ++$i;
}

输出:

1000 12+10+9
2000 10+9+3
3000 9+3
5000 3
9000 5+90
10000 90
30000 20+32
31000 32
39000 33+28
40000 28

这仅在输入文件小到足以读入内存时有效,但也许这无论如何都会对您有所帮助。

祝你好运!

关于linux - 使用由另一列中的值定义的滑动窗口对数字列求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6630987/

相关文章:

linux解压不包括文件夹和下面的所有内容

perl - 有什么好的 Perl 自动化测试套件吗?

node.js - 通过脚本下载具有特定 Div 的图像

linux - Bash 脚本正则表达式

macos - 如何比较 (os x) bash 脚本中的 2 个(图像)文件,忽略最后更改/修改的日期 header ?

c - 在重启的情况下保留共享内存数据?

linux - 即使 nm 指示此符号存在于共享库中,也未定义对符号的引用

linux - Accept() 不会阻止程序执行

perl - 如何使用 perl 转换 base64 编码的文件?

linux - 如何删除下划线之前和包括下划线的字符?