2、awk for循环和数组的基本语法


前言

awk的循环有很多种循环结构,其中最常见的是for循环。


一、AWK for循环的两种基本语法

1. 计数器控制for循环用法

  1. 计数器控制的for循环通常用于重复操作特定次数或在某个范围内。
    for (初始化; 条件; 迭代) {
    	# 循环体
    }
    初始化:初始化一个计数器或变量,通常在循环开始之前执行。
    条件:在每次迭代之前检查的条件,如果条件为真,循环会继续执行;如果条件为假,循环会终止。
    迭代:在每次迭代之后执行的操作,通常用于递增或递减计数器。
    
    例如打印数字0到10
    awk 'BEGIN {
    	for (i=0; i<=10; i++) {
    		print i	
    	}
    }'
    
    例如计算1到100的和
    awk 'BEGIN {
    	sum=0	
    	for (i=1; i<=100; i++) {
    		sum += i
    	}
    	print sum
    }'
    用数学公式(1+n)*n/2,这可以让时间复杂度变成O(1)awk 'BEGIN{print (1+100)*100/2}'
    

2. 遍历数组元素的for循环

  1. 使用遍历数组元素的for循环,这个先说一个简单的例子,然后详细说下awk中数组的操作
    遍历数组元素的for循环:
    for (变量 in 数组) {
    	# 循环体
    }
    变量:用于遍历数组元素的变量。
    数组:包含要遍历的元素的数组。
    
    我们先定义一个数组,awk的数组默认是关联数组
    例如像Go里的map数据结构一样。
    awk 'BEGIN {
    	#awk加注释,跟shell一样,#号开头就可以了。	
    	#我们定义一个names的数组,键存的是名字, 值是年龄。
    	names["Alice"] = 25
    	names["Bob"] = 30
    	names["Carol"] = 28
    	
    	#我们可以循环遍历names数组,并打印元素
    	for (name in names) {
    		printf("%s的年龄是%d岁\n", name, names[name])
    	}
    }'
    

二、AWK中数组的基本操作

1. awk数组的声明和初始化

  1. 它们是有序的、可索引的数据集合,可以容纳各种数据类型,包括字符串和数字。
    awk数组的索引可以是数字或字符串。
    在awk中,数组可以通过以下语法声明和初始化:
    array[index] = value
    
    这里,array 是数组的名称,index 是数组元素的索引,可以是数字或字符串,value 是要存储在数组元素中的值。例如:
    myArray["apple"] = 5
    myArray["banana"] = 8
    myArray[3] = "cherry"
    
    在上面的示例中,我们创建了一个名为myArray的数组,并使用不同的索引存储了字符串和数字。

2. 获取数组元素

  1. 要访问数组元素,只需使用数组名称和索引。例如,要获取myArray中"apple"的值,可以这样做:
    value = myArray["apple"]
    
    例子
    awk 'BEGIN {
    	myArray["apple"] = 5
    	myArray["banana"] = 8
    	myArray[3] = "cherry"
    	
    	print myArray["apple"]	
    }'
    输出:
    5
    
  2. 同样,要获取myArray中索引为3的值,可以使用:
    value = myArray[3]
    例子
    	awk 'BEGIN {
    	myArray["apple"] = 5
    	myArray["banana"] = 8
    	myArray[3] = "cherry"
    	
    	print myArray[3]	
    }'
    输出:
    cherry
    

3. 遍历数组

  1. Awk提供了多种方法来遍历数组的元素。最常见的方法是使用for循环:

    for (数组下标变量 in 数组) {
    	# 在这里处理数组元素
    	print 数组下标变量, 数组[数组下标变量]
    }
    实例1.
    awk 'BEGIN {
    	myArray["apple"] = 5
    	myArray["banana"] = 8
    	myArray["cherry"] = 18
    
    	for (i in myArray) {
    		printf("名字: %s, 年龄: %d\n", i, myArray[i])
    	}
    }'
    输出:
    名字: apple, 年龄: 5
    名字: banana, 年龄: 8
    名字: cherry, 年龄: 18
    
    实例2.
    如果数组下标是数字递增的话,我们还可以用这种方式遍历数组
    BEGIN {
    	#创建下标为int数字的数组
    	my[0]="dad"
    	my[1]="dsd"
    	my[2]="dsjadh"
    	#length() 函数可以获取数组的大小
    	for (i=0; i<length(my); i++) {
    		printf("数组的下标为: %d,  对应的值为: %s\n", i, my[i])
    	}
    }
    
  2. 实际操作awk数组实例练习
    例如我们有一个下面这样的文本。
    This is a test. This is only a test. If this were a real test, you would be notified.
    这是一个包含一些重复单词的简短文本,可以用来测试你的awk程序。当你运行你的awk程序,它应该能够识别并统计出现的单词以及它们的出现次数,然后生成相应的输出。
    使用上述示例文本数据,你的awk程序应该能够生成类似下面的表格:

    单词出现次数
    you1
    were1
    only1
    this1
    be1
    real1
    If1
    a3
    This2
    notified1
    would1
    test3
    is2

    我们可以这样写

    [root@wangfei awk]# str="This is a test. This is only a test. If this were a real test, you would be notified."
    [root@wangfei awk]# echo "$str" | awk '{
    	for (i = 1; i <= NF; i++) {
        	word = $i
        	gsub("[^a-zA-Z]", "", word)  # 移除非字母字符
        	if (word != "") {
            	word_count[word]++
        	}
    	}
    }
    END {
    	print "| 单词 | 出现次数 |"
    	print "|------|----------|"
    	for (word in word_count) {
        	printf("| %s | %d |\n", word, word_count[word])
    	}
    }'
    输出结果: 
    | 单词 | 出现次数 |
    |------|----------|
    | you | 1 |
    | were | 1 |
    | only | 1 |
    | this | 1 |
    | be | 1 |
    | real | 1 |
    | If | 1 |
    | a | 3 |
    | This | 2 |
    | notified | 1 |
    | would | 1 |
    | test | 3 |
    | is | 2 |
    
  3. 详细解释每一部分的目的和功能:

    1. 遍历单词

    for (i = 1; i <= NF; i++) {
    	word = $i
    	# 在这里处理每个单词
    }
    

    这部分的目的是遍历每一行中的单词。NF是内置变量,代表每一行中的字段数。$i表示第 i 个字段(在这里,字段是由空格分隔的单词)。我们将每个单词存储在 word 变量中以进行进一步处理。
    2.移除非字母字符

    gsub("[^a-zA-Z]", "", word)
    word_count[word]++
    

    在这一步中,我们使用gsub函数删除了 word 变量中的非字母字符。这是为了确保我们只统计纯单词,而不包括标点符号或其他非字母字符。

    gsub:是Awk的内置函数,用于全局替换字符串。
    [^a-zA-Z]:是一个正则表达式,它匹配除小写字母a-z和大写字母A-Z之外的所有字符。
    “”:是替换的内容,这里我们将匹配到的字符替换为空字符串,从而删除它们。

    3. 统计单词出现次数

    word_count[word]++
    

    我们使用Awk数组来统计每个单词的出现次数。word_count 是一个数组,以word 变量的内容作为键,增加其对应的值来统计单词出现的次数。如果这是第一次遇到这个单词,它的值将被初始化为0,然后增加1。
    4. 创建输出表格

    END {
    	print "| 单词 | 出现次数 |"
    	print "|------|----------|"
    	for (word in word_count) {
        	printf("| %s | %d |\n", word, word_count[word])
    	}
    }'
    

    在awk程序的结尾部分,我们使用END块来创建表格。首先,我们输出表格的头部,然后使用一个 for 循环遍历 word_count 数组中的每个单词,并打印它们的单词和出现次数。这将创建一个表格,显示每个单词和它们的出现次数。


总结

这次学了数组和for循环的基本操作,下章讲awk中数组的常用技巧和高级操作

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一章 UNIX AWK使用手册(第二版)......................................................................................5 1.1 什么是AWK?...........................................................................................................................5 1.2 为什么使用AWK? ...................................................................................................................5 1.3 AWK的调用方式......................................................................................................................6 1.4 AWK的语法:..........................................................................................................................6 1.5 AWK的内置函数......................................................................................................................7 1.6 在命令行使用AWK.................................................................................................................8 1.7 AWK的变量.............................................................................................................................9 1.8 运算与判断:.........................................................................................................................9 1.9 AWK的流程控制......................................................................................................................9 1.10 AWK中的自定义函数.......................................................................................................... 11 1.11 AWK高级输入输出.............................................................................................................. 12 1.12 AWK与SHELL SCRIPT混合编程............................................................................................ 14 1.13 附录:................................................................................................................................ 16 第二章 AWK简介......................................................................................................................... 21 2.1 AWK简介............................................................................................................................... 21 2.2 AWK命令格式和选项............................................................................................................ 21 2.2.1 awk的语法有两种形式................................................................................................. 21 2.2.2 命令选项....................................................................................................................... 21 2.3 模式和操作........................................................................................................................... 22 2.3.1 模式.............................................................................................................................. 23 2.3.2 操作.............................................................................................................................. 23 2.4 AWK的环境变量.................................................................................................................... 23 2.5 AWK运算符........................................................................................................................... 24 2.6 记录和域.............................................................................................................................. 24 2.6.1 记录.............................................................................................................................. 24 2.6.2 域.................................................................................................................................. 25 RESOFT 国库信息处理系统(TIPS)EasyMining使用说明书 3 2.6.3 域分隔符....................................................................................................................... 25 2.7 GAWK专用正则表达式元字符............................................................................................... 25 2.8 POSIX字符集....................................................................................................................... 26 2.9 匹配操作符(~) ...................................................................................................................... 26 2.10 比较表达式......................................................................................................................... 26 2.11 范围模板............................................................................................................................. 26 2.12 一个验证PASSWD文件有效性的例子................................................................................. 27 2.13 几个实例............................................................................................................................. 27 2.14 AWK编程............................................................................................................................. 28 2.14.1 变量............................................................................................................................ 28 2.14.2 BEGIN模块................................................................................................................. 28 2.14.3 END模块..................................................................................................................... 28 2.14.4 重定向和管道............................................................................................................. 29 2.14.5 条件语句..................................................................................................................... 30 2.14.6 14.6. 循环..................................................................................................................... 31 2.14.7 数组............................................................................................................................ 31 2.14.8 awk的内建函数........................................................................................................... 32 2.15 HOW-TO................................................................................................................................ 36 第三章 AWK实例......................................................................................................................... 37 3.1 捍卫 AWK ............................................................................................................................. 37 3.2 第一个 AWK.......................................................................................................................... 37 3.3 多个字段.............................................................................................................................. 38 3.4 外部脚本.............................................................................................................................. 39 3.5 BEGIN 和 END 块............................................................................................................... 39 3.6 规则表达式和块................................................................................................................... 40 3.7 表达式和块........................................................................................................................... 40 3.8 条件语句.............................................................................................................................. 40 3.9 数值变量.............................................................................................................................. 41 3.10 字符串化变量..................................................................................................................... 42 RESOFT 国库信息处理系统(TIPS)EasyMining使用说明书 4 3.11 众多运算符......................................................................................................................... 42 3.12 字段分隔符......................................................................................................................... 43 3.13 字段数量............................................................................................................................. 43 3.14 记录号................................................................................................................................ 44 3.15 参考资料............................................................................................................................. 44 3.16 关于作者............................................................................................................................. 44 第四章 AWK简单实例.................................................................................................................. 46 4.1 首先我们要弄清楚几个概念:............................................................................................ 46 4.2 再说一说有关AWK的内部变量:..................................................................................... 49 第五章 AWK详解......................................................................................................................... 54

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值