Chinaunix

标题: 请教awk如何同时统计 总数与不重复个数? [打印本页]

作者: errmood    时间: 2008-04-26 16:12
标题: 请教awk如何同时统计 总数与不重复个数?
样本数据如下
[root@test]# cat a.txt
13 1209188074182041
12 1209185885333940
12 1209185089989307
12 1209185891525318
12 1209185894625725
12 1209185896077843
12 1209185897013146
12 1209185911626133
12 1209185088770989
12 1209185923985593
12 1209185927800131
12 1209185928818943
12 1209185929848318
12 1209185947772651
12 1209185947700450
12 1209185971472056
12 1209185973949285
12 1209185980428567
12 1209185995006463
13 1209186004855839
13 1209186006050497
13 1209186006810081
13 1209186015589432
13 1209186018948762
13 1209186028141388
13 1209186046586400
13 1209186046820703
13 1209186053524232
13 1209186057213856
13 1209186064210214
13 1209186067414653


希望以第1列为索引,计算出重复值与汇总值

比如
12 200 160
13 230 140
也就是 "12" 一共有200个,其中不重复的有160个
13一共有230个,其中不重复的有140个。

我用awk数组仅能显示出 12有200个,如何同时统计不重复的个数呢?请教
cat a.txt|awk '{a[$1]++}END{for (i in a) print i" "a}'
作者: errmood    时间: 2008-04-26 16:28
我自己有个思路,但是不知道如何体现出来
就是先sort,然后每读一行,a[$1]数组加一,同时用变量b记录$2,看看下一行的$2是否等于b,如果相等,c[$1]++
最后打印 i, a[$1],c[$1]
可是不知道该怎么在awk里实现。。请大家指点一下
作者: cjaizss    时间: 2008-04-26 16:45

  1. awk '{a[$1]++}b[$1,$2]!=1{b[$1]++}{b[$1,$2]=1}END{for (i in a)print i,a[i],b[i]}' a.txt
复制代码

作者: errmood    时间: 2008-04-26 16:55
谢谢楼上的大侠!
功能实现了,但没看明白 。。。
作者: cjaizss    时间: 2008-04-26 17:37
呵呵,如果这样写,应该就可以看明白了
awk '{a[$1]++}flag[$1,$2]!=1{b[$1]++}{flag[$1,$2]=1}END{for (i in a)print i,a,b}' a.txt
作者: errmood    时间: 2008-04-26 18:00
谢谢,了解了。非常感谢!
作者: finechore    时间: 2010-06-22 19:22
好。不错。得学会触类旁通
作者: iori809    时间: 2010-06-22 20:53
wk '{array[$1]++;if(!($0 in array1)){array1[$1]++;array1[$0]}}END{for(i in array){print i" "array[i]" "array1[i]}}' linux.171
作者: bbgg1983    时间: 2010-06-22 21:36
学习了
作者: vitas333_cu    时间: 2010-06-22 23:15
看了头晕
作者: ywlscpl    时间: 2010-06-23 07:51
another
  1. awk '{a[$1]++}!b[$0]++{c[$1]++}END{for (i in a)print i,a[i],c[i]}' file
复制代码

作者: expert1    时间: 2010-06-23 10:16
没太看明白。
作者: Shell_HAT    时间: 2010-06-23 10:50
回复 12# expert1


哪里不明白?
作者: yazi0127    时间: 2010-06-23 11:02
ywlscpl 写的代码很精简,
  1. {a[$1]++}
复制代码
是统计出现$1的次数,
  1. !b[$0]++{c[$1]++}
复制代码
是统计$1不重复的行

很经典,赞一个
作者: expert1    时间: 2010-06-23 11:05
回复 13# Shell_HAT


    awk '{a[$1]++}!b[$0]++{c[$1]++}END{for (i in a)print i,a,c}' file

这个楼上解释了,感觉思路蛮好。其他的确看了费力。就学这个吧。

谢了老大.

PS:今晚押哪个啊?

昨天输3场了!!!
作者: expert1    时间: 2010-06-23 15:14
其实!b[$0]++这个思路太好了,去掉了重复的。晕。
作者: l_penny    时间: 2010-06-23 16:24
看不懂,做个标记,慢慢消化{:3_182:}
作者: yhou31    时间: 2010-06-24 11:09
看懂了,大声的赞一下。
作者: wild_li    时间: 2010-06-24 15:32
继续学习...........................
作者: conall    时间: 2013-06-01 13:53
awk '{a[$1]++}!b[$0]++{c[$1]++}END{for (i in a)print i,a[i],c[i]}' file ————————运行出现“b[: Event not found.”的错误,请各位前辈指点




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