免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: hechao7021
打印 上一主题 下一主题

[文本处理] 怎么将分成一个个小区段然后找到某字符重复数大于3次的区段 [复制链接]

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
11 [报告]
发表于 2019-02-14 17:45 |只看该作者
本帖最后由 expert1 于 2019-02-14 17:47 编辑

思路,第一行,读入$0, $12,$11不是M,直接设计数器为0,
从第二行开始,如果连续,那么追加$0,设置start, 并且判断M,如果有,计数器+1。

如果不连续了,判断count是不是>=3,如果是,打印。如果不是,重设$0,start,并且如果这一行有M,计数器设为1,如果没有M,设为0.
END的部分为了防止最后几行满足要求,但没地方打印,所以在END的时候打印一下。

以此类推。

评分

参与人数 1信誉积分 +5 收起 理由
hechao7021 + 5 很给力!

查看全部评分

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
12 [报告]
发表于 2019-02-14 17:52 |只看该作者
论坛真垃圾,东西都贴不出来,看这里吧

awk 'NR==1{ start =$12;  temp =$0; count=0 }NR>1{

if($12 == start + 1) {

if ($11 == "M") count++ ;

temp = temp"\n"$0; start=$12


}


else {
if (count >=3)print temp;


temp=$0;start=$12; if ($11 == "M") {count=1}else count=0


}


}END{if (count >=3)print temp}' a
1 1559 + 1 5 CHH CCC M U U M 263
1 1560 + 1 5 CHH CCA U U U U 264
1 1561 + 3 4 CHH CAT M M U M 265
1 1564 - 0 18 CHH CAT U U U M 266
1 1566 + 0 8 CHH CTC U U U U 267
1 1726 + 2 0 CHH CCC U M U U 373
1 1727 + 0 2 CHH CCA U U U U 374
1 1728 + 0 2 CHH CAC U M U M 375
1 1730 + 2 0 CHH CAA U M U M 376
1 1733 + 0 2 CHH CTC U U U U 377
1 1735 + 0 2 CHH CAA U U U M 378
1 1738 - 0 5 CHH CTT U U U M 379

论坛徽章:
0
13 [报告]
发表于 2019-02-15 14:07 |只看该作者
cat t1.db | awk '$12>0{for(i=8;i<12;i++){if($i==$11)array[NR$11]++}}{if(array[NR$11]>2) print $0}'
1 1509 - 0 13 CHH CTC U U U U 244
1 1511 + 0 5 CHH CAA U U U U 245
1 1517 - 0 14 CHH CTT U U U U 246
1 1560 + 1 5 CHH CCA U U U U 264
1 1561 + 3 4 CHH CAT M M U M 265
1 1566 + 0 8 CHH CTC U U U U 267
1 1726 + 2 0 CHH CCC U M U U 373
1 1727 + 0 2 CHH CCA U U U U 374
1 1733 + 0 2 CHH CTC U U U U 377
1 1743 - 0 4 CHH CAC U U U U 382
1 1746 - 1 3 CHH CAA U U U U 383
1 1747 + 0 1 CHH CCA U U U U 384
1 1748 + 0 1 CHH CAC U M U U 385
1 1775 - 1 1 CHH CTC U M U U 399
1 1776 - 0 2 CHH CCT N U U U 400
1 1777 - 0 2 CHH CCC U U U U 401
1 1778 + 0 1 CHH CAA U U U U 402

论坛徽章:
0
14 [报告]
发表于 2019-02-15 14:08 |只看该作者
cat t1.db | awk '$12>0{for(i=8;i<12;i++){if($i==$11)array[NR$11]++}}{if(array[NR$11]>2) print $0}'
1 1509 - 0 13 CHH CTC U U U U 244
1 1511 + 0 5 CHH CAA U U U U 245
1 1517 - 0 14 CHH CTT U U U U 246
1 1560 + 1 5 CHH CCA U U U U 264
1 1561 + 3 4 CHH CAT M M U M 265
1 1566 + 0 8 CHH CTC U U U U 267
1 1726 + 2 0 CHH CCC U M U U 373
1 1727 + 0 2 CHH CCA U U U U 374
1 1733 + 0 2 CHH CTC U U U U 377
1 1743 - 0 4 CHH CAC U U U U 382
1 1746 - 1 3 CHH CAA U U U U 383
1 1747 + 0 1 CHH CCA U U U U 384
1 1748 + 0 1 CHH CAC U M U U 385
1 1775 - 1 1 CHH CTC U M U U 399
1 1776 - 0 2 CHH CCT N U U U 400
1 1777 - 0 2 CHH CCC U U U U 401
1 1778 + 0 1 CHH CAA U U U U 402

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
15 [报告]
发表于 2019-02-15 17:09 |只看该作者
回复 14# lanyuxin2012

你这明显不对,他是要求 $12连续的,里面如果出现3个以上的M,才把这些连续的打印出来。

论坛徽章:
0
16 [报告]
发表于 2019-02-20 10:47 |只看该作者
感谢各位的回复,当初发下帖子,好久没等到回复,于是没上论坛看了,劳烦各位大神辛苦帮忙了,自己搞了R语言的代码,不过效率没有awk高,R代码如下:
dat <- read.table('test.txt', header = F, stringsAsFactors = F)
N <- nrow(dat)
diffValue <- diff(dat[,12])
flag <- which(diffValue > 1)
result <- as.data.frame(matrix(ncol=12, nrow=0))

M <- length(flag)-1
for (i in 1:M) {
    if(flag[i+1]-flag[i] > 3) {
        beg <- flag[i]+1
        end <- flag[i+1]
        if(sum(dat[beg:end, 11]=="M") >=4) {
            tmp <- dat[beg:end, ]
            result <- rbind(result, tmp)
        }
    }
}

# the last
if(N-flag[length(flag)]>=4) {
    if(sum(dat[(flag[M+1]+1): N, 11]=="M") >=4) {
        result <- rbind(result, dat[(flag[M+1]+1): N, ])
    }
}

write.table(result, 'result.txt', sep=' ', col.names = F, row.names = F, quote = F)

论坛徽章:
0
17 [报告]
发表于 2019-02-20 10:50 |只看该作者
回复 12# expert1
多谢大神,受益了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP