免费注册 查看新帖 |

Chinaunix

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

[文本处理] shell获取特殊行记录 [复制链接]

论坛徽章:
0
发表于 2016-06-16 10:19 |显示全部楼层
各位好,我有一个类似如下格式的文件
  1. line10
  2. x3
  3. x2
  4. x1
  5. x4
  6. line11
  7. x1
  8. x2
  9. x3
  10. x4
  11. line12
  12. x4
  13. x2
  14. x3
  15. x1
复制代码
我想通过shell命令获取以line开头的行,然后匹配到x1行的内容,line* 和 x1之间间隔的行数不定
我想尝试用sed 或 awk 完成这个需求,还请大牛给指点指点~


获取后的格式:
  1. line10        x1
  2. line11        x1
  3. line12        x1
复制代码

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
发表于 2016-06-16 10:25 |显示全部楼层
本帖最后由 moperyblue 于 2016-06-16 12:03 编辑

每个line*下面是不是一定有x1?
如果这样=>
  1. grep -E '^line|x1'|xargs -n2
  2. sed '/^line/h;/x1/{H;g;s/\n/ /p};d
  3. awk '/^line/{s=$0}/x1/{print s FS $0}'
复制代码

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
发表于 2016-06-16 10:28 |显示全部楼层

这样??
  1. awk '/line/{h=$0}/x1/{if(h)print h"\t"$0;h=""}' file
复制代码

论坛徽章:
0
发表于 2016-06-16 10:33 |显示全部楼层
太强大了,膜拜
回复 2# moperyblue


   

论坛徽章:
0
发表于 2016-06-16 10:36 |显示全部楼层
测试结果就是想要的,强烈感谢
回复 3# reyleon


   

论坛徽章:
737
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
发表于 2016-06-16 10:39 |显示全部楼层
回复 1# ontherd

  1. sed -n '/^line/{h;:1;n;/^x1/!b1;H;g;s/\n/\t/;p}' i
  2. line10  x1
  3. line11  x1
  4. line12  x1
复制代码

论坛徽章:
1
天蝎座
日期:2014-01-15 16:44:29
发表于 2016-06-16 11:38 |显示全部楼层
awk '/^line/{s=$0;next}{if($0=="x1")print s," ",$0}'

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
发表于 2016-06-16 12:36 |显示全部楼层
  1. sed -nr '/^line/h;/x1/{H;g;s/\n/\t/p}'
复制代码
回复 1# ontherd


   

论坛徽章:
0
发表于 2016-06-16 17:15 |显示全部楼层
我已经被强大的技术折服了。

论坛徽章:
0
发表于 2016-06-16 17:17 |显示全部楼层
sed真得很难理解,能用sed的都是牛人。哈哈
回复 6# Herowinter


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP