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

  • 本文关键字:修改 迭代 awk bash awk
  • 更新时间 :
  • 英文 :


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

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

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

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

我正在努力使测试平均值是唯一的(并非所有第一个测试的平均值)

我正在运行这个尴尬的语句,但它打印出(很明显的原因)test1 在所有测试中的平均值。

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

我需要在每次迭代中以某种方式将 4 美元增加到 5 美元,依此类推才能得到我想要的东西,尽管我不确定这是否可能。

这是很有可能的!

假设数字列从第 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

使用 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

在这里测试

您可以使用:

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

相关内容

  • 没有找到相关文章

最新更新