|NO.Z.00009|——————————|LinuxShell|——|Linux&Shell&字符截取和替换命令.V07|——|流程控制|
一、awk流程控制
### --- 我们再来利用下 student.txt 文件做个练习,
~~~ 后面的使用比较复杂,我们再看看这个文件的内容:
[root@localhost ~]# cat student.txt
ID Name PHP Linux MySQL Average
1 Liming 82 95 86 87.66
2 Sc 74 96 87 85.66
3 Tg 99 83 93 91.66
### --- 我们先来看看该如何在 awk 中定义变量与调用变量的值。
~~~ 假设我想统计 PHP 成绩的总分,那么就应该这样:
### --- 注释:
~~~ 注:我们解释下这个命令。“NR==2{php1=$3}”(条件是 NR==2,动作是 php1=$3)这句话是指如果
~~~ 注:输 入 数 据 是 第 二 行 ( 第 一 行 是 标 题 行 ) , 就 把 第 二 行 的 第 三 字 段 的 值 赋 予 变 量 “ php1 ” 。
~~~ 注:“NR==3{php2=$3}”这句话是指如果输入数据是第三行,就把第三行的第三字段的值赋予变量“php2”。
~~~ 注:“NR==4{php3=$3;totle=php1+php2+php3;print "totle php is " totle}”(“NR==4”是条件,后
~~~ 注:面{}中的都是动作)这句话是指如果输入数据是第四行,就把第四行的第三字段的值赋予变量“php3”;
~~~ 注:然后定义变量 totle 的值是“php1+php2+php3”;然后输出“totle php is”关键字,后面加变量 totle的值。
[root@localhost ~]# awk 'NR==2{php1=$3}
> NR==3{php2=$3}
> NR==4{php3=$3;totle=php1+php2+php3;print "totle php is " totle}' student.txt
totle php is 255
### --- 在 awk 编程中,因为命令语句非常长,在输入格式时需要注意以下内容:
~~~ 多个条件{动作}可以用空格分割,也可以用回车分割。
~~~ 在一个动作中,如果需要执行多个命令,需要用“;”分割,或用回车分割。
~~~ 在 awk 中,变量的赋值与调用都不需要加入“$”符。
~~~ 条件中判断两个值是否相同,请使用“==”,以便和变量赋值进行区分。
### --- 在看看该如何实现流程控制,假设如果 Linux 成绩大于 90,
~~~ 就是一个好男人(学 PHP 的表示压力很大!):
~~~ 程序中有两个 if 判断,第一个判断行号大于 2,第二个判断 Linux 成绩大于 90 分
[root@localhost ~]# awk '{if (NR>=2)
{if ($4>90) printf $2 " is a good man!\n"}}' student.txt
Liming is a good man!
Sc is a good man!
### --- 其实在 awk 中 if 判断语句,
~~~ 完全可以直接利用 awk 自带的条件来取代,刚刚的脚本可以改写成这样:
~~~ 先判断行号如果大于 2,就把第四字段赋予变量 test
~~~ 在判断如果 test 的值大于 90 分,就打印好男人
[root@localhost ~]# awk ' NR>=2 {test=$4}
test>90 {printf $2 " is a good man!\n"}' student.txt
Liming is a good man!
Sc is a good man!
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
分类:
cdv008-shell
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通