免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: bulletmarquis
打印 上一主题 下一主题

[文本处理] (21楼又有新问题,请大神关注)getline为何取不到最后一行 [复制链接]

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
21 [报告]
发表于 2014-09-29 11:28 |只看该作者
回复 18# jason680

@blackold
@Shell_HAT
@reyleon
@ly5066113
   

还有一个问题,为啥我在最后加一个空格,输出就会多三个空行出来呢?

这三行空白,看似接近,其实是不一样的。。。第一行是一个空格,第二行是三个空格,第三行才是真正的空行
  1. echo "a+b_c+d_ "|awk -vRS="[+_]" '{printf $0"  ";getline;print $0}'
  2. a  b
  3. c  d

  4.    

  5. echo "a+b_c+d_"|awk -vRS="[+_]" '{printf $0"  ";getline;print $0}'
  6. a  b
  7. c  c
复制代码

论坛徽章:
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
22 [报告]
发表于 2014-09-29 11:36 |只看该作者
回复 21# bulletmarquis


还是前面的问题。这样就正常了:
  1. $ echo "a+b_c+d_"|awk -vRS="[[:punct:]]" '{printf $0"==>";printf getline;print}'|nl -ba
  2.      1  a==>1b
  3.      2  c==>1d
  4.      3
  5.      4  ==>0
  6.      5

  7. Robert@server ~/tmp
  8. $ echo "a+b_c+d_ "|awk -vRS="[[:punct:]]" '{printf $0"==>";printf getline;print}'|nl -ba
  9.      1  a==>1b
  10.      2  c==>1d
  11.      3
  12.      4  ==>0
  13.      5
复制代码

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
23 [报告]
发表于 2014-09-29 11:41 |只看该作者
回复 22# blackold


    黑哥果然暴力!

   部分情况确实可以用[[:punct:]]解决

论坛徽章:
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
24 [报告]
发表于 2014-09-29 11:57 |只看该作者
回复 23# bulletmarquis


    我还没明白呢?
  1. [root@localhost ~]# echo "a_b_c_d_e"|awk -vRS="_" '{printf $0"==>";printf getline;print}'
  2. a==>1b
  3. c==>1d
  4. e
  5. ==>0e

  6. [root@localhost ~]#
复制代码
为什么会输出5行啊?

论坛徽章:
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
25 [报告]
发表于 2014-09-29 12:00 |只看该作者
回复 24# reyleon


    echo 有个newline

论坛徽章:
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
26 [报告]
发表于 2014-09-29 12:04 |只看该作者
回复 25# blackold


    额, 是哦, 我X {:2_176:}

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
27 [报告]
发表于 2014-09-29 14:15 |只看该作者
回复 1# bulletmarquis

是getline var这种用法在作怪,和怎么setup RS无关

getline var           Set var from next input record; set NR, FNR.
  1. seq 9|awk 'BEGIN{print "Instance\t$0\tv\tNR"}{print "before getline: "$0,v,NR;getline v;print "after  getline: "$0,v,NR}' OFS="\t"
  2. Instance        $0        v        NR
  3. before getline: 1                1
  4. after  getline: 1        2        2
  5. before getline: 3        2        3
  6. after  getline: 3        4        4
  7. before getline: 5        4        5
  8. after  getline: 5        6        6
  9. before getline: 7        6        7
  10. after  getline: 7        8        8
  11. before getline: 9        8        9
  12. after  getline: 9        8        9
复制代码

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
28 [报告]
发表于 2014-09-29 14:23 |只看该作者
回复 27# yinyuemi

你说的是奇数行的情况,但如果是偶数行,和RS的设置貌似有点关系。。。
   

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
29 [报告]
发表于 2014-09-29 14:25 |只看该作者
回复 28# bulletmarquis


    如果是偶数行,正好可以被getline var获取到最后一行,
  1. seq 10|awk 'BEGIN{print "Instance\t$0\tv\tNR"}{print "before getline: "$0,v,NR;getline v;print "after  getline: "$0,v,NR}' OFS="\t"
  2. Instance        $0        v        NR
  3. before getline: 1                1
  4. after  getline: 1        2        2
  5. before getline: 3        2        3
  6. after  getline: 3        4        4
  7. before getline: 5        4        5
  8. after  getline: 5        6        6
  9. before getline: 7        6        7
  10. after  getline: 7        8        8
  11. before getline: 9        8        9
  12. after  getline: 9        10        10
复制代码

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
30 [报告]
发表于 2014-09-29 14:27 |只看该作者
回复 29# yinyuemi


    恩,照常理应该是获取最后一行的,所以这个帖子前面几楼,就是在讨论当RS为[|_]这种包含元字符的时候,getline获取不到最后一行的问题。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP