网站搜索

如何在 Linux 中通过 Awk 使用“next”命令 - 第 6 部分


在 Awk 系列的第六部分中,我们将了解如何使用 next 命令,该命令告诉 Awk 跳过您提供的所有剩余模式和表达式,而是阅读下一个输入线。

next 命令可以帮助您避免执行我所说的命令执行中浪费时间的步骤。

为了理解它是如何工作的,让我们考虑一个名为 food_list.txt 的文件,如下所示:

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

考虑运行以下命令,该命令将在每行末尾使用 (*) 符号标记数量小于或等于 20 的食品:

# awk '$4 <= 20 { printf "%s\t%s\n", $0,"*" ; } $4 > 20 { print $0 ;} ' food_list.txt 

No	Item_Name		Price		Quantity
1	Mangoes			$3.45		   5	*
2	Apples			$2.45              25
3	Pineapples		$4.45              55
4	Tomatoes		$3.45              25 
5	Onions			$1.45              15	*
6	Bananas	                $3.45              30

上面的命令实际上的工作原理如下:

  1. 首先,它检查每个输入行的第四个字段的数量是否小于或等于20,如果值满足该条件,则打印该值并用(*) 标记 使用表达式一在末尾签名:$4 <= 20
  2. 其次,它检查每个输入行的第四个字段是否大于 20,如果一行满足条件,则使用表达式二打印:$4 > 20

但这里有一个问题,当执行第一个表达式时,我们想要标记的行被打印出来: { printf "%s\t%s\n", $0, “**”; } 然后在同一步骤中,还检查第二个表达式,这成为浪费时间的因素。

因此,在打印使用第一个表达式打印的已标记行后,无需再次执行第二个表达式 $4 > 20

要解决这个问题,您必须使用 next 命令,如下所示:

# awk '$4 <= 20 { printf "%s\t%s\n", $0,"*" ; next; } $4 > 20 { print $0 ;} ' food_list.txt

No	Item_Name		Price		Quantity
1	Mangoes			$3.45		   5	*
2	Apples			$2.45              25
3	Pineapples		$4.45              55
4	Tomatoes		$3.45              25 
5	Onions			$1.45              15	*
6	Bananas	                $3.45              30

使用 $4 <= 20 打印单个输入行后 { printf "%s\t%s\n", $0,"*" ;下一个 ; },包含的 next 命令将帮助跳过第二个表达式 $4 > 20 { print $0 ;},因此执行到下一个输入行,而不必浪费时间检查数量是否大于20

next 命令对于编写高效的命令非常重要,并且在必要时,您始终可以使用它来加快脚本的执行速度。为本系列的下一部分做好准备,我们将研究使用标准输入 (STDIN) 作为 Awk 的输入。

希望本指南对您有所帮助,并且您可以一如既往地在下面的评论部分留下评论,以书面形式表达您的想法。