2015-06-29 115 views
0

我无法找出每列的每6行间隔的平均值。这与我以前的帖子有关。我拥有的数据与一些像(这里是2)使用awk查找每列间隔的平均值而不考虑缺失值

input.txt 
1 3 
4 7 
30 // 
// 3 
10 3 
40 1 
// 90 
// 22 
// 11 
// // 
// // 
// // 

一列,我想用awk

awk '!/\//{sum += $1; count++} NR%6==0{print count ? (sum/count) : count;sum=count=0;}' input.txt 

上述作品第1列。所以我可以用第二列替换$ 1到$ 2。但我想用同一个命令来做。我无法做到这一点。

希望的输出:

output.txt 
17 3.4 
0 41 

17是(1 + 4 + 30 + 10 + 40)/ 5; 0是因为没有整数和所有的缺失值; 3.4是(3 + 7 + 3 + 3 + 1)/ 5; 41是(90 + 22 + 11)/ 3

+0

为什么会有'NR%6 == 0'?你想每六行输出一个? – Will

+0

[编辑]你的问题显示你上一个问题的相关内容。目前它很不清楚你在问什么,你的输入是什么,为什么这个代码不工作...... – fedorqui

+1

输出平均数是多少?因为你的问题没有什么平均值。17 – 123

回答

1

我认为你应该总结每列单独。尝试:

awk '{if($1!="//"){sum1+=$1;count1++;}; if($2!="//"){sum2+=$2;count2++;}}NR%6==0{print count1 ? sum1/count1:0, count2 ? sum2/count2:0;sum1=sum2=count1=count2=0;}' input.txt 

[更新:]

如果有两个以上的colums来计算,你可以使用一个数组,每一次遍历所有科拉姆。

awk '{ 
    for(i=1;i<=NF;++i){ 
     if($i!="//"){ 
      sum[i]+=$i; 
      count[i]++ 
     } 
    }} 
    NR%6==0{ 
    for(i in sum) 
    { 
     avg=count[i]?sum[i]/count[i]:0; 
     printf("%.2f ",avg); 
     sum[i]=0; 
     count[i]=0 
    } 
    printf("\n") 
}' 
input.txt 
+0

如果列数很多,你能建议,怎么做? – Kay

+0

@Kayan我已经更新了我的答案,并向您展示了循环每个柱子的方式。希望能帮助你。 – Will

+1

顺便说一句,将if($ i!=“//”)替换为if($ i〜/([0-9])+ /)更健壮。 – Will