我们再来利用下student.txt文件做个练习,后面的使用比较复杂,我们再看看这个文件的内容:
cat student.txt
id name php linux mysql average
1 aaa 66 66 66 66
2 bbb 77 77 77 77
3 ccc 88 88 88 88
我们先来看看该如何在awk中定义变量与调用变量的值。假设我想统计php成绩的总分,那么就应该这样:
[root@localhost ~]$ awk 'nr==2 {php1=$3}
nr==3 {php2=$3}
nr==4 {php3=$3;totle=phpl php2 php3;print "totle php is " totle}’ student.txt
#统计phip成绩的总分
我们解释下这个命令。“nr2 {iphp1=$3}” (条件是nr2,动作是php1=$3) 这句话是指如果输入数据是第二行(第一行是标题行),就把第二行的第三字段的值赋予变量“php1”。
“nr3 {php2=$3}" 这句话是指如果输入数据是第三行,就把第三行的第三字段的值赋予变量“php2”。“nr4 {php3=$3;totle=phpl php2 php3;print “totle php is " totle}”(“nr4”是条件,后面(中的都是动作)这句话是指如果输入数据是第四行﹐就把第四行的第三字段的值赋予变量"php3”;然后定义变量totle的值是“php1 php2 php3”;然后输出“totle php is”关键字,后面加变量totle的值。
在awk编程中,因为命令语句非常长,在输入格式时需要注意以下内容:
- 多个条件 {动作} 可以用空格分割,也可以用回车分割。
- 在一个动作中,如果需要执行多个命令,需要用 “;” 分割,或用回车分割。
- 在awk中,变量的赋值与调用都不需要加入“$”符。
- 条件中判断两个值是否相同,请使用 “”,以便和变量赋值进行区分。
在看看该如何实现流程控制,假设如果linux成绩大于90,就是一个好男人(学php的表示压力很大!) :
[root@localhost ~]$ awk '{if (nr>=2) {if ($4>60) printf $2 "is a good man!\n"}}’ student.txt
#程序中有两个if判断,第一个判断行号大于2,第二个判断linux成绩大于90分
liming is a good man !
sc is a good man !
其实在 awk中 if判断语句,完全可以直接利用awk自带的条件来取代,刚刚的脚本可以改写成这样:
[root@localhost ~]$ awk ’nr>=2 {test=$4}
test>90 {printf $2 "is a good man! \n"}’ student.txt
#先判断行号如果大于2,就把第四字段赋予变量test
#在判断如果test的值大于90分,就打印好男人
liming is a good man!
sc is a good man!
循环结构
for循环
for(变量 in 数组)
{语句}
for(变量;条件;表达式)
{语句}
while循环
while(表达式)
{语句}
do…while循环
do
{语句} while(条件)
其他相关语句
break:退出程序循环
continue: 进入下一次循环
next:读取下一个输入行
exit:退出主输入循环,进入end,若没有end或end中有exit语句,则退出脚本。