免费注册 查看新帖 |

Chinaunix

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

关于awk的一个问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-21 11:00 |只看该作者 |倒序浏览
一个文件如下:

  1. time1:111111111 - 20070521
  2. time2:<TEST><ID>20070521</ID>
  3.                 abc
  4.                 efg
  5.       </TEST>
  6. time3:222222222
  7. time4:333333333
  8. time5:<TEST><ID>20070521</ID>
  9.                 aaa
  10.                 bbb
  11.       </TEST>
  12. time6:444444444
  13. time7:<TEST><ID>20070520</ID>
  14.                 ccc
  15.                 ddd
  16.       </TEST>
  17. time8:444444444
复制代码


现在的要求是要得到:

  1. time1:111111111 - 20070521

  2. time2:<TEST><ID>20070521</ID>
  3.                 abc
  4.                 efg
  5.       </TEST>

  6. time5:<TEST><ID>20070521</ID>
  7.                 aaa
  8.                 bbb
  9.       </TEST>
复制代码

即取得包含20070521的行, 如果该行是个xml格式的字符串,则把余下的行都取出。

我的思路如下,先取得包含在<TEST>...</TEST>的段落,然后在判断改段落是否包含20070531
但是我只知道怎么取得<TEST>...</TEST>的段落.


  1. /<TEST>/, /<\/TEST>/{
  2.     print
  3. }

复制代码

论坛徽章:
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 [报告]
发表于 2007-05-21 11:13 |只看该作者
awk 'BEGIN{RS="time"}
/20070521/{printf RS$0}' urfile

论坛徽章:
0
3 [报告]
发表于 2007-05-21 11:20 |只看该作者
多谢waker 的指点,不过time是系统时间,并不是固定的字符

论坛徽章:
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
4 [报告]
发表于 2007-05-21 11:30 |只看该作者
不是固定字符就用regex,都是一样一样的啊

论坛徽章:
0
5 [报告]
发表于 2007-05-21 13:27 |只看该作者
原帖由 waker 于 2007-5-21 11:30 发表
不是固定字符就用regex,都是一样一样的啊


regex? 你的意思是RS可以用正则表达式?

  1. 'BEGIN{RS=/[0-9]*:[0-9]*:[0-9]*/} /20070521/ {printf $0}'
复制代码

论坛徽章:
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 [报告]
发表于 2007-05-21 13:34 |只看该作者
  1. awk 'BEGIN{RS="[^\n]*:"}
  2. /20070521/{printf a$0}
  3. {a=RT}' urfile
复制代码



ps. I use gawk

[ 本帖最后由 waker 于 2007-5-21 13:36 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2007-05-21 14:06 |只看该作者
awk: (FILENAME=talog FNR=131) fatal: not enough arguments to satisfy format string


这个是什么问题? 一行的字符太多?

论坛徽章:
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 [报告]
发表于 2007-05-21 14:14 |只看该作者
printf函数格式用错了,少了参数

论坛徽章:
0
9 [报告]
发表于 2007-05-21 14:54 |只看该作者
原帖由 waker 于 2007-5-21 14:14 发表
printf函数格式用错了,少了参数



格式用错?


  1. gawk 'BEGIN{RS="[^\n]*:"} /136816189/ {printf a$0} {a=RT}' soapmsg
复制代码


跟你的例子一样啊

论坛徽章:
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
10 [报告]
发表于 2007-05-21 15:00 |只看该作者
关键是我们看不到你的数据,不知道[^\n]*:在你那里匹配什么
举个例子吧
[waker@proxy ~]$ awk 'BEGIN{a="123";printf a}'
123[waker@proxy ~]$ awk 'BEGIN{a="123%f";printf a}'
awk: cmd. line:1: fatal: not enough arguments to satisfy format string
        `123%f'
            ^ ran out for this one
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP