除第一列之外的所有列的每两行的平均值

时间:2013-04-08 19:33:16

标签: macos awk

我有一个如下所示的数据集:

  

item1 20 30 12
  item1 10 50 17
  item2 -9 112 15
  item2 -9 100 10

实际数据集有101列。我想打印每列中连续值的平均值(第一列包含名称除外)。

所以期望的输出是

  

item1 15 40 14.5
  item2 -9 106 12.5

我从link发现我可以使用以下代码

为单个列执行此操作
awk '{sum+=$2}(NR%2)==0{print sum/2; sum=0;}'

但我无法弄清楚如何为其余列执行此操作并为平均值行打印唯一行名称(例如:item1)。我试过这样的事情:

awk '{for(i=2;i<=NF;i++) sum[i]+=$i} NR%2==0 {print sum[i]/2;sum[i]=0}'

但代码显然是不正确的,如果有人能指出我做错了什么以及如何改进它以获得预期的结果,我将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:2)

使用101列文件尝试此awk解决方案:

 awk 'n<2{for(i=2;i<=NF;i++)a[i]+=$i;n++;}
     n==2{for(i=2;i<=NF;i++)s=s sprintf("%s ",a[i]/2)
         print $1,s;s="";delete a;n=0}' file

如果您想使用NR%2进行核对,也可以这样做:

awk '{for(i=2;i<=NF;i++)a[i]+=$i}
        !(NR%2){for(i=2;i<=NF;i++)s=s sprintf("%s ",a[i]/2) 
        print $1,s;s="";delete a}' file

两个awk行与您的示例输出相同:

item1 15 40 14.5 
item2 -9 106 12.5 

注意

  • 适用于动态列数
  • 每行末尾有一个空格,我有点懒,如果它很关键,它也可以删除。

答案 1 :(得分:0)

对于动态数量的字段,从第2行开始连续的行对:

$ awk 'NR>1{for(i=2;i<=NF;i++)a[i]+=$i;if(NR%2){printf "%s ",n$1;n="\n";for(i=2;i<=NF;i++)printf "%s ",a[i]/2;delete a}}' file
item1 15 40 14.5 
item2 -9 106 12.5