windows ubuntu sed,awk,grep篇:12.awk 关联数组

目录

78. 引用数组元素

79.使用循环遍历 awk 数组

80. 删除数组元素

81. 多维数组

82. SUBSEP 下标分隔符

83. 用 asort 为数组排序

84. 用 asorti 为索引排序


相比较与其他编程语言中的传统数组, awk 的数组更为强大。
Awk 的数组,都是关联数组,即一个数组包含多个 索引 / 的元素。索引没必要是一系列
连续的数字,实际上,它可以使字符串或者数字,并且不需要指定数组长度。
语法:
arrayname[string]=value
arrayname 是数组名称
string 是数组索引
value 是为数组元素赋的值
访问 awk 数组的元素
如果要访问数组中的某个特定元素,使用 arrayname[index] 即可返回该索引中的值。
一个简单的数组赋值示例 :
$ cat array-assign.awk
BEGIN {
item[101]="HD Camcorder";
item[102]="Refrigerator";
item[103]="MP3 Player";
item[104]="Tennis Racket";
item[105]="Laser Printer";
item[1001]="Tennis Ball";
item[55]="Laptop";
item["na"]="Not Available";
print item["101"];
print item[102];
print item["103"];
print item[104];
print item["105"];
print item[1001];
print item["na"];
}
$ awk -f array-assign.awk
HD Camcorder
Refrigerator
MP3 Player
Tennis Racket
Laser Printer
Tennis Ball
Not Available
请注意 :
数组索引没有顺序,甚至没有从 0 1 开始,而是直接从 101….105 开始 , 然后直接
跳到 1001 ,又降到 55 ,还有一个字符串索引 ”na”.
数组索引可以是字符串,数组的最后一个元素就是字符串索引,即 ”na”
Awk 中在使用数组前,不需要初始化甚至定义数组,也不需要指定数组的长度。
Awk 数组的命名规范和 awk 变量命名规范相同。 awk 的角度来说,数组的索引通常是字符串,即是你使用数组作为索引, awk 也会当
做字符串来处理。下面的写法是等价的:
Item[101]=”HD Camcorder”
Item[“101”]=”HD Camcorder”

78. 引用数组元素

如下所示,可以使用 print 命令直接打印数组的元素,也可以把元素的值赋给其他变量以便
后续使用。
print item[101]
x=item[105]
如果视图访问一个不存在的数组元素, awk 会自动以访问时指定的索引建立该元素,并赋予
null 值。为了避免这种情况,在使用前最后检测元素是否存在。
使用 if 语句可以检测元素是否存在,如果返回 true,说明改元素存在于数组中。
if ( index in array-name )
一个简单的引用数组元素的例子 :
$ cat array-refer.awk
BEGIN {
x = item[55];
if ( 55 in item )
print "Array index 55 contains",item[55];
item[101]="HD Camcorder";
if ( 101 in item )
print "Array index 101 contains",item[101];
if ( 1010 in item )
print "Array index 1010 contains",item[1010];
}
$ awk -f array-refer.awk
Array index 55 contains
Array index 101 contains HD Camcorder
该例中:
z Item[55] 在引用前没有赋任何值,所以在引用是 awk 自动创建该元素并赋 null
z Item[101] 是一个已赋值的缘分,所以在检查索引值时返回 true ,打印该元素
z Item[1010] 不存在,因此检查索引值时,返回 false ,不会被打印

79.使用循环遍历 awk 数组

如果要访问数组中的所有元素,可以使用 for 的一个特殊用法来遍历数组的所有索引: 语法:
for ( var in arrayname )
actions
其中 :
var 是变量名称
in 是关键字
arrayname 是数组名
actions 是一系列要执行的 awk 语句,如果有多条语句,必须包含在 { } 中。通过把
索引值赋给变量 var ,循环体可以把所有语句应用到数组中所有的元素上。
在示例 ”for (x in item)” 中, x 是变量名,用来存放数组索引。
请注意,我们并没有指定循环执行的条件,实际上我们不比关系数组中有多少个元素,因为
awk 会自动判断,在循环结束前遍历所有元素。
下面的例子遍历数组中所有元素并打印出来。
$ cat array-for-loop.awk
BEGIN {
item[101]="HD Camcorder";
item[102]="Refrigerator";
item[103]="MP3 Player";
item[104]="Tennis Racket";
item[105]="Laser Printer";
item[1001]="Tennis Ball";
item[55]="Laptop";
item["no"]="Not Available";
for(x in item)
print item[x]
}
$ awk -f array-for-loop.awk
Not Available
Laptop
HD Camcorder
Refrigerator
MP3 Player
Tennis Racket
Laser Printer
Tennis Ball

80. 删除数组元素

如果要删除特定的数组元素,使用 delete 语句。一旦删除了某个元素,就再也获取不到它
的值了。
语法:
delete arrayname[index];
删除数组内所有元素
for (var in array)
delete array[var]
GAWK 中,可以使用单个 delete 命令来删除数组的所有元素 :
Delete array
此外,下面例子中 ,item[103]=”” 并没有删除整个元素,仅仅是给它赋了 null 值。
$ cat array-delete.awk
BEGIN {
item[101]="HD Camcorder";
item[102]="Refrigerator";
item[103]="MP3 Player";
item[104]="Tennis Racket";
item[105]="Laser Printer";
item[1001]="Tennis Ball";
item[55]="Laptop";
item["no"]="Not Available";
delete item[102]
item[103]=""
delete item[104]
delete item[1001]
delete item["na"]
for(x in item)
print "Index",x,"contains",item[x]
}
$ awk -f array-delete.awk
Index no contains Not Available
Index 55 contains Laptop
Index 101 contains HD Camcorder
Index 103 contains
Index 105 contains Laser Printer

81. 多维数组

虽然 awk 只支持一维数组,但其奇妙之处在于,可以使用一维数组来模拟多维数组。
假定要创建下面的 2X2 维数组 :
10 20
30 40 其中位于 ”1,1” 的元素是 10 ,位于 ”1,2” 的元素是 20 ,等等 …, 下面把 10 赋值给 ”1,1” 的元素 :
item[“1,1”]=10
即使使用了 ”1,1” 作为索引值,它也不是两个索引,仍然是单个字符串索引,值为 ”1,1” 。所
以上面的写法中,实际上是把 10 赋给一维数组中索引 ”1,1” 代表的值。
$ cat array-multi.awk
BEGIN {
item["1,1"]=10;
item["1,2"]=20;
item["2,1"]=30;
item["2,2"]=40
for (x in item)
print item[x]
}
$ awk -f array-multi.awk
30
20
40
10
现在把索引外面的引号去掉,会发生什么情况?即 item[1,1]( 而不是 item[“1,1”]):
$ cat array-multi2.awk
BEGIN {
item[1,1]=10;
item[1,2]=20;
item[2,1]=30;
item[2,2]=40
for (x in item)
print item[x]
}
$ awk -f array-multi2.awk
10
30
20
40
上面的例子仍然可以运行,但是结果有所不同。在多维数组中,如果没有把下标用引号引住,
awk 会使用 ”\034” 作为下标分隔符。
当指定元素 item[1,2] 时,它会被转换为 item[“1\0342”] Awk 用把两个下标用 ”\034” 连接起
来并转换为字符串。 当使用 [“1,2”] 时,则不会使用 ”\034” ,它会被当做一维数组。
如下示例
$ cat array-multi3.awk
BEGIN {
item["1,1"]=10;
item["1,2"]=20;
item[2,1]=30;
item[2,2]=40;
for(x in item)
print "Index",x,"contains",item[x];
}
$ awk -f array-multi3.awk
Index 1,2 contains 20
Index 21 contains 30
Index 22 contains 40
Index 1,1 contains 10
其中 :
索引 ”1,1” ”1,2” 放在了引号中,所以被当做一维数组索引, awk 没有使用下标分
隔符,因此,索引值被原封不动地输出。
所以 2,1 2,2 没有放在引号中,所以被当做多维数组索引, awk 使用下标分隔符
来处理,因此索引变成 ”2\0341” ”2\0342”, 于是在两个下标直接输出了非打印字符
“\034”

82. SUBSEP 下标分隔符

通过变量 SUBSEP 可以把默认的下标分隔符改成任意字符,下面例子中, SUBSEP 被改成了分
:
$ cat array-multi4.awk
BEGIN {
SUBSEP=":";
item["1,1"]=10;
item["1,2"]=20;
item[2,1]=30;
item[2,2]=40;
for(x in item)
print "Index",x,"contains",item[x];
}
$ awk -f array-multi4.awk
Index 1,2 contains 20
Index 2:1 contains 30
Index 2:2 contains 40
Index 1,1 contains 10
这个例子中,索引 ”1,1” ”1,2” 由于放在了引号中而没有使用 SUBSEP 变量。
所以,使用多维数组时,最好不要给索引值加引号,如 :
$ cat array-multi5.awk
BEGIN {
SUBSEP=":";
item[1,1]=10;
item[1,2]=20;
item[2,1]=30;
item[2,2]=40;
for(x in item)
print "Index",x,"contains",item[x];
}
$ awk -f array-multi5.awk
Index 1:1 contains 10
Index 2:1 contains 30
Index 1:2 contains 20
Index 2:2 contains 40

83. asort 为数组排序

asort 函数重新为元素值排序,并且把索引重置为从 1 n 的值,此处 n 代表数组元素个数。
假定一个数组有两个元素 :item[“something”]=”B - I’m big b” item[“notsure”]=”A – I’m big a”
调用 asort 函数手,数组会以元素值排序,变成 :item[1]=”A – I’m big a” item[2]=”B – I’m big
b”
下面例子中,数组索引是非连续的数字和字符串,调用 asort 后,元素值被排序,并且索引
值变成 1,2,3,4…. 请注意, asort 函数会返回数组元素的个数。
$ cat asort.awk
BEGIN {
item[101]="HD Camcorder";
item[102]="Refrigerator"; item[103]="MP3 Player";
item[104]="Tennis Racket";
item[105]="Laser Printer";
item[1001]="Tennis Ball";
item[55]="Laptop";
item["na"]="Not Available";
print "---------- Before asort -------------"
for(x in item)
print "Index",x,"contains",item[x]
total = asort(item);
print "---------- After asort -------------"
for(x in item)
print "Index",x,"contains",item[x]
print "Return value from asort:",total;
}
$ awk -f asort.awk
---------- Before asort -------------
Index 55 contains Laptop
Index 101 contains HD Camcorder
Index 102 contains Refrigerator
Index 103 contains MP3 Player
Index 104 contains Tennis Racket
Index 105 contains Laser Printer
Index na contains Not Available
Index 1001 contains Tennis Ball
---------- After asort -------------
Index 4 contains MP3 Player
Index 5 contains Not Available
Index 6 contains Refrigerator
Index 7 contains Tennis Ball
Index 8 contains Tennis Racket
Index 1 contains HD Camcorder
Index 2 contains Laptop
Index 3 contains Laser Printer
Return value from asort: 8
这个例子中, asort 之后,数组打印顺序不是按索引值从 1 8 ,而是随机的。可以用下面
的方法,按索引值顺序打印 :
$ cat asort1.awk
BEGIN {
item[101]="HD Camcorder";
item[102]="Refrigerator"; item[103]="MP3 Player";
item[104]="Tennis Racket";
item[105]="Laser Printer";
item[1001]="Tennis Ball";
item[55]="Laptop";
item["na"]="Not Available";
total = asort(item);
for(i=1;i<=total;i++)
print "Index",i,"contains",item[i]
}
$ awk -f asort1.awk
Index 1 contains HD Camcorder
Index 2 contains Laptop
Index 3 contains Laser Printer
Index 4 contains MP3 Player
Index 5 contains Not Available
Index 6 contains Refrigerator
Index 7 contains Tennis Ball
Index 8 contains Tennis Racket
或许你已经注意到,一旦调用 asort 函数,数组原始的索引值就不复存在了。因此,你可能
想在不改变原有数组索引的情况下,使用新的索引值创建一个新的数组。
下面的例子中,原始数组 item 不会被修改,相反,使用排序后的新索引值创建新数组 itemnew,
itemnew[1],itemnew[2],itemnew[3], 等等。
total = asort(item,itemnew);
再次申明,务必牢记 asort 函数按元素值排序 , 但排序后使用从 1 开始的新索引值,原先的索
引被覆盖掉了。

84. asorti 为索引排序

和以元素值排序相似,也可以取出所有索引值,排序,然后把他们保存在新数组中。
下面的例子展示了 asort asorti 的不同 , 请牢记下面两点 :
asorti 函数为索引值 ( 不是元素值 ) 排序,并且把排序后的元素值当做元素值保存。
如果使用 asorti(state) 将会丢失原始元素值,即索引值变成了元素值。因此为了保
险起见,通常给 asorti 传递两个参数,即 asorti(state,statebbr). 这样一来,原始数组
state 就不会被覆盖了。
$ cat asorti.awk
BEGIN {
state["TX"]="Texas";
state["PA"]="Pennsylvania";
state["NV"]="Nevada";
state["CA"]="California";
state["AL"]="Alabama";
print "-------------- Function: asort -----------------"
total = asort(state,statedesc);
for(i=1;i<=total;i++)
print "Index",i,"contains",statedesc[i];
print "-------------- Function: asorti -----------------"
total = asorti(state,stateabbr);
for(i=1;i<=total;i++)
print "Index",i,"contains",stateabbr[i];
}
$ awk -f asorti.awk
-------------- Function: asort -----------------
Index 1 contains Alabama
Index 2 contains California
Index 3 contains Nevada
Index 4 contains Pennsylvania
Index 5 contains Texas
-------------- Function: asorti -----------------
Index 1 contains AL
Index 2 contains CA
Index 3 contains NV
Index 4 contains PA
Index 5 contains TX

资料来源于《SedandAwk101Hacks》,大家有兴趣可以买一本,也可以关注我,我更新完它。

曾经,我花费大半月将它们跑完,现在啥都忘了,还是要常用。

只为学习交流,不为获利,侵权联系立删。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/831366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

挑战一周完成Vue3项目Day4: 用户管理+角色管理+菜单管理+首页+暗黑模式/主题切换

一、用户管理 1.静态搭建 src/views/acl/user/index.vue <template><el-card style"height:80px;"><el-form :inline"true" class"form"><el-form-item label"用户名&#xff1a;"><el-input placehold…

Docker——生产案例(如何修改Docker部署服务的端口映射)

目录 前言 1. 测试环境中新建Apache服务 2.停止容器和Docker服务 3.修改容器配置 4.重启Docker服务并访问测试 前言 由于接替原工作人员的工作之后&#xff0c;上级需要修改Docker部署Apache服务的端口映射&#xff0c;将89端口修改为99端口&#xff0c;那我们该如何修改呢…

JAVA 学习·泛型(二)——通配泛型

有关泛型的基本概念&#xff0c;参见我的前一篇博客 JAVA 学习泛型&#xff08;一&#xff09;。 协变性 泛型不具备协变性 在介绍通配泛型之前&#xff0c;先来看一下下面的例子。我们定义了一个泛型栈&#xff1a; import java.util.ArrayList; class GenericStack<E>…

如何完全卸载QT

第一步&#xff0c;用QT自带的软件卸载QT 第二步&#xff0c;卸载下面路径的所有QT配置 C:用户/(你的用户)/AppData/Local/目录下所有与Qt相关内容 C:用户/(你的用户)/AppData/Local/Temp/所有与Qt相关内容 C:用户/(你的用户)/AppData/Roaming/所有与Qt相关内容

android init进程启动流程

Android系统完整的启动流程 android 系统架构图 init进程的启动流程 init进程启动服务的顺序 bool Service::Start() {// Starting a service removes it from the disabled or reset state and// immediately takes it out of the restarting state if it was in there.flags_…

【C语言笔记】【有点逗系列】 一个打印 Hello, world! 的程序

【C语言笔记】【有点逗系列】 一个打印 Hello, world! 的程序 有点逗系列内容。用于记录各式各样有点逗甚至没有什么用的C语言用法☺。 功能说明 在网上看到了一个表面上很混乱但是实则没什么用处的打印 Hello, world! 的程序。 程序如下&#xff1a; main(){int i,n[]{(((…

开发和运维同学必备的文件操作相关的bash命令

开发和运维同学必备的文件操作相关的Linux命令&#xff1a; ls&#xff1a;列出当前目录的文件和文件夹。 lscd&#xff1a;切换目录。 cd /path/to/directorypwd&#xff1a;显示当前所在目录。 pwdmkdir&#xff1a;创建新目录。 mkdir directory_namerm&#xff1a;删除文件…

vue快速入门(五十一)历史模式

注释很详细&#xff0c;直接上代码 上一篇 新增内容 历史模式配置方法 默认哈希模式&#xff0c;历史模式与哈希模式在表层的区别是是否有/#/ 其他差异暂不深究 源码 //导入所需模块 import Vue from "vue"; import VueRouter from "vue-router"; import m…

201903青少年软件编程(Python)模拟考试试卷(一级)

第 1 题 【单选题】 假设 a10, b30,那么a/b的值的的&#xff08; &#xff09; A :300 B :20 C :3 D :0.33333 正确答案:D 试题解析: 第 2 题 【单选题】 下面代码的输出结果是 print&#xff08;round(0.1 0.2,1) 0.3&#xff09; A :0 B :1 C :True D :False 正确答…

Hive 表定义主键约束

文章目录 1.建表语句2.主键约束3.主键约束的意义参考文献 1.建表语句 先看一下官方给的完整的见表语句&#xff1a; CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name -- (Note: TEMPORARY available in Hive 0.14.0 and later)[(col_name data…

关于YOLO8学习(一)环境搭建,官方检测模型部署到手机

一,环境的搭建 环境 win10 python 3.11 cmake pytorch pycharm 过程 首先安装好一个pycharm,这里就不一一叙述了。 其次,选择好一个python版本,是关键所在。有些YOLO的版本,并不支持很高的python版本,博主选用的是python3.11版本。经过实际的测试,这个版本比较合适。…

全新TOF感知RGBD相机 | 高帧率+AI,探索3D感知新境界

海康机器人在近期的机器视觉新品发布会上推出的全新TOF感知RGBD相机,无疑是对当前机器视觉技术的一次革新。这款相机不仅融合了高帧率、轻松集成、体积小巧以及供电稳定等诸多优点,更重要的是,它将AI与3D感知技术完美结合,通过高帧率+AI算法,实现了对不同场景的快速捕捉与…

电脑重装系统ip地址会变吗

在数字化世界中&#xff0c;IP地址就像是每个计算机设备的“门牌号”&#xff0c;它帮助我们在互联网上进行定位和通信。然而&#xff0c;当我们的电脑系统进行重新安装时&#xff0c;许多用户会担心其IP地址是否会发生改变。虎观代理小二将带您深入探讨电脑重装系统后IP地址的…

Android Studio报错:Constant expression required

【出现的问题】&#xff1a; 使用JDK17以上版本&#xff0c;switch语句报错&#xff1a;Constant expression required 【解决方法】&#xff1a; 在gradle.properties配置文件下添加代码&#xff1a; android.nonFinalResIdsfalse 如图&#xff1a; 接着再点击右上角的Sync…

C# 中使用 LINQ可以采取一些优化策略来提高,效率延迟加载可以使查询结果在需要时才进行计算,而不是立即计算

使用延迟加载&#xff1a;延迟加载可以使查询结果在需要时才进行计算&#xff0c;而不是立即计算。这可以减少不必要的开销。 var query collection.Where(x > x.SomeCondition).Select(x > x.SomeProperty);减少查询的数据量&#xff1a;尽量在数据库层面或者数据源层…

详解 Go 程序的启动流程,你知道 g0,m0 是什么吗?

自古应用程序均从 Hello World 开始&#xff0c;你我所写的 Go 语言亦然&#xff1a; import "fmt"func main() {fmt.Println("hello world.") }这段程序的输出结果为 hello world.&#xff0c;就是这么的简单又直接。但这时候又不禁思考了起来&#xff0…

Android Studio实现简单的自定义钟表

项目目录 一、项目概述二、开发环境三、详细设计3.1、尺寸设置3.2、绘制表盘和指针3.3、动态效果 四、运行演示五、总结展望六、源码获取 一、项目概述 在安卓开发中&#xff0c;当系统自带的View已经无法满足项目需求时&#xff0c;就要自定义View。在Android中是没有与钟表有…

chrome extension插件替换网络请求中的useragent

感觉Chrome商店中的插件不能很好的实现自己想要的效果,那么就来自己动手吧。 本文以百度为例: 一般来说网页请求如下: 当前使用的useragent是User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safar…

android studio项目实战——备忘录(附源码)

成果展示&#xff1a; 1.前期准备 &#xff08;1&#xff09;在配置文件中添加权限及启动页面顺序 ①展开工程&#xff0c;打开app下方的AndroidManifest.xml,添加权限&#xff0c;如下&#xff1a; <uses-permission android:name"android.permission.CAMERA"…

【Proteus】LED呼吸灯 直流电机调速

1.LED呼吸灯 #include <REGX51.H> sbit LEDP2^0; void delay(unsigned int t) {while(t--); } void main() {unsigned char time,i;while(1){for(time0;time<100;time){for(i0;i<20;i){LED0;delay(time);LED1;delay(100-time);}}for(time100;time>0;time--){fo…