免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2320 | 回复: 16

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

论坛徽章:
0
发表于 2019-01-29 13:57 |显示全部楼层
原始文件是这样的(以空格为分隔符):
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 1521 + 1 4 CHH CAA U M U M 247
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
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 1750 + 1 0 CHH CTA N M U M 386
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
希望得到的结果:把最后一列($12)是连续的数字作为一个区段,如果这个区段里倒数第二列($11)字符‘M’出现次数大于3次,则输出这一区段,否则跳过不输出。
结果: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

论坛徽章:
7
2016科比退役纪念章
日期:2018-10-24 08:24:0115-16赛季CBA联赛之北控
日期:2019-03-12 14:34:562016科比退役纪念章
日期:2019-04-01 10:33:0915-16赛季CBA联赛之山东
日期:2019-04-17 12:46:3215-16赛季CBA联赛之广夏
日期:2019-05-09 16:40:4015-16赛季CBA联赛之广夏
日期:2019-10-10 15:33:4015-16赛季CBA联赛之辽宁
日期:2019-10-15 08:37:06
发表于 2019-01-29 16:39 |显示全部楼层
没能看懂你的意思- -
一列不是最多一个字符 M 吗? 怎么叫出现次数大于3次?你的结果  也只是有一行有3个M啊。

论坛徽章:
0
发表于 2019-01-30 21:48 来自手机 |显示全部楼层
不好意思,没表达清楚,我的意思是每个区段的所有行第11列至少重复3次

论坛徽章:
0
发表于 2019-01-30 21:48 来自手机 |显示全部楼层
不好意思,没表达清楚,我的意思是每个区段的所有行第11列至少重复3次

论坛徽章:
0
发表于 2019-01-30 21:48 来自手机 |显示全部楼层
不好意思,没表达清楚,我的意思是每个区段的所有行第11列至少重复3次

论坛徽章:
6
程序设计版块每日发帖之星
日期:2016-05-11 06:20:00操作系统版块每日发帖之星
日期:2016-05-12 06:20:00每日论坛发贴之星
日期:2016-05-12 06:20:00操作系统版块每日发帖之星
日期:2016-05-14 06:20:00程序设计版块每日发帖之星
日期:2016-05-31 06:20:00每日论坛发贴之星
日期:2016-05-31 06:20:00
发表于 2019-01-31 22:50 |显示全部楼层
本帖最后由 1cpuer 于 2019-01-31 23:10 编辑



#,; PWD=/mnt/i/je-d/sou-d :=12628=: # 2019-01-31 23:07:05 1548947225
#.: awk '{a[$0]++}$0 ~ /[M|N]/{for(j in a)if(a[$11]>3);print a[j],$0}' file | nl
     1  1  1 1521 + 1 4 CHH CAA U M U M 247
     2  1  1 1559 + 1 5 CHH CCC M U U M 263
     3  1  1 1561 + 3 4 CHH CAT M M U M 265
     4  1  1 1564 - 0 18 CHH CAT U U U M 266
     5  1  1 1726 + 2 0 CHH CCC U M U U 373
     6  1  1 1728 + 0 2 CHH CAC U M U M 375
     7  1  1 1730 + 2 0 CHH CAA U M U M 376
     8  1  1 1735 + 0 2 CHH CAA U U U M 378
     9  1  1 1738 - 0 5 CHH CTT U U U M 379
    10  1  1 1748 + 0 1 CHH CAC U M U U 385
    11  1  1 1750 + 1 0 CHH CTA N M U M 386
    12  1  1 1775 - 1 1 CHH CTC U M U U 399
    13  1  1 1776 - 0 2 CHH CCT N U U U 400

#,; PWD=/mnt/i/je-d/sou-d :=12630=: # 2019-01-31 23:09:52 1548947392
#.: awk '{a[$0]++}$11 ~ /[M|N]/{for(j in a)if(a[$11]>3);print $0}' file
1 1521 + 1 4 CHH CAA U M U M 247
1 1559 + 1 5 CHH CCC M U U M 263
1 1561 + 3 4 CHH CAT M M U M 265
1 1564 - 0 18 CHH CAT U U U M 266
1 1728 + 0 2 CHH CAC U M U M 375
1 1730 + 2 0 CHH CAA U M U M 376
1 1735 + 0 2 CHH CAA U U U M 378
1 1738 - 0 5 CHH CTT U U U M 379
1 1750 + 1 0 CHH CTA N M U M 386

评分

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

查看全部评分

论坛徽章:
7
2016科比退役纪念章
日期:2018-10-24 08:24:0115-16赛季CBA联赛之北控
日期:2019-03-12 14:34:562016科比退役纪念章
日期:2019-04-01 10:33:0915-16赛季CBA联赛之山东
日期:2019-04-17 12:46:3215-16赛季CBA联赛之广夏
日期:2019-05-09 16:40:4015-16赛季CBA联赛之广夏
日期:2019-10-10 15:33:4015-16赛季CBA联赛之辽宁
日期:2019-10-15 08:37:06
发表于 2019-02-01 13:42 |显示全部楼层
看了半天总算明白楼主的意思了- -。
还是用awk,写了个相对直接的算法,可能有点啰嗦,没考虑效率,楼主给的数据测试通过。
awk脚本:test.awk
  1. {
  2.     if (saveLine)
  3.     {
  4.         res[i++]=saveLine
  5.         split(saveLine,t)
  6.         currentNum=t[12]
  7.         a[t[11]]++              #计M数
  8.         nextNum=$12
  9.         if (nextNum!=currentNum+1)
  10.         {
  11.             saveLine=$0         #不连续,保存当前行
  12.             delete res          #不连续,保存的前一行可以删除了
  13.             a["M"]=0
  14.             next                #跳过后面代码,awk循环控制读入下一行
  15.         }
  16.     }

  17.     #连续数字的行
  18.     do
  19.     {
  20.         currentNum=$12
  21.         res[i++]=$0             #存储连续的结果
  22.         a[$11]++                #计M数
  23.         if (getline)
  24.             nextNum=$12
  25.         else                    #已经是最后一行了,退出循环
  26.             break
  27.     } while (nextNum==currentNum+1)

  28.     #print "M:" a["M"]
  29.     if (a["M"]>=3)
  30.     {
  31.         for (var in res)
  32.             print res[var]
  33.     }

  34.     saveLine = $0               #已读进来的这行不连续,需要保存,供下次用
  35.     delete res                  #清除存储的结果
  36.     a["M"]=0                    #M数清0
  37.     #                           awk 循环控制读入下一行
  38. }
复制代码


运行:
  1. awk -f test.awk file.txt
复制代码

结果:
  1. 1 1559 + 1 5 CHH CCC M U U M 263
  2. 1 1560 + 1 5 CHH CCA U U U U 264
  3. 1 1561 + 3 4 CHH CAT M M U M 265
  4. 1 1564 - 0 18 CHH CAT U U U M 266
  5. 1 1566 + 0 8 CHH CTC U U U U 267
  6. 1 1726 + 2 0 CHH CCC U M U U 373
  7. 1 1727 + 0 2 CHH CCA U U U U 374
  8. 1 1728 + 0 2 CHH CAC U M U M 375
  9. 1 1730 + 2 0 CHH CAA U M U M 376
  10. 1 1733 + 0 2 CHH CTC U U U U 377
  11. 1 1735 + 0 2 CHH CAA U U U M 378
  12. 1 1738 - 0 5 CHH CTT U U U M 379
复制代码

评分

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

查看全部评分

论坛徽章:
0
发表于 2019-02-01 17:52 |显示全部楼层
我就是看了很多次也不明白,所以放棄

论坛徽章:
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
发表于 2019-02-14 17:17 |显示全部楼层
本帖最后由 expert1 于 2019-02-14 17:50 编辑
  1. awk 'NR==1{ start =$12;  temp =$0; count=0 }NR>1{

  2.    if($12 == start + 1) {

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

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


  5.    }else {
复制代码

论坛徽章:
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
发表于 2019-02-14 17:22 |显示全部楼层
论坛很很慢啊,唉,也快到挂的感觉。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。




----------------------------------------

大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP