平均每两行的所有列的第一个除外
问题描述:
我有一个数据集,看起来像这样:平均每两行的所有列的第一个除外
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;}'
但我无法弄清楚如何做到这一点的其余列和原理t为平均值行的唯一行名(例如:item1)。我想是这样的:
awk '{for(i=2;i<=NF;i++) sum[i]+=$i} NR%2==0 {print sum[i]/2;sum[i]=0}'
但代码显然是不正确,我将不胜感激,如果任何人都可以指出我在做什么错误以及如何改进它得到预期result.Thanks!
答
总和线连续对开始在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
答
尝试用你的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
注
- 作品列的动态数
- 没有在每一行的后面加上一个空格,我上有点懒,如果它是至关重要的,它也可以删除。
你知道'NR%2'是一个模运算符,它表示每2行都有一个操作吗?你想在awk的'END {....}'中执行那个(用模测试)。块。多看一些其他的例子会让你在那里。祝你好运。 – shellter 2013-04-08 19:37:33