Linux教程:在 awk 中使用 if else 语句

awk 是嵌入到 bash shell 中的一种强大的脚本语言。

它非常通用,可以用来编写各种类型的数据提取脚本。

条件语句是任何编程或脚本语言不可或缺的一部分,AWK也不例外。

在本教程中,我将展示在 AWK 中使用 if-else 语句的例子。下面是我的示例所基于的示例数据。

ID Name Age Subject
111 Farhaan 18 DevOps
89 Alex 21 SecOps
92 Ronn 22 IT
100 Robert 23 Commerce
102 Samantha 20 linuxmi
105 Bob 21 Maths

我把它存储在 linuxmi.txt 中。示例

ID Name Age Subject
111 Farhaan 18 DevOps
89 Alex 21 SecOps
92 Ronn 22 IT
100 Robert 23 Commerce
102 Samantha 20 linuxmi
105 Bob 21 Maths
106 Rihaan 18 Arts

1. Awk 中的 if 语句

if 语句检查条件是真还是假。如果条件为真,则执行语句。

下面是 awk 中 if 语句的一个简单语法:

awk '{if (condition) {statement} }' [input_file]

现在,让我们使用 linuxmi.txt 文件的示例数据,并使用 AWK 中的 if 条件打印 ID 为 100 的学生的详细信息。

awk '{                                        

if ($1=="100")

  {
    print "............... n";
    print "Name : " ,$2;
    print "Age : ",$3;
    print "Department : " ,$4;
  }
  
}' linuxmi.txt

下面是上述 awk 命令的执行: 

上面的整个命令也可以写成这样一句话:

awk '{ if ($1=="100")  { print "............... n"; print "Name : " ,$2; print "Age : ",$3; print "Department : " ,$4; } }' linuxmi.txt

如下图:

但第一个更容易阅读和理解。

2. Awk中的if else语句

在前面的示例中,只有一个条件和一个操作。if else 语句与 if 语句稍有不同。

awk 中 if else 语句的一般格式是:

awk '{
  if (condition) 
    {command1} 
  else 
    {command2}
}' [input_file]

这里,如果条件为 true,则执行命令1,如果条件为 false,则执行else部分的命令2。

让我们再次以 linuxmi.txt 数据文件为例。

假设你想得到年龄小于或等于 20 岁的所有学生的姓名和所在部门。

AWK 命令可以像这样:

awk '{

if ($3<20)
  {
    print "Student "$2,"of department", $4, "is less than 20 years old"
  } 
else
  {
    print "Student "$2,"of department", $4, "is more than 20 years old"
  }

下面是if else示例的执行和输出:

如你所见,只有两个学生不到 20 岁。其余的学生都在 20 多岁。

但是上面的例子有一个问题。它还将表的描述视为真实数据,并告诉我们 Student Name of age age 大于20岁。

让我们用 if else-if 语句来纠正这个问题。

3.Awk中的 if else-if 语句

使用 if else if 语句,awk 命令检查多个条件。

如果第一个条件为 false,那么它将检查第二个条件。如果第二个条件也是 false 的,那么它将检查第三个条件,依此类推。它检查所有的条件,直到其中一个条件为 true。如果不满足任何条件,则执行 else 部分。

if(condition1){

command1

}

else if(condition2) {

command2

}

else if(condition3) {

command3

}

.

.

.

else{

commandN

}

在前面的示例中,输出还考虑了数据的第一行,即描述。

我们设一个条件来检验年龄是否是数字。我使用正则表达式 /[0-9]+$/ 表示数值。~表示参数有一个数字。在它们前面的反运算符意味着字段不应该有数字。

awk '{

if (! ($3 ~ /[0-9]+$/))
  {
    print "Age is just a number but you do not have a number"
  } 
else if ($3<20)
  {
    print "Student "$2,"of department", $4, "is less than 20 years old"
  } 
else
  {
    print "Student "$2,"of department", $4, "is more than 20 years old"
  }

}' linuxmi.txt

让我们运行它并关注输出的第一行。

额外提示:使用 awk 程序文件

如果您发现在终端中编写长 awk 程序非常麻烦,可以使用 awk 文件。

创建一个新文件并命名为 linuxmi.awk 或者任何你想要的。扩展名 .awk 在这里无关紧要。它只是让人很容易理解该文件是一个 awk 程序文件。

在上面的示例中,您将内容放在 awk 后面的 ” 之间。

{
if (! ($3 ~ /[0-9]+$/))
  {
    print "Age is just a number but you do not have a number"
  } 
else if ($3<20)
  {
    print "Student "$2,"of department", $4, "is less than 20 years old"
  } 
else
  {
    print "Student "$2,"of department", $4, "is more than 20 years old"
  }
  
}

现在,以以下方式使用这个awk文件:

awk -f linuxmi.awk linuxmi.txt

它将产生与您前面看到的相同的输出。

更多额外提示:使用三元操作符代替

除了在 awk 中使用 if else 语句外,还可以使用三元操作符。三元表达式是 Awk if-else 语句的简写版本。

如果条件为 true,则执行command1;否则,如果条件为 false,则执行command2。

(condition) ? Command1:Command2

考虑以下awk命令的示例:

awk '{print ($3 <=20)? "Age less than 20: " $2: "Age over 20: " $2}' linuxmi.txt

在本例中,$3 指的是 Age 字段。如果 age 小于或等于 20,那么它将打印第一个显示“age小于20”的命令。如果第一部分是 False,它将执行第二个命令“Age is over 20”。

linuxmi@linuxmi /home/linuxmi/www.linuxmi.com                                     
 awk '{print ($3 <=20)? "Age less than 20: " $2: "Age over 20: " $2}' linuxmi.txt
Age over 20: Name
Age less than 20: Farhaan
Age over 20: Alex
Age over 20: Ronn
Age over 20: Robert
Age less than 20: Samantha
Age over 20: Bob
Age less than 20: Rihaan

结论

在本指南中,您应该掌握了在 AWK 编程语言中使用 if-else 语句的不同方法。使用这些语句,您可以控制程序的流程,计算条件,从文件中提取数据,等等。

来源:Linux教程:在 awk 中使用 if else 语句

THE END