awk 系列:如何使用 awk 的 ‘next’ 命令

在 awk 系列的第六节,我们来看一下next命令 ,它告诉 awk 跳过你所提供的所有剩下的模式和表达式,直接处理下一个输入行。

next 命令帮助你阻止运行命令执行过程中多余的步骤。

要明白它是如何工作的, 让我们来分析一下 food_list.txt 它看起来像这样:


  1. Food List Items
  2. No Item_Name Price Quantity
  3. 1 Mangoes $3.45 5
  4. 2 Apples $2.45 25
  5. 3 Pineapples $4.45 55
  6. 4 Tomatoes $3.45 25
  7. 5 Onions $1.45 15
  8. 6 Bananas $3.45 30

运行下面的命令,它将在每个食物数量小于或者等于 20 的行后面标一个星号:


  1. # awk '$4 <= 20 { printf "%s\t%s\n", $0,"*" ; } $4 > 20 { print $0 ;} ' food_list.txt
  2. No Item_Name Price Quantity
  3. 1 Mangoes $3.45 5 *
  4. 2 Apples $2.45 25
  5. 3 Pineapples $4.45 55
  6. 4 Tomatoes $3.45 25
  7. 5 Onions $1.45 15 *
  8. 6 Bananas $3.45 30

上面的命令实际运行如下:

  • 首先,它用$4 <= 20表达式检查每个输入行的第四列(数量(Quantity))是否小于或者等于 20,如果满足条件,它将在末尾打一个星号 (*)
  • 接着,它用$4 > 20表达式检查每个输入行的第四列是否大于20,如果满足条件,显示出来。

但是这里有一个问题, 当第一个表达式用{ printf "%s\t%s\n", $0,"**" ; }命令进行标注的时候在同样的步骤第二个表达式也进行了判断这样就浪费了时间.

因此当我们已经用第一个表达式打印标志行的时候就不再需要用第二个表达式$4 > 20再次打印。

要处理这个问题, 我们需要用到next 命令:


  1. # awk '$4 <= 20 { printf "%s\t%s\n", $0,"*" ; next; } $4 > 20 { print $0 ;} ' food_list.txt
  2. No Item_Name Price Quantity
  3. 1 Mangoes $3.45 5 *
  4. 2 Apples $2.45 25
  5. 3 Pineapples $4.45 55
  6. 4 Tomatoes $3.45 25
  7. 5 Onions $1.45 15 *
  8. 6 Bananas $3.45 30

当输入行用$4 <= 20 { printf "%s\t%s\n", $0,"*" ; next ; }命令打印以后,next命令将跳过第二个$4 > 20 { print $0 ;}表达式,继续判断下一个输入行,而不是浪费时间继续判断一下是不是当前输入行还大于 20。

next命令在编写高效的命令脚本时候是非常重要的,它可以提高脚本速度。本系列的下一部分我们将来学习如何使用 awk 来处理标准输入(STDIN)。

原文发布时间为:2016-07-24

本文来自合作伙伴“Linux中国”

时间: 2024-10-21 09:04:52

awk 系列:如何使用 awk 的 ‘next’ 命令的相关文章

awk系列:在awk中如何使用流程控制语句

当你回顾所有到目前为止我们已经覆盖的 awk 实例,从 awk 系列的开始,你会注意到各种实例的所有指令是顺序执行的,即一个接一个地执行.但在某些情况下,我们可能希望基于一些条件进行文本过滤操作,即流程控制语句允许的那些语句. 在 awk 编程中有各种各样的流程控制语句,其中包括: if-else 语句 for 语句 while 语句 do-while 语句 break 语句 continue 语句 next 语句 nextfile 语句 exit 语句 然而,对于本系列的这一部分,我们将阐述:

awk 系列:在 awk 中如何使用流程控制语句

当你回顾所有到目前为止我们已经覆盖的 awk 实例,从 awk 系列的开始,你会注意到各种实例的所有指令是顺序执行的,即一个接一个地执行.但在某些情况下,我们可能希望基于一些条件进行文本过滤操作,即流程控制语句允许的那些语句. 在 awk 编程中有各种各样的流程控制语句,其中包括: if-else 语句 for 语句 while 语句 do-while 语句 break 语句 continue 语句 next 语句 nextfile 语句 exit 语句 然而,对于本系列的这一部分,我们将阐述:

awk系列:如何让awk使用 Shell 变量

当我们编写 shell 脚本时,我们通常会在脚本中包含其它小程序或命令,例如 awk 操作.对于 awk 而言,我们需要找一些将某些值从 shell 传递到 awk 操作中的方法. 我们可以通过在 awk 命令中使用 shell 变量达到目的,在 awk 系列的这一节中,我们将学习如何让 awk 使用 shell 变量,这些变量可能包含我们希望传递给 awk 命令的值. 有两种可能的方法可以让 awk 使用 shell 变量: 1. 使用 Shell 引用 让我们用一个示例来演示如何在一条 aw

awk 系列:如何使用 awk 按模式筛选文本或字符串

作为 awk 命令系列的第三部分,这次我们将看一看如何基于用户定义的特定模式来筛选文本或字符串. 在筛选文本时,有时你可能想根据某个给定的条件或使用一个可被匹配的特定模式,去标记某个文件或数行字符串中的某几行.使用 awk 来完成这个任务是非常容易的,这也正是 awk 中可能对你有所帮助的几个功能之一. 让我们看一看下面这个例子,比方说你有一个写有你想要购买的食物的购物清单,其名称为 food_prices.list,它所含有的食物名称及相应的价格如下所示: $ cat food_prices.

awk系列:如何使用awk的特殊模式 BEGIN 和 END

在 awk 系列的第八节,我们介绍了一些强大的 awk 命令功能,它们是变量.数字表达式和赋值运算符. 本节我们将学习更多的 awk 功能,即 awk 的特殊模式:BEGIN 和 END. 随着我们逐渐展开,并探索出更多构建复杂 awk 操作的方法,将会证明 awk 的这些特殊功能的是多么强大. 开始前,先让我们回顾一下 awk 系列的介绍,记得当我们开始这个系列时,我就指出 awk 指令的通用语法是这样的: # awk 'script' filenames  在上述语法中,awk 脚本拥有这样

awk 系列:如何使用 awk 输出文本中的字段和列

在 Awk 系列的这一节中,我们将看到 awk 最重要的特性之一,字段编辑. 首先我们要知道,Awk 能够自动将输入的行,分隔为若干字段.每一个字段就是一组字符,它们和其他的字段由一个内部字段分隔符分隔开来. Awk 输出字段和列 如果你熟悉 Unix/Linux 或者懂得 bash shell 编程,那么你应该知道什么是内部字段分隔符(IFS)变量.awk 中默认的 IFS 是制表符和空格. awk 中的字段分隔符的工作原理如下:当读到一行输入时,将它按照指定的 IFS 分割为不同字段,第一组

awk 系列:如何让 awk 使用 Shell 变量

当我们编写 shell 脚本时,我们通常会在脚本中包含其它小程序或命令,例如 awk 操作.对于 awk 而言,我们需要找一些将某些值从 shell 传递到 awk 操作中的方法. 我们可以通过在 awk 命令中使用 shell 变量达到目的,在 awk 系列的这一节中,我们将学习如何让 awk 使用 shell 变量,这些变量可能包含我们希望传递给 awk 命令的值. 有两种可能的方法可以让 awk 使用 shell 变量: 1. 使用 Shell 引用 让我们用一个示例来演示如何在一条 aw

awk 系列:awk 怎么读取标准输入(STDIN)

在 awk 系列的前几节,我们看到大多数操作都是从一个文件或多个文件读取输入,或者你想要把标准输入作为 awk 的输入. 在 awk 系列的第七节中,我们将会看到几个例子,你可以筛选其他命令的输出代替从一个文件读取输入作为 awk 的输入. 我们首先从使用 dir 命令开始,它类似于 ls 命令,在第一个例子下面,我们使用 dir -l 命令的输出作为 awk 命令的输入,这样就可以打印出文件拥有者的用户名,所属组组名以及在当前路径下他/她拥有的文件. # dir -l | awk '{prin

awk 系列:怎样使用 awk 变量、数值表达式以及赋值运算符

我觉得 awk 系列 将会越来越好,在本系列的前七节我们讨论了在 Linux 中处理文件和筛选字符串所需要的一些 awk 命令基础. 在这一部分,我们将会进入 awk 更高级的部分,使用 awk 处理更复杂的文本和进行字符串过滤操作.因此,我们将会讲到 Awk 的一些特性,诸如变量.数值表达式和赋值运算符. 学习 Awk 变量,数值表达式和赋值运算符 你可能已经在很多编程语言中接触过它们,比如 shell,C,Python 等:这些概念在理解上和这些语言没有什么不同,所以在这一小节中你不用担心很