[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] [已解决]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
复制代码
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

回复 10# awk

嗯,多谢!

TOP

回复 9# FOR


可以这样想象一下:
getline在逐行读文件的时候,有个指针指向当前处理的行。第一for循环里面,while把整个文件读完了,指针指向文件尾部。第二个for循环的时候,会认为文件真读完了。
要想重复读,需要先close,然后再从头getline

TOP

回复 8# awk

搜了下
  1. close(filename) 将输入或输出的档案 filename 关闭。
复制代码
可是如何理解?
难道说 getline 在循环 b.txt 的时候是把该文件打开了的,在未关闭之前无法重新循环?
顺便在问句,gawk 中有暂停的语句吗?

TOP

回复 7# FOR
  1. gawk "BEGIN{for(i=1;i<=3;i++){print i,"i";while(getline<\"b.txt\")print $0;close(\"b.txt\")}}"
复制代码
1

评分人数

    • FOR: 多谢!技术 + 1

TOP

回复 6# awk

多谢多谢,还是需要人指点,我之前想了很久实在想不明白才发帖的,钻进牛角尖了。
第一个问题呢?期待您的解答。

TOP

回复 4# FOR


我就说嘛,想一会就明白了

TOP

回复 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

TOP

哦,代码2 我理解了。。。

TOP

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

TOP

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

TOP

返回列表