Chinaunix

标题: 关于awk对每一列求和的问题,最好解释下思路,新手。。。 [打印本页]

作者: Linux9253    时间: 2015-05-23 23:08
标题: 关于awk对每一列求和的问题,最好解释下思路,新手。。。
下面是文件
  1. 20 10 2
  2. 30 20 4
  3. 40 30 5
复制代码
求结果
  1. 90 60 11
复制代码
最好解释下思路,新手。。。
作者: jason680    时间: 2015-05-23 23:36
回复 1# Linux9253

to add them together ...
s1 for $1, s2 for $2, s3 for $3

$ awk '{s1+=$1;s2+=$2;s3+=$3}END{print s1,s2,s3}' FILE
90 60 11

   
作者: Linux9253    时间: 2015-05-24 09:21
回复 2# jason680


    非常感谢你的回复、你的代码完全可以实现、但假如是很多列这样代码是不是不太简洁?有没有更简洁的代码实现?
谢谢。。。
作者: Herowinter    时间: 2015-05-24 09:36
本帖最后由 Herowinter 于 2015-05-24 09:52 编辑

回复 3# Linux9253
  1. awk '{for(i=1;i<=NF;i++)a[i]+=$i}END{s=a[1];for(i=2;i<=NF;i++)s=s" "a[i];print s}' urfile
复制代码

作者: Linux9253    时间: 2015-05-24 10:17
回复 4# Herowinter


    好强悍的代码、谢谢哈、不知能否世界下思路或者代码呢
作者: Herowinter    时间: 2015-05-24 11:03
回复 5# Linux9253

就是把楼上的代码写成对每一列进行循环处理啊,最后把所得的和拼成一个
总的输出字符串。
   
作者: jason680    时间: 2015-05-24 22:47
回复 3# Linux9253

>> ...有没有更简洁的代码实现?

$ perl -lane '{$v[$_]+=$F[$_] for(0..$#F)}END{print "@v"}' FILE
90 60 11

   
作者: lxh9090    时间: 2015-05-26 10:04
本帖最后由 lxh9090 于 2015-05-26 10:50 编辑

请问大神s=s" "a 这个代表什么意思呢 回复 4# Herowinter


   
作者: yestreenstars    时间: 2015-05-26 10:22
回复 8# lxh9090

将结果用空格相连
   
作者: Herowinter    时间: 2015-05-26 10:23
回复 8# lxh9090
初始:
s=""
a[1]=90
a[2]=60
a[3]=11

过程:
s="90"
s="90"" ""60"
s="90 60"" ""11"


   
作者: lxh9090    时间: 2015-05-26 10:54
哈哈,懂了,非常感谢你的详细回答 回复 10# Herowinter


   
作者: jason680    时间: 2015-05-26 11:05
回复 8# lxh9090

s=66, a=33
s=s a    # s="6633"  # combine "66" and "33
s=s" "a    # s="66 33"  # combine "66", " ", and "33"
s=s+a     #s=99      # mathematics add


作者: lxh9090    时间: 2015-05-26 11:09
恩,谢谢啊, 回复 12# jason680


   
作者: ch_hoho    时间: 2015-05-26 19:00
  1. awk '{for(i=1;i<=NF;i++){a[i]+=$i}}END{for(i in a){printf a[i]"  "}}'  filename
复制代码

作者: ch_hoho    时间: 2015-05-26 19:00
  1. awk '{for(i=1;i<=NF;i++){a[i]+=$i}}END{for(i in a){printf a[i]"  "}}'  filename
复制代码

作者: Windows19    时间: 2015-05-26 21:17
觉得楼主好美丽   
作者: reyleon    时间: 2015-05-29 10:27
  1. awk '{if(max<NF)max=NF}{for(i=1;i<=NF;i++)a[i]+=$i}END{for(i=1;i<=max;i++)s=length(s)?s" "a[i]:a[i];print s}' file
复制代码

作者: reyleon    时间: 2015-05-29 10:28
  1. awk '{for(i=1;i<=NF;i++)a[i]+=$i}END{for(i=1;i<=length(a);i++)s=length(s)?s" "a[i]:a[i];print s}' file
复制代码





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