1 awk实践
1.1 逻辑控制
1.1.1 switch条件
基础知识
简介
在awk中有一种简单的条件控制语法switch,相较于if来说,switch分支语句功能较弱,只能进行等值比较或正则匹配,一般结合case方式来使用。
语法格式
switch (表达式) {
case 值1|regex1 : 执行语句1;break
case 值2|regex2 : 执行语句2;break
case 值3|regex3 : 执行语句3;break
...
[ default: 执行语句 ]
}
注意:
表达式的结果符合awk的逻辑运算,表达式成功返回0,表达式失败返回1
因为switch本身外侧没有流程控制,所以,一般情况下,当外侧没有循环控制的时候,会结合break来使用
一旦遇到break,代表退出当前循环
简单实践
实践1-简单实践
无break效果
[root@localhost ~]# seq 2 | awk '{switch ($1 % 2) {
case "1":
print "奇数: ", $1
case "0":
print "偶数: ", $1
default:
print "嘿嘿"
}}'
奇数: 1
偶数: 1
嘿嘿
偶数: 2
嘿嘿
结果显示:
没有break的时候,每一次都会走一个switch的完整循环
结合break的基本语法实践
[root@localhost ~]# seq 5 | awk '{switch ($1 % 2) {
case "1":
print "奇数: ", $1
break
case "0":
print "偶数: ", $1
break
default:
print "嘿嘿"
break
}}'
奇数: 1
偶数: 2
奇数: 3
偶数: 4
奇数: 5
结果显示:
有了break效果好多了
实践2-结合文本来进行实践
[root@localhost ~]# awk '{switch (NR % 2) {
case "1":
print "奇数行: ", $0
break
case "0":
print "偶数行: ", $0
break
}}' awk.txt
奇数行: nihao awk1 awk2 awk3
偶数行: nihao awk4 awk5 awk6
奇数行: nihao awk7 awk8 awk9
定制配置考试成果表
[root@localhost ~]# cat course_scores.txt
姓名 语文 数据 历史
张三 100 56 99
李四 90 68 89
王五 50 78 67
赵六 80 99 89
[root@localhost ~]# awk -v total=0 '
BEGIN{
printf "\t学生成绩信息统计\n"
printf "-----------------------------------\n"
}
NR>=2 {
switch ($2+$3+$4 >= 240) {
case 0:
type="优秀";break
case 1:
type="良好";break
}
total=$2+$3+$4
printf "姓名: %-3s 总分: %4d,状态: %-2s\n",$1,$2+$3+$4,type
}' course_scores.txt
学生成绩信息统计
-----------------------------------
姓名: 张三 总分: 255,状态: 良好
姓名: 李四 总分: 247,状态: 良好
姓名: 王五 总分: 195,状态: 优秀
姓名: 赵六 总分: 268,状态: 良好
1.1.2 for循环
基础知识
简介
在awk中,支持一些逻辑循环的功能,比如 for、while等。实际的过程中,我们往往会结合数组元素进行信息的统计
for语句标准格式
for (三元表达式) {
执行语句
}
for (变量 in 列表) {
执行语句
}
for语句简写格式
for(表达式) {
执行语句;...}
注意:
for语句可以结合if语句进行操作
简单实践
实践1-for循环语法
普通for循环实践
[root@localhost ~]# for((i=1,sum=0;i<=100;i++));do let sum+=i;done;echo $sum
5050
awk的for标准语法
[root@localhost ~]# awk 'BEGIN {
sum=0
for (i=1;i<=100;i++) {
sum+=i
}
print sum
}'
5050
awk for循环单行实践
[root@localhost ~]# awk 'BEGIN{
sum=0; for(i=1;i<=100;i++) {
sum+=i}; print sum}'
5050
实践2-文本实践
文本信息的基本统计
[root@localhost ~]# seq 10 | paste -s | tr -s "\t" " " > num.txt
[root@localhost ~]# cat num.txt
1 2 3 4 5 6 7 8 9 10
[root@localhost ~]# awk '{for(i=1;i<=NF;i++){sum+=$i};print sum}' num.txt
55
学生信息统计
[root@localhost ~]# awk 'NR>=2 {
total=0
for (i=2;i<=NF;i++) {
total+=$i
}
print "学生姓名: "$1", 课程总分: "total
}' course_scores.txt
学生姓名: 张三, 课程总分: 255
学生姓名: 李四, 课程总分: 247
学生姓名: 王五, 课程总分: 195
学生姓名: 赵六, 课程总分: 268
1.1.3 while循环
基础知识
简介
awk支持while相关的循环处理,它主要有两种表现样式
样式1
while(条件){
执行语句
}
样式2
do {
执行语句
} while(条件)
简写样式
while(condition){
执行语句;...}
do {
条件;...} while(条件)
简单实践
实践1-while实践
while标准格式
[root@localhost ~]# awk 'BEGIN {
i=1;sum=0
while(i<=100) {
sum+=i
i++
}
print sum
}'
5050
求和1~100
[root@localhost ~]# awk 'BEGIN{
i=1;sum=0;while(i<=100){
sum+=i;i++};print "sum="sum}'
sum=5050
指定数据进行求和
[root@localhost ~]# read -p "请输入一个数字 : " NUM;awk -v num=$NUM 'BEGIN{
i=1;sum=0;while(i<=num){
sum+=i;i++};print "1~$NUM的和为="sum}'
请输入一个数字 :34
1~$NUM的和为=595
最大值和最小值
[root@localhost ~]# echo '0 234 252 3246 2245 2345 4536 3754 32 345 323 234 3 1' > num.txt
[root@localhost ~]# awk '{
min=$1;max=$1;while(i<=NF){
if(max<$i)max=$i;if(min>$i)min=$i;i++};print "max:"max,"min:"min}' num.txt
max:4536 min:0
标准求和
[root@localhost ~]# awk '{
sum=0
i=1
while (i<=NF) {
sum+=$i
i++
}
print sum
}' num.txt
17550
实践2-dowhile实践
基本格式
[root@localhost ~]# awk 'BEGIN{i=0;do {print i;i++} while(i<5)}'
0
1
2
3
4
求和1~100
[root@localhost ~]# awk 'BEGIN{ total=0;i=1;do{ total+=i;i++;}while(i<=100);print total}'
5050
1.1.4 流程控制
基础知识
简介
awk提供了很多的功能实践,尤其是与逻辑控制相关的,其实awk为了更好的进行这些流程的控制,它也提供了很多的控制语法,这些语法如下:
continue 中断本次循环
break 中断整个循环
next 可以提前结束对匹配行处理而直接进入下一行处理
nextfile 进阶版的next,可以提前结束对匹配行处理,直接读取下一个文件进行循环处理
exit 退出awk程序
END代码段属于exit一部分,可以在BEGIN或main段中执行exit操作--执行END语句块。
简单实践
实践1-continue实践
continue输出满足条件的数据
[root@localhost ~]# awk '
BEGIN{
for(i=0;i<10;i++){
if(i==5)continue
print(i)
}
}'
0
1
2
3
4
6
7
8
9
continue 求奇|偶数和
[root@localhost ~]# awk 'BEGIN{sum=0;for(i=1;i<=100;i++){if(i%2==0)continue;sum+=i}print sum}'
2500
[root@localhost ~]# awk 'BEGIN{sum=0;for(i=1;i<=100;i++){if(i%2!=0)continue;sum+=i}print sum}'
2550
实践2-break实践
continue输出满足条件的数据
[root@localhost ~]# awk '
BEGIN