免费注册 查看新帖 |

Chinaunix

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

[文本处理] sed提取文本的问题,折腾了两个小时没搞定 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-26 13:25 |只看该作者 |倒序浏览
有一个日志文件,内容如下:

#A#00#FileName1 Start#
#A#01##
#A#02##
#B#00#FileName2 Start#
#B#01##
#B#02##
#A#03##
#A#04##
#C#00#FileName3 Start#
#B#03##
#C#01##
#C#02##
#C#03##
#A#00#FileName4 Start#
#C#04##

现在我想根据第二个字段提取内容,对于FileName1,我提取的内容是:
#A#00#FileName1 Start#
#A#01##
#A#02##
#A#03##
#A#04##

步骤是先找到FileName1,再找到FileName1所在行的第一个字段A,
再往下查找第一个字段都是A的记录,直到遇到Start再次出现,输出之前匹配的行。

问题是:
这个文件很大,需要考虑效率;
00,01,02等这些是处理步骤,个数不限,判断匹配结束只能是Start再次出现,并且不要输出后面这个Start行;

我通过AWK已经单条命令实现了目的,通过SED脚本也实现了;
现在想请大家帮助如果通过SED单条命令实现,我尝试了多次未成功,最好是hp-ux ksh环境,谢谢~~

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
2 [报告]
发表于 2012-12-26 13:32 |只看该作者
alias sed=awk

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
3 [报告]
发表于 2012-12-26 14:05 |只看该作者
把你自己写的代码贴出来看看

论坛徽章:
0
4 [报告]
发表于 2012-12-26 14:57 |只看该作者
  1. awk '/FileName1/{print;getline k;x=substr(k,2,1);print k;while(getline){if(substr($0,2,1)==x&&NF==1)print $0}}'
复制代码
猜是不是这样的?

论坛徽章:
0
5 [报告]
发表于 2012-12-26 15:12 |只看该作者
回复 3# Shell_HAT

  1. [cceu@vm-zk02:/home/cceu/]cat log.txt
  2. #A#00#FileName1 Start#
  3. #A#01##
  4. #A#02##
  5. #B#00#FileName2 Start#
  6. #B#01##
  7. #B#02##
  8. #A#03##
  9. #A#04##
  10. #C#00#FileName3 Start#
  11. #B#03##
  12. #C#01##
  13. #C#02##
  14. #C#03##
  15. #A#00#FileName4 Start#
  16. [cceu@vm-zk02:/home/cceu/]awk -F# '{if($4~/FileName1/){inst=$2;print;continue} if($2!="" && $2==inst){if($4~/Start/) exit; print}}' log.txt         
  17. #A#00#FileName1 Start#
  18. #A#01##
  19. #A#02##
  20. #A#03##
  21. #A#04##
  22. [cceu@vm-zk02:/home/cceu/]awk -F# '{if($4~/FileName2/){inst=$2;print;continue} if($2!="" && $2==inst){if($4~/Start/) exit; print}}' log.txt
  23. #B#00#FileName2 Start#
  24. #B#01##
  25. #B#02##
  26. #B#03##
  27. [cceu@vm-zk02:/home/cceu/]awk -F# '{if($4~/FileName3/){inst=$2;print;continue} if($2!="" && $2==inst){if($4~/Start/) exit; print}}' log.txt
  28. #C#00#FileName3 Start#
  29. #C#01##
  30. #C#02##
  31. #C#03##
  32. #C#04##
  33. [cceu@vm-zk02:/home/cceu/]

  34. [cceu@vm-zk02:/home/cceu/]cat my_catch_sed.sh
  35. #!/usr/bin/ksh

  36. match=`grep -n $1 $2`
  37. start=`echo $match | awk -F: '{print $1}'`
  38. inst=`echo $match | awk -F# '{print $2}'`
  39. sed "${start},/${inst}/{:a;x;N;s/Start/&/;ba;x;q;}" $2 | grep "${inst}"
  40. [cceu@vm-zk02:/home/cceu/]./my_catch_sed.sh FileName1 log.txt
  41. sed: 标号 1,/A/{:a;x;N;s/Start/&/;ba;x;q;} 超过 8 个字符。
  42. [cceu@vm-zk02:/home/cceu/]
复制代码
上面尝试用sed标号,也不熟悉,不知道为什么总是报这个错,请指教,多谢~~

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
6 [报告]
发表于 2012-12-26 16:35 |只看该作者

  1. sed -n '/^\(#[^#]*\)#[^#]*#FileName1[^#]*#.*/{p;s//\1/;x;b}
  2. G
  3. /^\(#[^#]*\)#[^#]*#[^#]*Start#.*\n\1/b
  4. /^\(#[^#]*\)#.*\n\1/P'  urfile
复制代码

论坛徽章:
0
7 [报告]
发表于 2012-12-26 17:11 |只看该作者
回复 6# waker


    谢谢大虾指教啊,我已远眺到你思路的尾巴了,可能hpux的sed太挫了,执行报错,不管了,非常感谢!

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
8 [报告]
发表于 2012-12-26 17:14 |只看该作者
回复 7# insnowind


    山寨你awk的思路而已
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP