我现在面临一个问题,即用由另一列中的值定义的滑动窗口对数字列求和。
(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/