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

问题描述:

我有一个数据集,看起来像这样:平均每两行的所有列的第一个除外

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!

+0

你知道'NR%2'是一个模运算符,它表示每2行都有一个操作吗?你想在awk的'END {....}'中执行那个(用模测试)。块。多看一些其他的例子会让你在那里。祝你好运。 – shellter 2013-04-08 19:37:33

总和线连续对开始在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 
+0

谢谢,但我的实际数据集有101列,所以我想写代码来处理每个列与for语句 - 你能告诉我我该怎么做?再次感谢 – psaima 2013-04-08 19:54:38

+0

我最初读为101行而不是列,**见编辑**! – 2013-04-08 20:08:10

+0

对不起 - 我的错!非常感谢更新的代码。 – psaima 2013-04-08 20:43:08

尝试用你的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  

  • 作品列的动态数
  • 没有在每一行的后面加上一个空格,我上有点懒,如果它是至关重要的,它也可以删除。
+0

感谢这两个解决方案 - 这些帮助我了解更多 – psaima 2013-04-08 20:52:41

+0

sprintf之前s = s的含义是什么?矢量是否存储在s中?因为如果我打印s(不含$ 1),我会得到2到NF的位置。 – 2013-05-23 08:54:45

+0

@ManuelRamón's = s连接冲刺结果(..)' – Kent 2013-05-23 08:59:40