第7.8节:awk语言 next 语句
awk语言中的next语句会立即停止处理当前记录,转而处理下一条记录,跳过当前记录的后续规则和当前规则中next之后的操作。与getline不同,getline会读取下一条记录但继续执行当前操作。next类似于循环中的continue,跳到循环末尾读取新记录。例如可用next跳过字段数不符的记录。next不能在BEGINFILE/ENDFILE规则使用,BEGIN/END规则中使用行为未定义,函数
1 第7.8节:awk语言 next 语句
next 语句会迫使 awk 立即停止处理当前记录,转而处理下一条记录。这意味着,当前记录不会再执行后续规则,当前规则中 next 之后的操作也不会执行。
将其与 getline 函数的效果对比。getline 也会让 awk 立即读取下一条记录,但它不会改变控制流(即当前操作的剩余部分会用新输入记录继续执行 )。
从最高层面来看,awk 程序的执行过程是一个循环:读取一条输入记录,然后用每条规则的模式去匹配它。如果你把这个循环想象成一个 for 语句,其循环体包含这些规则,那么 next 语句就类似于 continue 语句。它会跳到这个隐式循环体的末尾,执行增量操作(即读取下一条记录 )。
例如,假设一个 awk 程序只处理有四个字段的记录,遇到无效输入时不能出错。为了不把程序其他部分搞复杂,可以在开头附近写一个“剔除”规则,如下:
NF != 4 {
printf("%s:%d: skipped: NF != 4\n", FILENAME, FNR) > "/dev/stderr"
next
}
由于 next 语句的存在,程序后续的规则不会处理这条无效记录。错误消息被重定向到标准错误输出流,这是错误消息应有的去向。
如果 next 语句导致输入读完(到达末尾 ),那么所有 END 规则中的代码会执行。
next 语句不允许在 BEGINFILE 和 ENDFILE 规则内使用。
根据 POSIX 标准,如果在 BEGIN 或 END 规则内使用 next 语句,行为是未定义的。gawk 会将其视为语法错误。虽然 POSIX 标准不禁止在函数体内使用 next 语句,但大多数其他 awk 实现不允许这样做。和其他语句一样,函数体内的 next 语句会读取下一条记录,并从程序的第一条规则开始处理该记录。
作者声明:本文用于记录和分享作者的学习心得,可能有部分文字或示例来自AI平台,如:豆包、DeepSeek(硅基流动)(注册链接)等,由于本人水平有限,难免存在表达错误,欢迎留言交流和指教!
Copyright © 2022~2025 All rights reserved.
更多推荐


所有评论(0)