完整教程:第7.9节:awk语言 nextfile 语句
1 第7.9节:awk语言 nextfile 语句
nextfile 语句与 next 语句类似。不过,next 是放弃当前记录的处理,而 nextfile 是指示 awk 停止处理当前数据文件。
执行 nextfile 语句后,FILENAME 会更新为命令行中下一个数据文件的名称,FNR 重置为 1,处理从程序的第一条规则重新开始。如果 nextfile 语句导致输入到达末尾,那么所有 END 规则中的代码会执行。例外情况是在 END 规则内执行 nextfile 语句,此时程序会立即停止。
当有很多数据文件要处理,但无需处理每个文件的每条记录时,nextfile 语句很有用。如果没有 nextfile,要切换到下一个数据文件,程序得继续扫描不需要的记录。nextfile 语句能更高效地实现这一点。
在 gawk 中,执行 nextfile 还会引发其他操作:如果当前不在 END 规则中,会执行所有 ENDFILE 规则;ARGIND 会递增;如果 ARGIND 尚未引入,还会执行所有 BEGINFILE 规则。
gawk 还有一个特殊的使用场景:在 BEGINFILE 规则内使用 nextfile 可跳过会导致 gawk 因致命错误退出的文件。这种特殊情况下,不会执行 ENDFILE 规则。
虽然看似 close(FILENAME) 能实现与 nextfile 相同的功能,但实际并非如此。close() 是用于关闭通过重定向打开的文件、管道和协进程,与 awk 处理 ARGV 中列出文件的主要流程无关。
注意:多年来,nextfile 是一种常见的扩展功能。2012 年 9 月,它被接纳并纳入 POSIX 标准。
当前版本的 BWK awk 和 mawk 也支持 nextfile 。不过,它们不允许在函数体内使用 nextfile 语句。gawk 允许;函数体内的 nextfile 会读取下一个文件的第一条记录,并从程序的第一条规则开始处理该记录,和其他 nextfile 语句的行为一样。
作者声明:本文用于记录和分享作者的学习心得,可能有部分文字或示例来自AI平台,如:豆包、DeepSeek(硅基流动)(注册链接)等,由于本人水平有限,难免存在表达错误,欢迎留言交流和指教!
Copyright © 2022~2025 All rights reserved.

浙公网安备 33010602011771号