Board logo

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

作者: FOR    时间: 2011-10-4 12:32     标题: [已解决]gawk中的getline函数是如何循环文本的?

本帖最后由 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
复制代码

作者: awk    时间: 2011-10-4 12:56

先看代码2,改成这样你能理解吗?
  1. gawk "{print \"a.txt:\"$0;while(getline<\"b.txt\"){print \"b.txt:\"$0}}{print}" a.txt
复制代码
如果还是想不清楚,我再解释。
作者: FOR    时间: 2011-10-4 13:05

回复 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
复制代码

作者: 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


我就说嘛,想一会就明白了
作者: FOR    时间: 2011-10-4 13:18

回复 6# awk

多谢多谢,还是需要人指点,我之前想了很久实在想不明白才发帖的,钻进牛角尖了。
第一个问题呢?期待您的解答。
作者: awk    时间: 2011-10-4 19:15

回复 7# FOR
  1. 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

搜了下
  1. 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://www.bathome.net/) Powered by Discuz! 7.2