免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1752 | 回复: 9
打印 上一主题 下一主题

有条件计数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-12 11:46 |只看该作者 |倒序浏览
本帖最后由 怿_mao44 于 2012-06-12 13:43 编辑

输入文件:
  1. aaa        1        12        123        AA1        AA2        pre-abc
  2. aaa        1        21        321        AA1        AA2        pre-abc
  3. bbb        2        23        234        BB1        BB2        pre-abc
  4. bbb        3        34        345        BB1        BB2        post-abc
  5. aaa        4        45        456        AA1        AA3        post-abc
  6. abb        5        56        567        AA1        AA2        post-abc
  7. abb        6        67        678        AA1        AA2        pre-abc
  8. bbb        2        23        234        BB3        BB4        post-abc
  9. bbb        2        23        234        AA1        AA2        pre-abc
  10. bbb        4        45        456        AA1        AA2        post-abc
复制代码
目的:,以第五,六列为一个单位,对第一列的内容计数

计数条件:
1.第一列内容相同的时候,还要比较对应的每一行中第五,六列内容也必须同时相同
2.对应的记录中第七列必须同时存在"pre-abc"和"post-abc"
3.符合此条件的第一列记录则,记为1
(以aaa为例,存在有重复的记录,且对应有"pre-abc"和"post-abc"同时存在,但是对应[AA1 AA2]和[AA1 AA3]并不相同,则不能计数。)

输出结果:
输入文件中,对应“AA1        AA2”的记录中,有“abb,bbb”符合条件,所以记为两次;而只有“bbb”对应“BB1        BB2”,故只记做1次
  1. AA1        AA2        2
  2. BB1        BB2        1
复制代码

论坛徽章:
0
2 [报告]
发表于 2012-06-12 12:36 |只看该作者
  1. awk '{a[$1$5,$6]=a[$1$5,$6]$7}END{for(i in a) if(a[i]=="-+" || a[i]=="+-") ++b[substr(i,length(i)-6,7)];for(k in b)print k,b[k]}'
复制代码

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
3 [报告]
发表于 2012-06-12 13:13 |只看该作者
回复 1# 怿_mao44

gawk4.0.0
  1. gawk '{p=$NF~"+"?1:-1;a[$1][$5 FS $6]+=p}END{for(i in a)for(j in a[i])if(a[i][j]==0)b[j]++;for(x in b)print x,b[x]}'
复制代码

论坛徽章:
0
4 [报告]
发表于 2012-06-12 13:42 |只看该作者
回复 3# yinyuemi


    也许是版本不同,或者其他原因,并不能实现

$ gawk --v
GNU Awk 3.1.5


或许时候由于实际数据中,第七列,并不是简单的+/-,而是一段字符所以有影响

论坛徽章:
0
5 [报告]
发表于 2012-06-12 13:45 |只看该作者
回复 2# 英语盲学linux


    实际操作中,并不是单纯+/-,而是一些符合字符串,可能有影响,导致,并无法得到结果呢

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
6 [报告]
发表于 2012-06-12 13:57 |只看该作者
回复 4# 怿_mao44

+/-的问题,根据你的实际数据改吧
  1. awk '{p=$NF~"+"?1:-1;a[$1"|"$5 FS $6]+=p}END{for(i in a)if(a[i]==0)b[gensub(/.*\|(.*)/,"\\1",1,i)]++;for(x in b)print x,b[x]}'
复制代码

论坛徽章:
0
7 [报告]
发表于 2012-06-12 14:15 |只看该作者

  1. $ more file |sort|uniq >test        ##对输入文件去重复
  2. $ cut -f 1,5,6 test|uniq -d >test1    ##只提取第1列,和第5,6列,然后只提取有重复的记录,因为之前已经对全文件去重复过了,所以此时的重复记录,就是同时对应不同第7列的记录
  3. $ cut -f 2,3 test|sort|uniq -c >test    ##在对第2,3列,其实为输入文件中的5,6列排序计数
复制代码

    好吧,这是我最初想的巨2分析流程,总觉得有一丝扭曲

论坛徽章:
0
8 [报告]
发表于 2012-06-12 14:29 |只看该作者
回复 6# yinyuemi


    由于实际数据不同,真正修改的地方就只是红色区域的么?

awk '{p=$NF~"+"?1:-1;a[$1"|"$5 FS $6]+=p}END{for(i in a)if(a==0)b[gensub(/.*\|(.*)/,"\\1",1,i)]++;for(x in b)print x,b[x]}'

但是,输出的结果我抽取了几个例子,手工查,好像有些偏差的。难道是我使用时候有问题木?

论坛徽章:
0
9 [报告]
发表于 2012-06-12 16:36 |只看该作者
回复 6# yinyuemi


    知道哪里错了。。
输入文件在处理前,要先做排序去重复,除去一些完全一致的记录行,再处理

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
10 [报告]
发表于 2012-06-12 20:48 |只看该作者
  1. awk '{ a[$1 OFS $5 OFS $6]
  2.        if ($NF=="pre-abc") pre[$1 OFS $5 OFS $6]=1
  3.        if ($NF=="post-abc") post[$1 OFS $5 OFS $6]=1
  4.      }END{ for (i in a) if (pre[i]==1&&post[i]==1) {split(i,s,OFS);b[s[2] OFS s[3]]++}
  5.            for (i in b) print i,b[i]}' OFS="\t" infile
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP