我有一个如下所示的数据集:
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}'
但代码显然是不正确的,如果有人能指出我做错了什么以及如何改进它以获得预期的结果,我将不胜感激。谢谢!
答案 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