我的输入文件的每一行都有格式
[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,依此类推每次迭代以得到我想要的东西,虽然我不确定它是否可能。
答案 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