可以在每次awk迭代中修改动作吗?请

时间:2014-02-21 08:53:00

标签: bash awk

我的输入文件的每一行都有格式

[IDNum FirstName LastName test1Score test2Score test3Score......]

我需要按以下格式打印测试平均值:

Test1: test1Avg  
Test2: test2Avg  
Test3: test3Avg  
.  
.  
.

我努力让测试平均值变得独一无二(并非所有第一次测试的平均值)

我正在运行这个awk语句,但它打印出来(显然为什么)test1是所有测试的平均值。

awk '{sum+=$4} END {for(i=4; i<=NF; i++) printf (Test%d %d\n", i-3, sum/NR)}' 

我需要以某种方式将$ 4增加到$ 5,依此类推每次迭代以得到我想要的东西,虽然我不确定它是否可能。

3 个答案:

答案 0 :(得分:2)

您可以使用:

awk 'NF>3 {for(i=4; i<=NF; i++) a[i]+=$i}
      END { for(i=4; i<=NF; i++) printf "Test%d %.2f\n", (i-3), (a[i]/NR)}' 

答案 1 :(得分:2)

非常有可能!

假设数字列从第4列开始并一直持续到最后一列,同时假设此处存在标题行(不清楚是否属于这种情况):

awk '
NR==1{ 
  for( i=4;i<=NF;i++) { 
    header[i] = $i 
  }; 
}
NR>1{ 
  for( i=4;i<=NF;i++) { 
    arr[i] += $i 
  }; 
}
END{ 
  print "column","avg";
  for( i=4;i<=NF;i++) { 
    print header[i],arr[i]/(NR-1) 
  };
}' data.txt

示例输入:

IDNum FirstName LastName test1Score test2Score test3Score
1     bob       jones    1          2          3
2     jill      jones    2          4          6

示例输出:

column avg
test1Score 1.5
test2Score 3
test3Score 4.5

答案 2 :(得分:2)

使用perl:

perl -lane 'if($.==1)
{
@a=@F[2..(scalar(@F)-1)] 
}
else
{
@a = map { $a[$_] + $F[$_+2] } 0..$#a;
}
END{for($i=0;$i<scalar(@a);$i++ ){print "Test".($i+1).":".$a[$i]/$.}}' your_file

经过测试Here