免费注册 查看新帖 |

Chinaunix

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

请问awk如果指定匹配行到最后一行? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-20 16:18 |只看该作者 |倒序浏览
借用别人的文章内容如下:
-----------------------------------------------------------
附件:复核表
复核表

单位: 小学部                                编号:                                 
系统名称:                             
系统类型(XX):   XX系统            
帐号名称
帐号描述
权限
使用人
备注
CHN0401
部门1组
分部门查询
吴斌

CHN0402
部门2组
查询
李演

CHN0403
部门3组
查询
李路

----------------------------------------------------

要将文档变为
-------------------------------------------
CHN0401 部门1组 分部门查询 吴斌

CHN0402 部门2组 查询 李演

CHN0403 部门3组 查询 李路
-------------------------------------------

我的思路是指定范围,再改变格式输出。
问题1、我用/^CHN0403/,$指定范围提示出错,请问指定从匹配行至最后一行,正确的方法怎样写。
问题2、我想在指定范围后使用BEGIN{}先对FS等赋值,系统提示出错,想来也对,BEGIN是在读入首行前执行的。这有逻辑错误,请问大家针对这个问题,大家是怎样解决的呢?

我写的命令行:
awk '/^CHN/,$ BEGIN{FS="\n";RS="\n\n";ORS="";print "----------------------------------------------------\n"}{{for(i=1;i<=NF;i++)print $i " "}print "\n\n"}' file

这样写有错误,如果去掉前面指定范围那块,可以执行。请大家帮我看看,非常感谢。

[ 本帖最后由 灿烂小猪 于 2008-6-20 16:22 编辑 ]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
2 [报告]
发表于 2008-06-20 16:37 |只看该作者

  1. awk '/^CHN/{s=$0;while(1){getline;if(NF!=0)s=sprintf("%s %s",s,$0);else break;}printf("%s\n\n",s)}'
复制代码

论坛徽章:
0
3 [报告]
发表于 2008-06-20 16:46 |只看该作者
非常感谢版主的回复,这个办法确实和我想的办法不一样。

请问,awk不能用像sed那样的方法指定范围么?

论坛徽章:
0
4 [报告]
发表于 2008-06-21 01:39 |只看该作者
sed -n '/^CHN/,/^$/{/^$/!{H};/^$/{x;s/\n/ /g;p;}}' file

awk '/^CHN/,/^$/{while(1){if($0~/^$/){print;break;};printf $0" ";getline;}}' file

[ 本帖最后由 err7dd 于 2008-6-21 01:45 编辑 ]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
5 [报告]
发表于 2008-06-21 11:44 |只看该作者
原帖由 灿烂小猪 于 2008-6-20 16:46 发表
非常感谢版主的回复,这个办法确实和我想的办法不一样。

请问,awk不能用像sed那样的方法指定范围么?

你所说的指定范围代表的是什么?

论坛徽章:
0
6 [报告]
发表于 2008-06-23 00:41 |只看该作者
sed -n '/^CHN/,$p' file

btw:
if the awk express have BEGIN{},then the range patterns should after the BEGIN{}
eg. awk 'BEGIN{x=1};/^a/,/^b/{print x++ $0}' file

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
7 [报告]
发表于 2008-06-23 08:48 |只看该作者

回复 #1 灿烂小猪 的帖子

请参考这里:
awk中地址表示的小技巧

论坛徽章:
0
8 [报告]
发表于 2008-06-23 10:06 |只看该作者
非常谢谢楼上,学习了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP