next 和 exit 语句

使用 next 和 exit 语句进行程序流控制。
next 语句停止处理当前记录,从输入文件中读取下一条记录,并在 awk 程序的开头重新开始。
exit 语句终止 awk 程序。
可能会给出退出状态,并将其传递给 awk 的父进程。

可以停止处理文件的任何记录。
下一条记录被读入并且 awk 程序以这条新记录再次开始。
告诉 awk 获取下一条记录的语句是下一条语句。
通常,会执行测试,如果测试为真(或者为假,取决于适当情况),则丢弃当前记录并读取下一条记录。

exit 语句的使用方式与通常进行的测试类似。
如果测试为真(或者假,取决于什么是合适的),则程序终止,这是通过 exit 语句完成的。

调用 exit 时,整个 awk 进程将退出。
允许退出的唯一参数是可选的退出状态。
当 awk 进程终止时,它会将退出状态传递给其父进程。
如果参数与 exit 一起使用,则这是返回给 awk 父进程的退出状态。

逻辑运算符

我们可以在任意两个条件表达式之间使用两个逻辑运算符来连接表达式。
条件表达式可以是数值比较或者字符串比较,也可以是数值和字符串比较的混合。
逻辑 AND 要求在组合表达式为真之前,两个连接表达式都为真。
OR 运算符要求其中只有一个为真。
存在一元 NOT 运算符(感叹号),我们可以使用它来反转表达式的逻辑值。

  • && 逻辑与
  • ||逻辑或者
  • !逻辑非

例如:

$ awk '{if (  ~ /E/ &&  > .92) print , , }' data.file 
WE .97 Kelly 
NE .94 Nichols
on it road .com

awk 语言中的 for 循环

for 循环有两种变体,一种借鉴自 C 编程语言,另一种用于处理 awk 数组。

for (setup_statement ; condition ; step_statement) 
    {statements }
for (indexvar in arrayname)
    {statements }

以下示例显示了第一种 for 循环。
循环对记录中的每个字段执行一次。
当 a 的值达到 NF 的值(当前记录中的字段数)时,循环终止,从文件中读取下一条记录以重新开始该过程。

$ cat for.awk 
{ for (a = 1; a <= NF; a++) print $a }
$ awk -f for.awk data.file 
northwest 
NW 
oirl 
Craig 
3.0 
.98 
3 
4 
western 
WE 
Sharon 
Kelly 
5.3 
... (output truncated)

对数组使用循环

第二种 for 循环明确用于 awk 数组,它对每个数组元素执行一次。

for (index_var in array_name) { statements }

index_var 变量依次包含每个数组下标。
对于 awk 数组,并不总是可能知道有多少个索引。
因此,这个 for 循环的语法允许通过创建一个特殊变量(for 循环括号中的第一个单词)来保存每个数组索引的值来处理数组。
括号中的第二个字总是 in,第三个字是要处理的数组的名称。
for 循环对数组的每个索引(数组的每个元素)执行一次。
每次通过,特殊变量(括号中的第一个单词)的值都会更改为数组的下一个索引。

if 语句

if 语句可以有两个分支:一个 if 分支和一个 else 分支。
如果条件为真,则执行 if 分支;如果条件为假,则执行 else 分支。

if (condition) {
    statements 
} else { 
	statements }

我们可以嵌套 if 语句。
当检查嵌套的 if 语句并且一个或者多个 if 语句有一个 else 语句时,很难知道 if else 是用哪个语句运行的。
简单的规则是:如果还没有自己的 else,则每个 else 都在最接近的位置上工作;例如:

if (condition) { 
    if (condition) { 
	    statements         
	} else {
	    statements          
	 } 
}

在前面的示例中,else 与第二个 if 语句一起使用。
使用缩进有助于减轻一些潜在的混淆。

continue 语句

continue 语句停止循环体的当前迭代,返回到循环控制表达式。

while (condition) {
    statements  
    continue  
    statements 
}

continue 语句停止循环中语句体的执行,并将执行发送到循环的控制部分。
在 while 循环或者 do while 循环中,控制部分是条件表达式。
再次测试条件,如果为真,则再次进入循环体,过程继续。

在 for 循环(不是明确用于数组的那种)中,执行移动到循环的步骤部分(括号中的第三个表达式)。
执行 step 语句并再次测试条件。
如果条件为真,则再次执行循环。
在与数组一起使用的 for 循环中(for (indexvar in arrayname)),执行再次从循环体的顶部开始,但会处理下一个数组元素。
旧的数组元素被遗忘并丢弃。

对于每种类型的循环语句, continue 语句的效果是:

while and do while                                    # The condition is tested again 
for (setup_statement; condition; step_statement)      # The step is taken, and then the condition is tested 
for (indexvar in arrayname)                           # The next array element is processed

非数字数组索引

awk 中的数组与某些编程语言中的数组不同,它们在使用之前不必声明。
此外,索引(方括号中的值)不必是数字。
索引值是关联的,这意味着它可以是与正在存储的数据相关的任何内容。

$ cat bigcats 
lions 
tigers 
leopards 
tigers 
leopards 
leopards 
tigers 
leopards
$ awk '{a[]++} 
> END {for (c in a) print c, a[c]}' bigcats 
tigers 3 
lions 1 
leopards 4

在前面的示例中,正在处理的文件包含一个大型cat 科动物列表。
awk 语句读取每条记录,创建一个名为 a 的数组。
元素的索引是记录的第一个字段(cat 的名字)。
每个数组元素的值总是从 0 开始(创建数组元素时)。
该元素递增(使用 ++ 运算符)。
因此,在第一条语句的末尾,有一个名称为的变量:

a[lions]

被赋予 1 的值。

这将贯穿整个文件。
当在读取之前已经处理过的cat 时,该索引的数组元素已经存在。
因此,当前值加 1.
因此,在文件末尾,每种类型的 cat 都存在一个数组元素,每个元素的值是该 cat 在文件中遇到的次数。

for 循环创建一个变量 c 来表示每个索引(不知道会有多少)并处理 a 数组。
对于每个元素,c 的值(cat 名)和元素的值(遇到cat 名的次数)都会打印出来。

在 awk 脚本中使用 while for循环

awk 编程语言包含许多在 shell 脚本中使用的编程概念。
条件语句,例如 if 语句和循环,如下面的也可以用在 awk 编程中。

  • while 循环
  • do while 循环
  • for 循环

break 和 continue 语句

我们可以使用 break 语句跳出循环或者完全停止其执行。
循环体中跟在 break 语句之后的语句不会被执行,并且从循环体之后的第一行继续执行。

while (condition) {
    statements 
    break  
    statements 
} 
more_awk_statements

do while 循环

do while 循环遵循与 while 循环相同的原理,只是在执行循环体之后测试条件。
语法是:

do  
    { statements }
while (condition)

while 循环和 do while 循环之间的主要区别在于 do while 循环至少执行一次。
例如,假设 while 循环和 do while 循环的条件为假。
在 while 循环中,首先测试条件,因为它为假,所以不执行循环体。
在 do while 循环中,首先执行循环体,然后测试条件。
因为条件为假,循环体不再执行,但它确实执行了一次。

下面的示例使用 do while 循环来单独打印一行中每条记录的每个字段。
它在报告每条记录后打印一个空行。

{ i = 1 }
{ do { 
      {  print $i ; i++ } 
	} while ( i <= NF ) 
}
{ print "\n" }

使用 awk 语言进行条件打印

在最简单的形式中,if 语句测试一个条件,如果该条件为真,则执行这些语句。
要比较条件中的两个数字,请使用以下关系运算符之一:

  • == 等于
  • != 不等于
  • 大于

  • = 大于或者等于

  • <= 小于或者等于

例如:

$ awk '{num =  / ; if (num > 6) print , num}' data.file 
southeast 7.14286 
central 6.06383
$ awk '{if ( > .92) print , , }' data.file | sort 
CT .94 Watson 
NE .94 Nichols 
NW .98 Craig 
SO .95 Chin 
WE .97 Kelly

字符串比较以及关系和逻辑运算符

要比较条件中的两个字符串,请使用如下所示的关系运算符之一:

  • == 等于
  • != 不等于
  • ~ 包含一个 /RE/
  • !~ 不包含 /RE/

~ 和 !~ 运算符需要一些解释。
左操作数是要搜索的文本区域,可以是整个记录 ($0) 或者记录的特定字段 ($1)。
正确的操作数是正在搜索的斜杠 (/RE/) 中的正则表达式。
如果文本包含正则表达式,则条件为真。
我们可以在条件的正则表达式中使用所有已描述的正则表达式字符。

下一个示例将模式显示为条件语句(数字或者字符串)。
测试每条记录以查看该记录的条件是否为真。
如果为真,则对该记录采取 ACTION(在本例中为打印)。
在第二个示例中,没有列出 ACTION,因此采用默认操作来打印整个输入记录。

$ awk '{if ( ~ /E/) print , }' data.file 
WE western 
SE southeast 
EA eastern 
NE northeast
$ awk ' !~ /E/' data.file 
northwest       NW      oirl Craig      3.0 .98 3       4 
southwest       SW      Chris Foster    2.7 .8  2       18 
southern        SO      Jan Chin        5.1 .95 4       15 
north           NO      Val Shultz      4.5 .89 5       9 
central         CT      Sheri Watson    5.7 .94 5       13

awk 语言中的 while 循环

当循环包含在 awk 脚本或者命令中时,循环对处理的每条记录执行一次。
对于每条记录,循环都会执行,直到条件失败。

while 循环是可用的最简单的循环。
它测试 if 语句使用的相同类型的条件。
在循环结构中,用大括号括起来的单个语句或者多个语句称为循环体。
如果条件为真,则执行循环体;如果条件为假,awk 继续执行 awk 程序。
while 循环的语法是:

while (condition)
    statement
while (condition) { 
    statements    
	}

下面的示例使用 while 循环打印出一行中每条记录的每个字段。
它在报告每条记录后打印一个空行。

{ i = 1 }
{ while ( i <= NF )
    { print $i ; i++ } }
{ print "\n" }
日期:2020-09-17 00:14:56 来源:oir作者:oir