免费注册 查看新帖 |

Chinaunix

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

关于awk的RS变量 [复制链接]

论坛徽章:
0
发表于 2010-11-13 14:49 |显示全部楼层
有这样格式的一个文件
Name1
Job1
Addr1

Name2
Job2
Addr2

....

我想获得Addr字段,这样写
  1. awk 'BEGIN { FS="\n" ; RS=""} {print $3}' file
复制代码
没有问题,如果我把RS改成RS="^$"就只能得到Addr1,其他的都没有这是为什么?要是他不支持正则表达式那也应该一行都没有啊

论坛徽章:
0
发表于 2010-11-13 21:06 |显示全部楼层
[root@localhost ~]# cat file
Name1
Job1
Addr1

Name2
Job2
Addr2

[root@localhost ~]# sed -n 'l' file
Name1$
Job1$
Addr1$
$
Name2$
Job2$
Addr2$
$

因为你指定了\n(即换行符是字段分隔符),所以上面的文件只存在一条记录,假设我把字段分隔符用逗号来表示,这条记录就是下面这样的:
name1,job1,addr1,,name2,job2,addr2,,

所以才有下面的输出:
[root@localhost ~]# awk 'BEGIN { FS="\n" ; RS="^$"} {print $1 " " $5 " " $6}' file
Name1 Name2 Job2

论坛徽章:
0
发表于 2010-11-13 21:08 |显示全部楼层
其实有一段时间我也遇到过这个问题,也困惑了我一段时间,后来想想应该就是这个原因,所以应该尽量不要用换行来表示字段分隔符

论坛徽章:
0
发表于 2010-11-13 21:44 |显示全部楼层
谢谢你的回复,你的意思是不是说^$这个正则表达式是贪婪匹配的,实际上他是到最后一个空行才匹配结束的,这样的话就是一个记录了。回复 2# ocpdba591

论坛徽章:
0
发表于 2010-11-13 22:04 |显示全部楼层
我是这样理解的:因为默认的换行符是\n,而现在\n被指定为字段分隔符了,现在看起来的“空行”其实是一个空的字段
看这行:
Addr1\n
\n
然后你把\n看成是逗号,上面这个就变成了Addr1,null,Name2
^$并不会匹配空字段的

论坛徽章:
0
发表于 2010-11-13 22:06 |显示全部楼层
理解了!!

论坛徽章:
0
发表于 2010-11-13 22:30 |显示全部楼层
最后,如果你真的想处理这样的情况,可以用sed预处理一下:

[root@localhost ~]# sed -n 'l' file|sed 's/\$$/,/;s/^,$/;/'|awk 'BEGIN{RS=";";FS=","} {print $2 " " $3}'

Job1
Addr1

Job2
Addr2

[root@localhost ~]# cat file
Name1
Job1
Addr1

Name2
Job2
Addr2

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
发表于 2010-11-14 00:22 |显示全部楼层
回复 1# rpbear


    因为先进行记录分割后进行字段分割,而RS='^$'在你的文件中并没有匹配,换句话说,整个文件只有一条记录。

     这与FS的设置无关。

论坛徽章:
0
发表于 2010-11-14 11:09 |显示全部楼层
如果用sed的话这样 sed -n '/Add/p' file 不知道符合你要的结果吗

论坛徽章:
0
发表于 2010-11-14 11:17 |显示全部楼层
谢谢,我只是对为什么会有这样的问题感兴趣不只是为了获取数据呵呵回复 9# zzy7186
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP