![Board logo](images/default/logo.gif)
标题: [问题求助] [已解决]gawk中的getline函数是如何循环文本的? [打印本页]
作者: FOR 时间: 2011-10-4 12:32 标题: [已解决]gawk中的getline函数是如何循环文本的?
本帖最后由 FOR 于 2011-10-4 23:14 编辑
gawk中的getline函数是如何循环文本的
下例代码,为何只循环 b.txt 一次,按说应该循环3次才对呀?要如何才能循环3次
代码1- BEGIN {
- for (i=1;i<=3;i++) {
- print i,"i"
- while (getline<"b.txt"){print $0}
- }
- }
复制代码
下面代码为何会把b.txt的最后一行多显示一次?
代码2- gawk "{while(getline<\"b.txt\"){print $0}}{print}" a.txt
复制代码
作者: awk 时间: 2011-10-4 12:56
先看代码2,改成这样你能理解吗?- gawk "{print \"a.txt:\"$0;while(getline<\"b.txt\"){print \"b.txt:\"$0}}{print}" a.txt
复制代码
如果还是想不清楚,我再解释。
作者: FOR 时间: 2011-10-4 13:05
回复 2# awk
这样改和我那个没什么区别啊?显示结果也是一样,只是多显示了个文件名
显示结果- a.txt:a1
- b.txt:bb1
- b.txt:bb2
- b.txt:bb3
- bb3
- a.txt:a2
- a2
- a.txt:a3
- a3
复制代码
作者: FOR 时间: 2011-10-4 13:11
哦,代码2 我理解了。。。
作者: awk 时间: 2011-10-4 13:12
回复 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
作者: awk 时间: 2011-10-4 13:13
回复 4# FOR
我就说嘛,想一会就明白了![](http://bbs.bathome.net/images/smilies/default/lol.gif)
作者: FOR 时间: 2011-10-4 13:18
回复 6# awk
多谢多谢,还是需要人指点,我之前想了很久实在想不明白才发帖的,钻进牛角尖了。
第一个问题呢?期待您的解答。
作者: awk 时间: 2011-10-4 19:15
回复 7# FOR - gawk "BEGIN{for(i=1;i<=3;i++){print i,"i";while(getline<\"b.txt\")print $0;close(\"b.txt\")}}"
复制代码
作者: FOR 时间: 2011-10-4 19:50
回复 8# awk
搜了下- close(filename) 将输入或输出的档案 filename 关闭。
复制代码
可是如何理解?
难道说 getline 在循环 b.txt 的时候是把该文件打开了的,在未关闭之前无法重新循环?
顺便在问句,gawk 中有暂停的语句吗?
作者: awk 时间: 2011-10-4 22:43
回复 9# FOR
可以这样想象一下:
getline在逐行读文件的时候,有个指针指向当前处理的行。第一for循环里面,while把整个文件读完了,指针指向文件尾部。第二个for循环的时候,会认为文件真读完了。
要想重复读,需要先close,然后再从头getline
作者: FOR 时间: 2011-10-4 23:13
回复 10# awk
嗯,多谢!
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |