打开高效文本编辑之门_Linux awk之关联数组

Posted ShenLiang2025

tags:

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

Linux awk之关联数组使用案例

声明与简介

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。awk通常用来处理结构化(固定格式)的文本文件, awk每接收文件的一行,然后执行相应的命令来处理文本。
本文是对awk的初步认识,主要结合数据以案例形式介绍怎样定义和使用自定义变量以及常见的运算符的使用。

关联数组(Associative Array),又称映射(Map)、字典(Dictionary)是一个抽象的数据结构,它包含着类似于(键,值)的有序对。


数据说明

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

关联数组

这里的变量区别于系统变量,是用户根据业务需要自定义的变量。

定义关联数组

这里关联数据的索引可以是数字也可以是字符串,可以混合使用。

# 定义数组array初始化数据后打印出来。
awk 'BEGIN{array[10000]="Hello array";array["idx"]="Hi Awk";print array[10000];print array["idx"];}'
# 结果
Hello array
Hi Awk

判断方式访问元素

# 通过索引是否在数组内来打印元素。
awk 'BEGIN{array[10000]="Hello array";array["idx"]="Hi Awk";if (10000 in array) print array[10000];}'
#结果
Hello array

循环遍历索引

# 通过for循环遍历关联数组的索引
awk 'BEGIN{array[10000]="Hello array";array["idx"]="Hi Awk";array[3]="three"; for(var in array) print var;}'
#结果
idx
10000
3

循环遍历元素 

# 通过for循环遍历关联数组的元素
awk 'BEGIN{array[10000]="Hello array";array["idx"]="Hi Awk";array[3]="three"; for(var in array) print array[var];}'
#结果
Hi Awk
Hello array
three

删除元素 

# 通过DELETE关键字删除关联数据里的元素
awk 'BEGIN{array[10000]="Hello array";array["idx"]="Hi Awk";array[3]="three"; delete array["idx"];for(var in array) print array[var];}'
#结果
Hello array
three

多维数组 

# 1 定义、使用多维数组
awk 'BEGIN{array[1,1]="Hello array";array[1,2]="Hi Awk";array[2,1]="three";array[2,2]="four";for(var in array) print "Index",var,"对应值为:",array[var];}'

#结果:
Index 11 对应值为: Hello array
Index 21 对应值为: three
Index 12 对应值为: Hi Awk
Index 22 对应值为: four

注:这里是多维数组的形式,数组的索引下标分割符”\\034”。

# 2 如果数组下标里加上引号,则视为单维数组。
awk 'BEGIN{array["1,1"]="Hello array";array["1,2"]="Hi Awk";array["2,1"]="three";array["2,2"]="four";for(var in array) print "Index",var,"对应值为:",array[var];}'
# 单维数组的结果
Index 2,1 对应值为: three
Index 1,2 对应值为: Hi Awk
Index 2,2 对应值为: four
Index 1,1 对应值为: Hello array


# 3 多维数组、单维混合情况。
awk 'BEGIN{array["1,1"]="Hello array";array["1,2"]="Hi Awk";array[2,1]="three";array[2,2]="four";for(var in array) print "Index",var,"对应值为:",array[var];}'

#结果
Index 1,2 对应值为: Hi Awk
Index 21 对应值为: three
Index 22 对应值为: four
Index 1,1 对应值为: Hello array

# 4 可以指定数组下表的显示格式,这里通过SUBSEP(subscript separator)变量来设置。这里指定为”#”。
awk 'BEGIN{SUBSEP="#";array[1,1]="Hello array";array[1,2]="Hi Awk";array[2,1]="three";array[2,2]="four";for(var in array) print "Index",var,"对应值为:",array[var];}'
#结果
Index 1#1 对应值为: Hello array
Index 2#1 对应值为: three
Index 1#2 对应值为: Hi Awk
Index 2#2 对应值为: four

 数组元素排序

# 1 对给定的数组就行排序然后打印。
awk 'BEGIN{array[10000]="Welcome array";array[1]="Hi Awk";array[3]="three";for(var in array) print "行号:",var,array[var]; rnt =asort(array);for(var in array) print "行号:",var,array[var]; print "总行:",rnt;}'

# 结果,这里发现数组里的元素按照字母表重新排序了。
行号: 10000 Welcome array
行号: 1 Hi Awk
行号: 3 three
行号: 1 Hi Awk
行号: 2 Welcome array
行号: 3 three
总行: 3

# 2 如果同时保留原数组的顺序,则可通过asort(originalarray,newarray),遍历newarry需要提供rnt遍历,详细例子见下:
awk 'BEGIN{array[10000]="Welcome array";array[1]="Hi Awk";array[3]="three";for(var in array) print "行号:",var,array[var]; rnt =asort(array,arr);for(i=1;i<=rnt;i++) print "行号:",i,arr[i]; print "总行:",rnt;}'
# 结果
行号: 10000 Welcome array
行号: 1 Hi Awk
行号: 3 three
行号: 1 Hi Awk
行号: 2 Welcome array
行号: 3 three
总行: 3

数组索引排序

# 对数组里的索引排序后显示
awk 'BEGIN{array[10000]="Welcome array";array[1]="Hi Awk";array[3]="three";for(var in array) print "行号:",var,array[var]; rnt =asorti(array,arr);for(i=1;i<=rnt;i++) print "行号:",i,arr[i]; print "总行:",rnt;}'

#结果
行号: 10000 Welcome array
行号: 1 Hi Awk
行号: 3 three
行号: 1 1
行号: 2 10000
行号: 3 3
总行: 3

#注:这里的排序是按照字符串来,而不会将字符串形式的数字转换为数字再排序。

 

以上是关于打开高效文本编辑之门_Linux awk之关联数组的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

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

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