Chinaunix

标题: awk文件每一行所有列数据求和 [打印本页]

作者: pdzcowboy    时间: 2014-02-25 11:23
标题: awk文件每一行所有列数据求和
我的文件内容如下:
cat myfile
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5

如果列不多的话,我求和写法如下:
cat myfile |awk '{sum=$1+$2+$3+$4+$5;print $0,sum}'
1 2 3 4 5 15
1 2 3 4 5 15
1 2 3 4 5 15
1 2 3 4 5 15
1 2 3 4 5 15

如果列很多的话,我想引进循环来求和,但貌似每个记录的SUM一直在累加,我想请问一下怎么改才可以得到上面一样的结果(每一行单独一个求和)?谢谢了
cat myfile|awk '{for(i=1;i<=NF;i++)sum+=$i;print $0,sum}'
1 2 3 4 5 15
1 2 3 4 5 30
1 2 3 4 5 45
1 2 3 4 5 60
1 2 3 4 5 75
作者: runintostar    时间: 2014-02-25 11:26
回复 1# pdzcowboy
把sum清掉就是了
  1. cat myfile|awk '{sum=0;for(i=1;i<=NF;i++)sum+=$i;print $0,sum}'
复制代码

作者: pdzcowboy    时间: 2014-02-25 11:30
谢谢了回复 2# runintostar


   
作者: yestreenstars    时间: 2014-02-25 11:33
  1. awk '{for(i=0;i++<NF;)a[NR]+=$i;print $0,a[NR]}'
复制代码
or
  1. awk '{for(i=0;i++<NF;)sum+=$i;print $0,sum;sum=0}'
复制代码

作者: pdzcowboy    时间: 2014-02-25 11:37
谢谢了,但我求出的平均值怎么没有小数点了,全是整数了回复 4# yestreenstars


   
作者: 这个冬天不冷    时间: 2014-02-25 11:49
回复 5# pdzcowboy

可以换成 printf(); 格式化打印,不要用print


   
作者: Herowinter    时间: 2014-02-25 11:58
回复 5# pdzcowboy
平均值是3,没小数位的,想要指定小数位,
可以用printf,大概这样的。
  1. awk '{for(i=0;i++<NF;)sum+=$i;printf "%s\t%d\t%.2f\n",$0,sum,sum/NF;sum=0}' myfile
  2. 1 2 3 4 5        15        3.00
  3. 1 2 3 4 5        15        3.00
  4. 1 2 3 4 5        15        3.00
  5. 1 2 3 4 5        15        3.00
  6. 1 2 3 4 5        15        3.00
复制代码

作者: yestreenstars    时间: 2014-02-25 12:02
回复 5# pdzcowboy

把你写的脚本贴出来看看~
   
作者: polyahu    时间: 2014-02-25 12:49
  1. cat input | perl -lane '{foreach(@F){$sum+=$_}print $sum;}'
复制代码

作者: pdzcowboy    时间: 2014-02-25 14:18
  1. cat myfile|awk '{for(i=1;i<=NF;i++)sum+=$i;print $0,sum/NF;sum=0}'
  2. 162616.534758647 136543.71100776 112965.741246305 137375
  3. 85181.9193508478 204094.759382577 171434.344233055 153570
  4. 128583.994276291 141911.700271563 126981.817796069 132493
  5. 171259.827021216 206842.518859144 188080.600873984 188728
复制代码

最后一列得到的平均值取整了回复 8# yestreenstars



   
作者: jason680    时间: 2014-02-25 14:42
回复 10# pdzcowboy

print %s, sum/NF
chang to
printf("%s %f\n",$0,sum/NF)
   
作者: Herowinter    时间: 2014-02-25 14:44
回复 10# pdzcowboy

改成这样
  1. cat myfile|awk '{for(i=1;i<=NF;i++)sum+=$i;printf "%s\t%f\n",$0,sum/NF;sum=0}'
  2. 162616.534758647 136543.71100776 112965.741246305         137375.329004
  3. 85181.9193508478 204094.759382577 171434.344233055         153570.340989
  4. 128583.994276291 141911.700271563 126981.817796069         132492.504115
  5. 171259.827021216 206842.518859144 188080.600873984         188727.648918

复制代码

作者: yaozhibing41001    时间: 2014-02-25 14:48
本帖最后由 yaozhibing41001 于 2014-02-25 14:51 编辑

回复 10# pdzcowboy
  1. # awk '{for(i=1;i<=NF;i++)sum+=$i;printf "%s  %.2f\n",$0,sum/NF;sum=0}'  file
复制代码

作者: yestreenstars    时间: 2014-02-25 15:45
回复 10# pdzcowboy
  1. awk '{for(i=0;i++<NF;)s+=$i;printf "%s %f\n",$0,s/NF;s=0}'
复制代码

作者: elu_ligao    时间: 2014-02-26 00:02
awk '{for(i=1;i<=NF;++i)a[NR]+=$i;printf "%s\t%f\n",$0,a[NR]/NF}'
作者: kernel69    时间: 2014-02-28 22:51
perl的
  1. $ cat 11
  2. 1 2 3 4 5
  3. 1 2 3 4 5
  4. 1 2 3 4 5
  5. 1 2 3 4 5
  6. 1 2 3 4 5
  7. $ perl -MList::Util=sum -lane 'print "@F ".sum @F' 11
  8. 1 2 3 4 5 15
  9. 1 2 3 4 5 15
  10. 1 2 3 4 5 15
  11. 1 2 3 4 5 15
  12. 1 2 3 4 5 15
  13. $
复制代码
回复 1# pdzcowboy


   
作者: rulebook    时间: 2014-03-03 13:40
awk '{s="";for(i=1;i<=NF;i++){s=s+$i};print $0,s}' o




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2