在这第六部分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
上面的命令实际上工作如下:
- 首先,它检查是否数量,每一个输入行的第四场是小于或等于20,如果一个值满足该条件下,它被打印和对标记
(*)
使用表达式中的一个在末尾标志:$4 <= 20
- 其次,它会检查每个输入行的第四场大于20,如果线路满足条件它就会使用表达两个印刷:
$4 > 20
但在这里,在执行第一个表达式时,则打印我们要标志线有一个问题,使用: { printf "%s\t%s\n", $0,"**" ; }
{ 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 ; }
{ printf "%s\t%s\n", $0,"*" ; next ; }
{ printf "%s\t%s\n", $0,"*" ; next ; }
,则next
包含命令将帮助您跳过第二个表达式$4 > 20
{ print $0 ;}
因此执行转到下一输入行,而不必把时间浪费在检查数量是否大于20。
下一个命令是非常重要的是编写有效的命令,并在必要时,可以随时用它来加快脚本的执行。 准备的系列赛里,我们将看看使用标准输入(STDIN)作为awk中输入的下一个部分。
希望你找到这个如何指导有用的,你可以一如既往地写下你的想法留下评论在下面的评论部分。