在 awk 中使用循环
来学习一下多次执行同一条命令的不同类型的循环。
awk脚本有三个主要部分:BEGIN和END函数(都可选),用户自己写的每次要执行的函数。某种程度上,awk的主体部分就是一个循环,因为函数中的命令对每一条记录都会执行一次。然而,有时你希望对于一条记录执行多次命令,那么你就需要用到循环。
有多种类型的循环,分别适合不同的场景。
while循环
一个while循环检测一个表达式,如果表达式为true就执行命令。当表达式变为false时,循环中断。
#!/bin/awk-f BEGIN{ #Loopthrough1to10 i=1; while(i<=10){ printi,"tothesecondpoweris",i*i; i=i+1; } exit; }
在这个简单实例中,awk打印了放在变量i中的整数值的平方。while(i<=10)语句告诉awk仅在i的值小于或等于10时才执行循环。在循环最后一次执行时(i的值是10),循环终止。
do-while循环
do-while循环执行在关键字do之后的命令。在每次循环结束时检测一个测试表达式来决定是否终止循环。仅在测试表达式返回true时才会重复执行命令(即还没有到终止循环的条件)。如果测试表达式返回false,因为到了终止循环的条件所以循环被终止。
#!/usr/bin/awk-f BEGIN{ i=2; do{ printi,"tothesecondpoweris",i*i; i=i+1 } while(i<10) exit; }
for循环
awk中有两种for循环。
一种for循环初始化一个变量,检测一个测试表达式,执行变量递增,当表达式的结果为true时循环就会一直执行。
#!/bin/awk-f BEGIN{ for(i=1;i<=10;i++){ printi,"tothesecondpoweris",i*i; } exit; }
另一种for循环设置一个有连续索引的数组变量,对每一个索引执行一个命令集。换句话说,它用一个数组“收集”每一条命令执行后的结果。
本例实现了一个简易版的Unix命令uniq。通过把一系列字符串作为键加到数组a中,当相同的键再次出现时就增加键值,可以得到某个字符串出现的次数(就像uniq的--count选项)。如果你打印该数组的所有键,将会得到出现过的所有字符串。
用演示文件colours.txt(前一篇文章中的文件)来举例:
name color amount
apple red 4
banana yellow6
raspberry red 99
strawberryred 3
grape purple10
apple green 8
plum purple2
kiwi brown 4
potato brown 9
pineapple yellow5
这是awk版的简易uniq-c:
#!/usr/bin/awk-f NR!=1{ a[$2]++ } END{ for(keyina){ printa[key]""key } }
示例数据文件的第三列是第一列列出的条目的计数。你可以用一个数组和for循环来按颜色统计第三列的条目。
#!/usr/bin/awk-f BEGIN{ FS=""; OFS="\t"; print("color\tsum"); } NR!=1{ a[$2]+=$3; } END{ for(bina){ printb,a[b] } }
你可以看到,在处理文件之前也需要在BEFORE函数(仅仅执行一次)中打印一列表头。
循环
在任何编程语言中循环都是很重要的一部分,awk也不例外。使用循环你可以控制awk脚本怎样去运行,它可以统计什么信息,还有它怎么去处理你的数据。我们下一篇文章会讨论switch、continue和next语句。
ps:awk-for循环简单用法
文本:
[root@VM_0_84_centos~]#catsshd.txt 123 456 789
循环打印上述文本
for循环的固定格式 i=1设置i的初始变量 i<=NFi变量小于等于NF变量的值(每行的字段数)i++表示i递增+1,
[root@VM_0_84_centos~]#catsshd.txt|awk'{for(i=1;i<=NF;i++){print$i}}' 1 2 3 4 5 6 7 8 9
总结
以上所述是小编给大家介绍的在awk中使用循环,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。