免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2831 | 回复: 9

[文本处理] awk 字符块匹配问题 [复制链接]

论坛徽章:
1
2015元宵节徽章
日期:2015-03-06 15:50:39
发表于 2014-04-30 22:56 |显示全部楼层
各位达人,现有问题如下,一文本格式如下
---------20110412 1123-----------------------------
<ID>A11111</ID>
<NO>75</NO>
<TIME>201404121124</TIME>

---------20110412 1125-----------------------------
<ID>A11112</ID>
<NO>7</NO>
<TIME>201404121126</TIME>

---------20110412 1129-----------------------------
<ID>A11117</ID>
<NO>37</NO>
<TIME>201404121140</TIME>

---------20110412 1141-----------------------------
<ID>A11111</ID>
<NO>77</NO>
<TIME>201404121145</TIME>

.......

---------20110413 0011-----------------------------
<ID>A11111</ID>
<NO>177</NO>
<TIME>201404130013</TIME>
.......

能不能以ID中的A11111作为条件,匹配出以下格式的所有字符块
---------20110413 0011-----------------------------    //变化的   
<ID>A11111</ID>
<TIME>201404130013</TIME>                            //变化的

求达人指点

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
发表于 2014-05-01 09:28 |显示全部楼层
回复 1# bigbombgj


try:
  1. awk -v RS= '/<ID>A11111</' file
复制代码

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
发表于 2014-05-01 16:55 |显示全部楼层
本帖最后由 huang6894 于 2014-05-01 16:56 编辑

grep -B1 -A2 '<ID>A11111</ID>' ufile

未测试~

论坛徽章:
3
酉鸡
日期:2014-04-23 17:17:56丑牛
日期:2014-05-08 11:41:302015亚冠之德黑兰石油
日期:2015-08-03 11:14:27
发表于 2014-05-01 21:17 |显示全部楼层
楼主要的是这个吗?
sed -n '/A11111/,/TIME/p' file

<ID>A11111</ID>
<NO>75</NO>
<TIME>201404121124</TIME>
<ID>A11111</ID>
<NO>77</NO>
<TIME>201404121145</TIME>
<ID>A11111</ID>
<NO>177</NO>
<TIME>201404130013</TIME>

论坛徽章:
1
2015元宵节徽章
日期:2015-03-06 15:50:39
发表于 2014-05-02 16:32 |显示全部楼层
本帖最后由 bigbombgj 于 2014-05-02 16:36 编辑

谢谢各位,最关键的是
“---------20110413 0011-----------------------------”这一串如何提出来?
还有就是如何过滤掉中间的一行
<NO>75</NO>

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
发表于 2014-05-02 19:33 |显示全部楼层
回复 5# bigbombgj

你的这个意思?
  1. $ sed -nr '\%<ID>A11111</ID>%{H;n;n;H;g;p};h' i
  2. ---------20110412 1123-----------------------------
  3. <ID>A11111</ID>
  4. <TIME>201404121124</TIME>
  5. ---------20110412 1141-----------------------------
  6. <ID>A11111</ID>
  7. <TIME>201404121145</TIME>
  8. ---------20110413 0011-----------------------------
  9. <ID>A11111</ID>
  10. <TIME>201404130013</TIME>
复制代码

论坛徽章:
5
白羊座
日期:2014-10-28 11:23:27水瓶座
日期:2015-01-20 10:19:022015亚冠之柏斯波利斯
日期:2015-07-11 18:17:2015-16赛季CBA联赛之同曦
日期:2015-12-23 12:38:582016猴年福章徽章
日期:2016-02-18 15:30:34
发表于 2014-05-02 22:12 |显示全部楼层
本帖最后由 klainogn 于 2014-05-02 22:13 编辑
  1. awk 'BEGIN{RS="\n\n";ORS=RS}/A11111/' urfile
  2. ---------20110412 1123-----------------------------
  3. <ID>A11111</ID>
  4. <NO>75</NO>
  5. <TIME>201404121124</TIME>

  6. ---------20110412 1141-----------------------------
  7. <ID>A11111</ID>
  8. <NO>77</NO>
  9. <TIME>201404121145</TIME>
复制代码
是这样子吗?

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
发表于 2014-05-02 22:22 |显示全部楼层
谢谢各位,最关键的是
“---------20110413 0011-----------------------------”这一串如何提出来?
还有就是如何过滤掉中间的一行
<NO>75</NO>


如果清楚哪些行需要,并可用正则概括这些行的特征,就不要绕圈子了,比如直接:
  1. grep   '[-]+|<ID>|<TIME>' file
复制代码
如果只能确定一行的正则特征,其他行的获取与否是根据相对这个特征行的位置决定的,那么就用类似6搂的方法。
@bigbombgj

论坛徽章:
0
发表于 2014-05-03 01:03 |显示全部楼层
awk 'BEGIN{RS="";FS="\n";OFS="\n";ORS="\n\n"}{print $2,$1,$4}' file

论坛徽章:
1
2015元宵节徽章
日期:2015-03-06 15:50:39
发表于 2014-05-03 19:30 |显示全部楼层
谢谢大家,我最后导到数据库里实现了,不过还是要谢谢大家。awk,sed真实博大精深啊,向各位学习了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP