免费注册 查看新帖 |

Chinaunix

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

[文本处理] 截取所有相同的名至结束行 [复制链接]

论坛徽章:
2
15-16赛季CBA联赛之四川
日期:2020-08-18 20:19:4815-16赛季CBA联赛之青岛
日期:2022-01-19 11:51:49
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2023-08-27 20:53 |只看该作者 |倒序浏览
本帖最后由 unix520 于 2023-08-27 21:00 编辑

a.txt
截取所有相同的名至结束行
如果从倒数行中发现第一个有 "新增" 字符串的行,  需截取所有相同的 "MAC"  至 "结束"  行   , 即截取相同 "MAC"  至 "结束"  行
最后一个有 "新增" 字符串的行其中MAC 有随时可能变化,  并不是固定名词, 也不是在行中固定列数,   所以请使用MAC格式匹配
  1. MAC格式  /([0-9A-Z]{2}:){5}[0-9A-Z]{2}/
复制代码

为了提高效率, 请从倒数开始搜索有 "新增" 字符串的行寻找开始工作, ·这样可以大大减少从开始搜索到结尾过程时间

希望用awk实现

  1. a.txt
  2. a 新增  01:02:03:04:05:06 (
  3. ***
  4. b 结束

  5. e 新增  U 1A:2A:3A:4A:5A:6A (
  6. **
  7. f 结束

  8. g 新增  01:02:03:04:05:06 (
  9. **
  10. f 结束

  11. c 新增  1A:2A:3A:4A:5A:6A (
  12. ***
  13. d 结束

  14. v A1:A2:A3:A4:A5:A6
复制代码
  1. b.txt
  2. e 新增  U 1A:2A:3A:4A:5A:6A (
  3. **
  4. f 结束

  5. c 新增  1A:2A:3A:4A:5A:6A (
  6. ***
  7. d 结束
复制代码





论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
2 [报告]
发表于 2023-08-29 12:27 |只看该作者
回复 1# unix520

unix520你好:
下面你发表的主题中均有大家给你的回复,而你却把1楼提问帖的内容修改成了如“谢谢”、“算了 不问了”、“新年快乐”等内容。大家回复帮你解决问题是要耗费时间和精力的,你这样做是对回复人的不尊重,也让该主题失去了参考价值。请恢复这些主题中1楼提问帖的内容。

http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4319222
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4319242
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4319228
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4319296






论坛徽章:
2
15-16赛季CBA联赛之四川
日期:2020-08-18 20:19:4815-16赛季CBA联赛之青岛
日期:2022-01-19 11:51:49
3 [报告]
发表于 2023-08-29 13:24 |只看该作者
回复 2# wh7211

没有不尊重意思,   请不要误会哦, 只不过部分涉及到某些不宜公开公司资料,如有一些不当之处影响了大家,  实在抱歉, 希望大家谅解。已全部更正及还原主题意思

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
4 [报告]
发表于 2023-08-29 15:54 |只看该作者
回复 1# unix520


  1. cat 1
  2. a 新增  01:02:03:04:05:06 (
  3. ***
  4. b 结束

  5. e 新增  U 1A:2A:3A:4A:5A:6A (
  6. **
  7. f 结束

  8. g 新增  01:02:03:04:05:06 (
  9. **
  10. f 结束

  11. c 新增  1A:2A:3A:4A:5A:6A (
  12. ***
  13. d 结束

  14. v A1:A2:A3:A4:A5:A6

  15. awk '/新增/{a=1;match($0,"(([0-9A-Z]{2}:){5}[0-9A-Z]{2})",b);d[++c]=b[1]}a{e[c]=e[c]?e[c]"\n"$0:$0}/结束/{a=0}END{for(i=1;i<=c;i++){if(d[i]==d[c]){print e[i]"\n">"2"}}}' 1

  16. cat 2
  17. e 新增  U 1A:2A:3A:4A:5A:6A (
  18. **
  19. f 结束

  20. c 新增  1A:2A:3A:4A:5A:6A (
  21. ***
  22. d 结束

复制代码

论坛徽章:
2
15-16赛季CBA联赛之四川
日期:2020-08-18 20:19:4815-16赛季CBA联赛之青岛
日期:2022-01-19 11:51:49
5 [报告]
发表于 2023-08-29 20:35 |只看该作者
本帖最后由 unix520 于 2023-08-29 21:21 编辑

回复 4# wh7211

结果是正确,  但是似乎有点慢,  将主题例重复复制粘贴到100m文件试    在同一台配置上用了53秒,   由于每次都会写入新的  所以需要提高效率才行 ,  还能再快一些吗?   另外想用win gawk环境执行
  1. $ time awk '/新增/{a=1;match($0,"(([0-9A-Z]{2}:){5}[0-9A-Z]{2})",b);d[++c]=b[1]}a{e[c]=e[c]?e[c]"\n"$0:$0}/结束/{a=0}END{for(i=1;i<=c;i++){if(d[i]==d[c]){print e[i]"\n">"2.txt"}}}' 1.txt

  2. real    0m53.557s
复制代码


在同一台配置上用已弃用代码 用时仅14s,  由于是列匹配模式, 有很多列不整齐问题,  想弃用   但如果可以修改为匹配MAC,   效率应该也很理想的
  1. $ time awk 'NR==FNR{if($2~/新增/){a=$3}}NR>FNR{if($3~a){d=$0;getline;if($2~/新增/){b=0;next}else{print d;b=1}};if(b==1){print $0;if($2~/结束/){print "";b=0}}}' 1.txt 1.txt >2.txt

  2. real    0m14.997s

复制代码


论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
6 [报告]
发表于 2023-08-29 23:03 |只看该作者
回复 5# unix520


文件1大小100M,测试结果如下,代码2效率更高。

代码1:
  1. time awk '/新增/{a=1;match($0,"(([0-9A-Z]{2}:){5}[0-9A-Z]{2})",b);d[++c]=b[1]}a{e[c]=e[c]?e[c]"\n"$0:$0}/结束/{a=0}END{for(i=1;i<=c;i++){if(d[i]==d[c]){print e[i]"\n">"2"}}}' 1

  2. real        0m17.208s
复制代码


代码2:
  1. time awk '/新增/{a=1;for(i=1;i<=NF;i++){if($i~/([0-9A-Z]{2}:){5}[0-9A-Z]{2}/){c[++b]=$i;break}}}a{d[b]=d[b]?d[b]"\n"$0:$0}/结束/{a=0}END{for(i=1;i<=b;i++){if(c[i]==c[b]){print d[i]"\n">"2"}}}' 1

  2. real        0m7.504s
复制代码

论坛徽章:
2
15-16赛季CBA联赛之四川
日期:2020-08-18 20:19:4815-16赛季CBA联赛之青岛
日期:2022-01-19 11:51:49
7 [报告]
发表于 2023-08-30 09:14 |只看该作者
回复 6# wh7211

谢谢,,   可能是办公设备配置差原因

论坛徽章:
2
15-16赛季CBA联赛之四川
日期:2020-08-18 20:19:4815-16赛季CBA联赛之青岛
日期:2022-01-19 11:51:49
8 [报告]
发表于 2023-08-30 21:52 |只看该作者
本帖最后由 unix520 于 2023-08-30 22:02 编辑
  1. awk 'NR==FNR{if($2~/新增/){a=$3}}NR>FNR{if($3~a){d=$0;getline;if($2~/新增/){b=0;next}else{print d;b=1}};if(b==1){print $0;if($2~/结束/){print "";b=0}}}' 1.txt 1.txt >2.txt
复制代码
如果按以上代码思路, 将其修改为匹配MAC格式方法,  请问该如何改呢?



仅修改这2处似乎不行
{if($2~/新增/){a=$3}}
{if($3~a)


将a=$3改为:  {if($2~/新增/){a=/([0-9A-Z]{2}{5}[0-9A-Z]{2}/}}

{if($3~a)改为: {if(([0-9A-Z]{2}{5}[0-9A-Z]{2}~a)

  1. awk 'NR==FNR{if($2~/新增/){a=/([0-9A-Z]{2}:){5}[0-9A-Z]{2}/}}NR>FNR{if(/([0-9A-Z]{2}:){5}[0-9A-Z]{2}/~a){d=$0;getline;if($2~/新增/){b=0;next}else{print d;b=1}};if(b==1){print $0;if($2~/结束/){print "";b=0}}}' 1.txt 1.txt >2.txt
复制代码





论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
9 [报告]
发表于 2023-08-31 10:46 |只看该作者
本帖最后由 wh7211 于 2023-08-31 11:27 编辑

回复 8# unix520


文件1大小100M,不匹配MAC,测试结果如下。代码3是在代码2的基础上,去掉了匹配MAC的部分。代码3比你提供的代码效率更高。

代码3:
  1. time awk '/新增/{a=1;c[++b]=$3}a{d[b]=d[b]?d[b]"\n"$0:$0}/结束/{a=0}END{for(i=1;i<=b;i++){if(c[i]==c[b]){print d[i]"\n">"2"}}}' 1

  2. real        0m4.508s
复制代码


你提供的代码:
  1. time awk 'NR==FNR{if($2~/新增/){a=$3}}NR>FNR{if($3~a){d=$0;getline;if($2~/新增/){b=0;next}else{print d;b=1}};if(b==1){print $0;if($2~/ 结束/){print "";b=0}}}' 1 1 > 2

  2. real        0m5.537s
复制代码

  1. awk 'NR==FNR{if($2~/新增/){a=$3}}NR>FNR{if($3~a){d=$0;getline;if($2~/新增/){b=0;next}else{print d;b=1}};if(b==1){print $0;if($2~/结束/){print "";b=0}}}' 1.txt 1.txt >2.txt
复制代码
如果按以上代码思路, 将其修改为匹配MAC格式方法,  请问该如何改呢?

文件1大小100M,按你的需求修改为匹配MAC,测试结果如下。
  1. time awk 'NR==FNR{if($2~/新增/){for(i=1;i<=NF;i++){if($i~/([0-9A-Z]{2}:){5}[0-9A-Z]{2}/){a=$i;break}}}}NR>FNR{for(i=1;i<=NF;i++){if($i~a){d=$0;getline;if($2~/新增/){b=0;next}else{print d;b=1};break}};if(b==1){print $0;if($2~/结束/){print "";b=0}}}' 1 1 > 2

  2. real        0m9.927s
复制代码

论坛徽章:
2
15-16赛季CBA联赛之四川
日期:2020-08-18 20:19:4815-16赛季CBA联赛之青岛
日期:2022-01-19 11:51:49
10 [报告]
发表于 2023-08-31 14:14 |只看该作者
回复 9# wh7211

谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP