awk列中所选值的总和

时间:2018-07-02 15:23:30

标签: linux awk

我想对awk列中的选定值求和。第二列是时间。我想每秒添加4th列中的值。

输入:

1 0.1 2 1 3
2 0.3 2 2 3
4 0.6 2 3 3
2 1.1 2 4 3
5 1.3 2 5 3
6 2.2 2 6 3
7 2.7 2 7 3
8 3.6 2 8 3
9 3.9 2 1 3
10 4.1 2 1 3

预期的输出(我们有5秒):

6
9
13
9
1

编辑:

这是我的code,但我不知道它如何动态运行。

awk '$2>x && $2<=y (sum+=$4) END {print sum}' filename

其中x-开始时间,y-结束时间。它仅适用于静态值,这意味着现在我只能在选定的一秒内获得结果。

2 个答案:

答案 0 :(得分:2)

尝试以下awk程序

BEGIN {
    total = 0
    secondEnd = 1
}
{
    if($2 < secondEnd) {
        total += $4
        next
    }

    while($2 > secondEnd) {
        print(total)
        total = 0
        secondEnd++
    }
    total = $4
}
END {
    print(total)
}

答案 1 :(得分:1)

编辑: :根据OP的要求,添加了一个代码,该代码将接受作为awk变量提供给它的任何字段。

awk -v col1="2"  -F"[ .]" '$col1 == prev+1{print sum;sum=prev=""} {sum+=$NF;prev=$col1} END{if(prev && sum){print sum}}' Input_file

OR(此处为非衬线形式的解决方案)

awk -v col1="2"  -F"[ .]" '
$col1 == prev+1{
  print sum;
  sum=prev=""
}
{
  sum+=$NF;
  prev=$col1
}
END{
  if(prev && sum){
    print sum}
}'  Input_file

如果您要将bash变量传递给awk变量,请执行以下操作。

column=2 ##Shell variable
awk -v col1="$column"  -F"[ .]" '$col1 == prev+1{print sum;sum=prev=""} {sum+=$NF;prev=$col1} END{if(prev && sum){print sum}}' Input_file

请尝试以下操作,并告诉我是否有帮助(请考虑您实际的Input_file与此处显示的示例相同)。

awk -F"[ .]" '$2 == prev+1{print sum;sum=prev=""} {sum+=$NF;prev=$2} END{if(prev && sum){print sum}}'  Input_file

现在也添加一种非衬套形式的解决方案。

awk -F"[ .]" '
$2 == prev+1{
  print sum;
  sum=prev=""
}
{
  sum+=$NF;
  prev=$2
}
END{
  if(prev && sum){
    print sum}
}'  Input_file