Chinaunix

标题: 有没有高手帮我看下怎么写这个Shell ~ [打印本页]

作者: icooci    时间: 2012-01-14 20:19
标题: 有没有高手帮我看下怎么写这个Shell ~
本帖最后由 icooci 于 2012-01-14 20:23 编辑

有这么一个文件 # cat pay.txt 得到以下内容:
in          Bill
out        Helen
in          Helen
in          Lisa
out        Bill
in          Helen       
in          Lisa
out        Bill       
out        Lisa
in          Bill
out        Helen
in          Helen
in          Lisa
out        Bill
in          Helen
...
..

想要用Shell统计出每个人名的in、out和总共出现的次数,采用多列显示,类似这样:
             in        out        total
Bill            2        3        5
Helen        4        2        6
Lisa          3        1        4

不知是否可以实现,我用cat pay.txt|awk {'print $2'}|sort|uniq -c|sort -n
只能统计出每个人名总共出现的次数,郁闷不已 ,望高手指点一二。。


作者: blackold    时间: 2012-01-14 20:54
回复 1# icooci


用    awk  的关联数组就可以了。
作者: zooyo    时间: 2012-01-14 21:17
提示: 作者被禁止或删除 内容自动屏蔽
作者: icooci    时间: 2012-01-14 22:00
zooyo 发表于 2012-01-14 21:17
非常感谢  复制下来研究了  
作者: jiejie455    时间: 2012-01-15 00:10
awk 'BEGIN{print "\tin\tout\ttotal"}{a[$1$2]++;total[$2]++}END{for(i in total){print i"\t"a["in"i]"\t"a["out"i]"\t"total[i]}}' data

作者: lastfile    时间: 2012-01-15 00:40
原来可以这样用awk ,我都去实验下
作者: kingwolf520    时间: 2012-01-15 10:51
zooyo 发表于 2012-01-14 21:17



牛。我想得太傻了:搞几个变量保存起来然后相加啥的再打印。

太傻了。
作者: lhylhy38    时间: 2012-01-16 12:43
各种大神的shell 啊 mark学习一下。。。
作者: rdcwayx    时间: 2012-01-16 18:06
本帖最后由 rdcwayx 于 2012-01-16 18:07 编辑

和jiejie455的代码基本相似,有哪些不同之处呢?
  1. awk 'BEGIN{print "\tin\tout\ttotal"}
  2.      {a[$1 FS $2]++;b[$2]++}
  3.      END{for (i in b)
  4.            print i, a["in" FS i],a["out" FS i],b[i]|"sort"
  5.         }' OFS="\t" pay.txt
复制代码

作者: icooci    时间: 2012-01-16 19:47
本帖最后由 icooci 于 2012-01-16 20:32 编辑

膜拜。。   
作者: xxhacker    时间: 2012-01-17 15:33
jiejie455 发表于 2012-01-15 00:10
awk 'BEGIN{print "\tin\tout\ttotal"}{a[$1$2]++;total[$2]++}END{for(i in total){print i"\t"a["in"i]"\ ...


这样也可以,awk太强大了~~
作者: zgl642    时间: 2012-01-17 15:49
awk '{a[$2]+=1;b[$2,$1]+=1}END{print " \tin\tout\ttotal";for(i in a){print i"\t"b[i,"in"]"\t"b[i,"out"]"\t"a[i]}}' file
作者: 贪睡的小猪    时间: 2012-01-17 17:17
回复 9# rdcwayx


    应该是对名字做了排序吧。
作者: abc163635    时间: 2012-02-25 17:19
  1. awk 'BEGIN{print "\tin\tout\ttotal"}/in/{a[$2]++}/out/{b[$2]++}END{for(i in a)print i"\t"a[i]"\t"b[i]"\t"a[i]+b[i]}' file
复制代码

作者: white2010    时间: 2012-02-26 17:26
本帖最后由 white2010 于 2012-02-26 17:29 编辑
  1. awk 'BEGIN{print "in out total"}{a=$2;if(index(a,$2)){sum[$2]++;a=$2;if($1=="in"){sumin[$2]++};if($1=="out"){sumout[$2]++}}}END{for(i in sum) print sumin[i],sumout[i],sum[i],i}'
复制代码

作者: winway1988    时间: 2012-02-26 18:17
本帖最后由 winway1988 于 2012-02-26 18:28 编辑
  1. [winway@winway test]$ awk '{a[$2","$1]++;b[$2]++}END{printf("\tin\tout\ttotal\n");len=asorti(b,c);for(i=1;i<=len;i++){printf("%s\t%s\t%s\t%s\n",c[i],a[c[i]",in"],a[c[i]",out"],b[c[i]])}}' urfile
  2.         in      out     total
  3. Bill    2       3       5
  4. Helen   4       2       6
  5. Lisa    3       1       4
复制代码





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