找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 21397|回复: 10

[问题求助] [已解决]gawk中的getline函数是如何循环文本的?

[复制链接]
发表于 2011-10-4 12:32:45 | 显示全部楼层 |阅读模式
本帖最后由 FOR 于 2011-10-4 23:14 编辑

gawk中的getline函数是如何循环文本的
下例代码,为何只循环 b.txt 一次,按说应该循环3次才对呀?要如何才能循环3次
代码1

  1. BEGIN {
  2.     for (i=1;i<=3;i++) {
  3.         print i,"i"
  4.         while (getline<"b.txt"){print $0}
  5.     }
  6. }
复制代码
下面代码为何会把b.txt的最后一行多显示一次?
代码2

  1. gawk "{while(getline<"b.txt"){print $0}}{print}" a.txt
复制代码

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2011-10-4 12:56:54 | 显示全部楼层
先看代码2,改成这样你能理解吗?
  1. gawk "{print "a.txt:"$0;while(getline<"b.txt"){print "b.txt:"$0}}{print}" a.txt
复制代码
如果还是想不清楚,我再解释。
 楼主| 发表于 2011-10-4 13:05:51 | 显示全部楼层
回复 2# awk

这样改和我那个没什么区别啊?显示结果也是一样,只是多显示了个文件名
显示结果
  1. a.txt:a1
  2. b.txt:bb1
  3. b.txt:bb2
  4. b.txt:bb3
  5. bb3
  6. a.txt:a2
  7. a2
  8. a.txt:a3
  9. a3
复制代码
 楼主| 发表于 2011-10-4 13:11:05 | 显示全部楼层
哦,代码2 我理解了。。。
发表于 2011-10-4 13:12:53 | 显示全部楼层
回复 3# FOR


顶楼的代码2是这样执行的:

开始的时候读a.txt的第一行,$0=a1
进入while循环:
    读b.txt的第一行,$0=bb1,print $0输出bb1
    读b.txt的第二行,$0=bb2,print $0输出bb2
    读b.txt的第三行,$0=bb3,print $0输出bb3
退出while循环,因为while最后一次循环把$0设置成了bb3,所以print输出bb3
读a.txt的第二行,$0=a2,print输出a2
读a.txt的第三行,$0=a2,print输出a3
发表于 2011-10-4 13:13:33 | 显示全部楼层
回复 4# FOR


我就说嘛,想一会就明白了
 楼主| 发表于 2011-10-4 13:18:48 | 显示全部楼层
回复 6# awk

多谢多谢,还是需要人指点,我之前想了很久实在想不明白才发帖的,钻进牛角尖了。
第一个问题呢?期待您的解答。
发表于 2011-10-4 19:15:00 | 显示全部楼层
回复 7# FOR
  1. gawk "BEGIN{for(i=1;i<=3;i++){print i,"i";while(getline<"b.txt")print $0;close("b.txt")}}"
复制代码

评分

参与人数 1技术 +1 收起 理由
FOR + 1 多谢!

查看全部评分

 楼主| 发表于 2011-10-4 19:50:14 | 显示全部楼层
回复 8# awk

搜了下
  1. close(filename) 将输入或输出的档案 filename 关闭。
复制代码
可是如何理解?
难道说 getline 在循环 b.txt 的时候是把该文件打开了的,在未关闭之前无法重新循环?
顺便在问句,gawk 中有暂停的语句吗?
发表于 2011-10-4 22:43:02 | 显示全部楼层
回复 9# FOR


可以这样想象一下:
getline在逐行读文件的时候,有个指针指向当前处理的行。第一for循环里面,while把整个文件读完了,指针指向文件尾部。第二个for循环的时候,会认为文件真读完了。
要想重复读,需要先close,然后再从头getline
 楼主| 发表于 2011-10-4 23:13:46 | 显示全部楼层
回复 10# awk

嗯,多谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 00:49 , Processed in 0.019873 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表