打开高效文本编辑之门_Linux Awk之条件判断与循环

Posted ShenLiang2025

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了打开高效文本编辑之门_Linux Awk之条件判断与循环相关的知识,希望对你有一定的参考价值。

Linux awk之条件判断与循环

声明与简介

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。awk通常用来处理结构化(固定格式)的文本文件, awk每接收文件的一行,然后执行相应的命令来处理文本。

本文是对awk的分支与循环,主要结合数据以案例形式介绍怎样使用分支判断、循环控制。

 

数据说明


emp_3_only.txt,该数据来自全量的员工表的前3行。

7369,smith,clerk,7902,'1980-12-17',800,null,20
7499,allen,salesman,7698,'1981-2-20',1600,300,30
7521,ward,salesman,7698,'1981-2-22',1250,500,30

条件判断

对不同条件进行逻辑的跳转和转换。常见关键字如IF、IF ELSE WHILE、DO WHILE等。

单IF语句

即只有一个IF的情况,此情况仅处理满足IF条件的逻辑,其它情况不处理。

# 输出工资在1300和1700之间的员工编号和姓名。
awk -F"," '{if($6>=1300 && $6<1700) print $1,$2,$6}' emp_3_only.txt
7499 allen 1600
# 等价于用比较符的形式
awk -F"," '$6>=1300 && $6<1700 {print $1,$2,$6}' emp_3_only.txt 
7499 allen 1600
#结果
7499 allen 1600

#注:如果用到if,则需要把包裹在{}(大括号)内,而不用if的形式则不需要。

IF ELSE语句

IF ELSE此情况仅处理满足IF条件的逻辑,其它情况在ELSE里处理。

#如果资在1300和1700之间的员工编号和姓名,否则输出“比1300小或者大于等于1700”。
awk -F"," '{if($6>=1300 && $6<1700) print $1,$2,$6 
else print "比1300小或者大于等于1700"}' emp_3_only.txt
# 结果
比1300小或者大于等于1700
7499 allen 1600
比1300小或者大于等于1700

#注:这里的else不能和if在同一行。

三目运算符

三目运算符即是”?:”,?前是条件判断,如果满足则进入:前的逻辑,反之则反。

# 通过三目运算符结合且(”&&”)进行分支判断,效果类似IF ELSE。
# 这里的需求时如果工资在[1300,1700)就打印"您工资在合理 范围[1300,1700)",反之打印"您工资过高或过低[1700,∞) or (-∞,1300)"
awk -F"," '{content=$6>=1300 && $6<1700? "您工资在合理 范围[1300,1700)":"您工资过高或过低[1700,∞) or (-∞,1300)";print $1,content,$6}' emp_3_only.txt
#结果
7369 您工资过高或过低[1700,∞) or (-∞,1300) 800
7499 您工资在合理 范围[1300,1700) 1600
7521 您工资过高或过低[1700,∞) or (-∞,1300) 1250
# 注:这里如果要多某一列用于三目运算符时需要先赋值给一个变量,方便后边的应用。比如这里用的是content变量。

While循环

While是循环的一种形式,即while满足某个条件后一直循环直至不满足条件后终止。

# 按照记录序号,计算计算员工累加后的工资。
awk -F"," 'BEGIN{total=0;}{rn=1;
total = total + $6;
while (rn <= 3)
{rn+=1;}
print total,rn;
}' emp_3_only.txt
# 结果
800 4
2400 4
3650 4

#延展阅读: 局部变量
awk -F"," '{total=0;rn=NR;
total = total + $6;
while (rn <= 3)
{rn+=1;}
print total,rn;
}' emp_3_only.txt
# 结果
800 4
1600 4
1250 4

#注:如上所示,这里定义的total可以理解为局部变量,所以没有叠加的效果。

Do While循环

Do While是while循环的另外一种形式,先执行逻辑后验证是否满足循环结束条件。

#按照记录序号,计算计算员工累加后的工资。
awk -F"," 'BEGIN{total=0;}{rn=0;
> total = total + $6;
> do
> {rn+=1;}
> while (rn <= 3)
> print total,rn;
> }' emp_3_only.txt
# 结果
800 4
2400 4
3650 4

For循环

For循环是循环的一种,它可以在定义个自增变量,设置结束条件来控制循环。

awk -F"," 'BEGIN{total=0;i=1}{
total = total + $6;
for(i=1;i<=NR;i++)
print total,i;
}' emp_3_only.txt

#结果
800 1
2400 1
2400 2
3650 1
3650 2
3650 3

# 过程解读,为啥是这样?
# Step1 因为awk在读取文件时就是一种循环
# Step2 我们在每次读取一行时又加了循环,这时总体上可以理解为2层循环。
# Step3 这里用到NR内置变量,即行号。以NR等于2为例。内部的FOR循环会执行2次,因为每次都是从1开始。同理NR等于3时会输出3条记录。

#如何改进呢?通过上述分析不难发现多出来的打印问题处在初始值i上,所以i如果等于NR,则仅会打印一次。见如下代码:

awk -F"," 'BEGIN{total=0;i=1}{
total = total + $6;
for(NR;i<=NR;i++)
print total,i;
}' emp_3_only.txt
800 1
2400 2
3650 3
#结果
800 1
2400 2
3650 3

Break终止

break关键字是循环时满足某个条件时当前WHILE循环结束,AWK遍历行循环仍在继续。

awk -F"," 'BEGIN{total=0;rn=0;}{
total = total + $6;
while (rn <= 3)
{rn+=1;
print rn,NR,total;
if (rn == 2){
print "终止在第二次迭代"
break;
}
}
print total,rn,NR;
}' emp_3_only.txt

#结果
1 1 800
2 1 800
终止在第二次迭代
800 2 1
3 2 2400
4 2 2400
2400 4 2
3650 4 3

#过程描述
# Step1 :rn有0开始迭代,在外部循环时(即awk访问第一行记录)时,内部循环进行3次,而进入第二次时即终止,所以打印total,rn,NR(外部行号)时分别为800 2 1。外部循环遍历文件行仍继续。

# Step2: 继续遍历第2、3行,打印当前行的total,rn,NR。

Continue继续

Continue关键字是循环时满足某个条件时循环内部略过当前条件,当前WHILE循环继续,AWK遍历行循环外部仍在继续。

awk -F"," 'BEGIN{total=0;rn=0;}{
> total = total + $6;
> while (rn <= 3)
> {rn+=1;
> print rn,NR,total;
> if (rn == 2){
> print "继续第2次迭代"
> continue;
> }
> }
> print total,rn,NR;
> }' emp_3_only.txt
1 1 800
2 1 800
继续第2次迭代
3 1 800
4 1 800
800 4 1
2400 4 2
3650 4 3

#过程描述
# Step1 :rn有0开始迭代,在外部循环时(即awk访问第一行记录)时,内部循环进行3次,而进入第2次时即仍继续循环(即略过该次迭代),所以打印total,rn,NR(外部行号)时分别为800 4 1。外部循环遍历文件行仍继续。

# Step2: 继续遍历第2、3行,打印当前行的total,rn,NR。

Exit退出

Exit关键字是循环时满足某个条件时整个程序结束,即后续(外部遍历文件行)不再执行。

# 遍历到第2行是结束程序同时输出提示文字“终止在第二行”。
awk -F"," 'BEGIN{total=0;rn=0}{
total = total + $6;
while (rn <= 3)
{rn+=1;
if (rn == 2){
print "终止在第二行"
exit;
} print total,rn;
}
}' emp_3_only.txt
#结果
800 1
终止在第二行


 

以上是关于打开高效文本编辑之门_Linux Awk之条件判断与循环的主要内容,如果未能解决你的问题,请参考以下文章

打开高效文本编辑之门_Linux Awk自定义变量与操作符

打开高效文本编辑之门_Linux awk之自定义变量与操作符

打开高效文本编辑之门_调用Linux的sed命令

打开高效文本编辑之门_Linux Sed模拟常见文件命令

打开高效文本编辑之门_Linux sed之模式空间与保留空间

打开高效文本编辑之门_熟悉Linux Sed的替换命令