聚合具有指定粒度的行

时间:2013-11-26 20:37:38

标签: shell unix awk

输入:

11 1
12 2
13 3
21 1
24 2
33 1
50 1

假设第1列指定 index 。我想减少我的数据大小如下:

根据索引,我将第二列的值与粒度为10的值相加。一个例子:

首先,我考虑指数范围为0-9。该范围内没有任何指数,因此总和等于0.接下来我转到下一个范围10-19。有3个指数(11,12,13)符合范围。我对第二列的值求和,它等于1 + 2 + 3 = 6。等等...

理想的输出:

0 0
10 6
20 3
30 1
40 0
50 1

这就是我的成就:

M=0;
awk 'FNR==NR
{
if ($1 < 10)
 { A[$1]+=$2;next }
else if($1 < $M+10)
 { 
  A[$M]+=$2;
  next
 }
else
 { $M=$M+10;
   A[$M]+=2;
   next
 }
 }END{for(i in A){print i" "A[i]}}' input_file

很抱歉,但我对AWK并不擅长。

经过一些改变:

awk 'FNR==NR {
    M=10;
    if ($1 < 10){
        A[$1]+=$2;next
    } else if($1 < M+10) { 
        A[M]+=$2;   
        next
    } else { 
        M=sprintf("%d",$1/10); 
        M=M*10;  
        A[M]+=$2;
        next
    }
}END{for(i in A){print i" "A[i]}}' input

1 个答案:

答案 0 :(得分:0)

这是GNU

{
   ind=int($1/10)*10
   if (mxi<ind) mxi=ind
   a[ind]++
}
END {
   for (i=0; i<=mxi; i+=10) {
      s=(a[i]*(a[i]+1))/2
      print i " " s
   }
}