将每一行中的所有数字相加,然后将它们的平均值加到行尾Bash

时间:2018-12-18 14:04:13

标签: bash

任务是:使用awk命令将每行中的所有数字相加,然后将平均值加到每行的末尾。每行不必具有相同数量的数字。示例:

Steven 1 2 3 4 5 
Mark 2 3 4 
Joe 3 5 5 6 

所以结果应该是

Steven 1 2 3 4 5 3
Mark 2 3 4 3
Joe 3 5 5 6 5

由于行的长度可以不同,所以我不太清楚如何对与awk一致的数字求和以及如何在行尾添加平均值。谢谢

3 个答案:

答案 0 :(得分:2)

awk '{ sum = 0;
       for (i = 2; i <= NF; ++i)
           sum += $i
       $(++NF) = int (sum / (NF - 1) + 0.5)
     } 1' file
  • int (sum / (NF - 1) + 0.5)将平均值四舍五入到最接近的整数,
  • 1结尾意味着在处理后打印每一行。

以上命令产生:

Steven 1 2 3 4 5 3
Mark 2 3 4 3
Joe 3 5 5 6 5

答案 1 :(得分:1)

perl在这里很好用:

perl -MList::Util=sum -MPOSIX=round -lane '
    push @F, round(sum(@F[1..$#F]) / (@F - 1)) if @F > 1;
    print "@F"
' file

答案 2 :(得分:0)

您可以尝试

awk '{ sum = 0; for (i = 2; i <= NF; ++i) {sum += $i ;}   print $0, sum/(NF-1)}' a.txt

输出为

Steven 1 2 3 4 5 3 3
Mark 2 3 4 3 3
Joe 3 5 5 7 5 5