Awk之if ,else if,else用法

本文讲解了awk命令中if-else结构的正确用法,并展示了如何使用awk进行条件判断和百分比输出的精确控制。通过实例演示了如何处理文本数据,以及如何调整printf函数格式化输出,以达到2位小数的精度并实现换行和百分号打印。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

awk 功能强大,可以处理文本,筛选需要的信息,这里不再多说,有兴趣的可以上网搜,我在这里只讲awk 怎样使用if else。
在网上查了好久,在shell使用awk 的 if else if else 时,网上给的列子是这样的:

awk '{if ($1==1) print "A" else if ($1==2) print "B" else print "C"}'

尝试了好久也不对,找不到哪儿的错误,后来听大神讲到,每个语句后面都有分号,正确的应该是这样的

awk '{if ($1==1) print "A"; else if ($1==2) print "B"; else print "C"}'

拓展:

awk中也支持++或者+=运算符

grep '接口耗时:' test.log|cut -d "m" -f 1 |cut -d ":" -f 2|awk 'BEGIN {count=ms1=ms2=ms3=0}{if($1<1) ms1++;else if($1>=1&&$1<=5) ms2++;else ms3++;count++}END{print "ms1,ms1占 比 ",ms1,",",ms1/count*100,"%";print "ms2,ms2占比",ms2,",",ms2/count*100,"%";print "ms3,ms3占比",ms3,",",ms3/count*100,"%"}'

上述命令输出的结果为:

xxx@xxxdeMacBook-Pro-142 ~ % grep '接口耗时:' test.log|cut -d "m" -f 1 |cut -d ":" -f 2|awk 'BEGIN {count=0;ms1=0;ms2=0;ms3=0}{if($1<1) ms1++;else if($1>=1&&$1<=5) ms2++;else ms3++;count++}END{print "ms1,ms1 占比",ms1,",",ms1/count*100,"%";print "ms2,ms2占比",ms2,",",ms2/count*100,"%";print "ms3,ms3占比",ms3,",",ms3/count*100,"%"}'
ms1,ms1占比 0 , 0 %
ms2,ms2占比 17 , 89.4737 %
ms3,ms3占比 2 , 10.5263 %

 存在的问题是输出的百分比带了4位小数,怎么样保留2位小数呢?

解决办法是可以使用printf格式化输出

修改后输出结果如下:

xxx@xxxdeMacBook-Pro-142 ~ % grep '接口耗时:' test.log|cut -d "m" -f 1 |cut -d ":" -f 2|awk 'BEGIN {count=ms1=ms2=ms3=0}{if($1<1) ms1++;else if($1>=1&&$1<=5) ms2++;else ms3++;count++}END{printf ("ms1,ms1占比 %s,%.2f",ms1,ms1/count*100,"%");printf ("ms2,ms2占比 %s,%.2f",ms2,ms2/count*100,"%");printf ("ms3,ms3占比 %s,%.2f",ms3,ms3/count*100,"%")}'
ms1,ms1占比 0,0.00ms2,ms2占比 17,89.47ms3,ms3占比 2,10.53%

可以看到虽然百分比是保留到2位小数了,但是每个统计结果没有换行显示

解决办法是加换行符\n,输出结果如下:

xxx@xxxdeMacBook-Pro-142 ~ % grep '接口耗时:' test.log|cut -d "m" -f 1 |cut -d ":" -f 2|awk 'BEGIN {count=ms1=ms2=ms3=0}{if($1<1) ms1++;else if($1>=1&&$1<=5) ms2++;else ms3++;count++}END{printf ("ms1,ms1占比 %s,%.2f\n",ms1,ms1/count*100);printf ("ms2,ms2占比 %s,%.2f\n",ms2,ms2/count*100);printf ("ms3,ms3占比 %s,%.2f",ms3,ms3/count*100)}'
ms1,ms1占比 0,0.00
ms2,ms2占比 17,89.47
ms3,ms3占比 2,10.53

又出现了新问题就是最后的百分比没有带%

查询资料得知printf函数格式化支持一下格式,所以要打印%应该使用两个%%

%的转换说明及作为结果的打印输出
%a                浮点数、十六进制数字和p-记数法(C99)
%A    浮点数、十六进制数字和p-记法(C99)
%c    一个字符 
%d    有符号十进制整数 
%e    浮点数、e-记数法
%E    浮点数、E-记数法
%f    浮点数、十进制记数法  
%g    根据数值不同自动选择%f或%e.
%G    根据数值不同自动选择%f或%e.
%i               有符号十进制数(与%d相同)
%o    无符号八进制整数
%p    指针    
%s    字符串
%u    无符号十进制整数
%x    使用十六进制数字0f的无符号十六进制整数 
%X    使用十六进制数字0f的无符号十六进制整数
%%    打印一个百分号

于是修改脚本为:

xxx@xxxdeMacBook-Pro-142 ~ % grep '接口耗时:' test.log|cut -d "m" -f 1 |cut -d ":" -f 2|awk 'BEGIN {count=ms1=ms2=ms3=0}{if($1<1) ms1++;else if($1>=1&&$1<=5) ms2++;else ms3++;count++}END{printf ("ms1,ms1占比 %s,%.2f%%\n",ms1,ms1/count*100);printf ("ms2,ms2占比 %s,%.2f%%\n",ms2,ms2/count*100);printf ("ms3,ms3占比 %s,%.2f",ms3,ms3/count*100,"%")}'

输出结果如下:

 至此问题解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕城南风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值