0

0

awk从放弃到入门(9):awk数组详解

雪夜

雪夜

发布时间:2025-07-22 11:40:24

|

356人浏览过

|

来源于php中文网

原创

大家好,很高兴再次与你们见面,我是你们的朋友全栈君。

本文的知识点是在之前文章的基础上展开的,如果你还没有掌握前面的内容,请先参考之前的文章。

注意:阅读本文之前,最好已经掌握了一些开发的基本语法,例如for循环和数组的基本使用,否则可能在阅读过程中遇到困难。

在前文中提到过,awk可以被视为一种脚本语言,因为它包含了脚本语言的各种语法结构,如条件判断语句和循环语句。那么,awk中是否可以使用“数组”呢?当然可以,今天我们就来详细探讨awk中的数组。

如果你有任何一种编程语言的使用经验,你一定知道,我们可以通过数组的下标(或称为索引)来引用数组中的元素。在其他语言中,数组的下标通常从0开始,即要引用第一个元素,需要使用下标“[0]”。在awk中,数组元素的下标默认从1开始,但为了兼容你的使用习惯,我们也可以从0开始设置下标,此处不必纠结,稍后你会理解。我们先来看一个简单的示例。

在其他语言中,你可能习惯于先“声明”一个数组,但在awk中,不需要这样做,直接为数组中的元素赋值即可,示例如下。

awk从放弃到入门(9):awk数组详解如图所示,为了方便示例,上例使用了BEGIN模式。在BEGIN模式中,存在一个名为“葫芦娃”(拼音)的数组,我们在这个数组中放置了3个元素,第一个元素为“大娃”,第二个元素为“二娃”,第三个元素为“三娃”。如果我们想要引用数组中第二个元素的值,只需引用下标为1的元素即可。正如图中所示,我们使用下标“[1]”,获得了huluwa这个数组中第二个元素的值,即“二娃”。

当然,如果你想看到更多的“葫芦娃”,可以在数组中放置更多的元素。

awk从放弃到入门(9):awk数组详解如图所示,由于命令较长,可读性可能较差。为了在编写时提高命令的可读性,我们可以使用Linux命令行的“换行符”进行换行。在Linux中,命令行的换行符为反斜杠“\”,上述命令换行后如下。

awk从放弃到入门(9):awk数组详解可以看到,目前葫芦娃数组中已经有6个葫芦娃了,我们可以获取到我们想要的葫芦娃。换句话说,我们可以通过数组的下标,获取到任何一个元素的值。

我们知道,在动画中,六娃的超能力是“隐身”,所以六娃也叫“隐身娃”。那么,我们就把上述数组中的第5个元素的值设置为“空字符串”吧,用空字符串表示六娃已经“隐身”了,示例如下。

awk从放弃到入门(9):awk数组详解如图所示,上例中数组中的第5个元素的值被设置为“空字符串”。当我们打印数组中的第5个元素的值时,打印出的值就是“空”(注意:“空格”不为“空”)。

为什么要举这个例子呢?之所以举这个例子,是因为在awk中,元素的值可以设置为“空”。在awk中,将元素的值设置为“空字符串”是合法的。

既然在awk中,元素的值可以为“空”,那么我们就不能再根据元素的值是否为“空”去判断元素是否存在了。因此,在awk中,如果你使用如下方法判断数组中的元素是否存在,是不合理的,如下图所示。

awk从放弃到入门(9):awk数组详解如图所示,第6个元素明明已经存在,但通过上述方法判断元素是否存在时,仍然显示对应的元素不存在。

其实,使用上述方法判断元素是否存在之所以不合理,除了上述原因,还有另外一个原因,就是当一个元素不存在于数组时,如果我们直接引用这个不存在的元素,awk会自动创建这个元素,并且默认为这个元素赋值为“空字符串”,示例如下。

awk从放弃到入门(9):awk数组详解如图所示,数组中并没有第7个元素,但当我们输出第7个元素时,输出了“空”。因此,出于此原因,在awk中使用之前的方法判断元素是否为空也是不合理的,因为当我们引用一个不存在于数组中的元素时,这个元素其实已经被赋值为“空字符串”了,如下图所示。

awk从放弃到入门(9):awk数组详解那么,在awk中,应该怎样判断元素是否存在呢?我们可以使用如下语法。

awk从放弃到入门(9):awk数组详解如图所示,我们可以使用语法 “if(下标 in 数组名)” ,从而判断数组中是否存在对应的元素。

当然,我们还可以使用 “!” 对条件进行取反,如下图所示。

awk从放弃到入门(9):awk数组详解在awk中,数组的下标不仅可以为“数字”,还可以为“任意字符串”。如果你使用过shell中的数组,你可以把awk的数组比作bash中的“关联数组”,示例如下。

awk从放弃到入门(9):awk数组详解其实,awk中的数组本来就是“关联数组”。之所以先用以数字作为下标的数组举例,是为了让读者能够更好地过渡。不过,以数字作为数组下标的数组在某些场景中有一定的优势,但它本质上也是关联数组。awk默认会把“数字”下标转换为“字符串”,所以,本质上它还是一个使用字符串作为下标的关联数组。

使用delete可以删除数组中的元素,如下所示。

awk从放弃到入门(9):awk数组详解也可以使用delete删除整个数组,如下所示。

awk从放弃到入门(9):awk数组详解到目前为止,我们已经介绍了怎样为数组中的元素赋值、怎样输出数组中的某个元素、以及怎样删除数组中的元素。那么现在,我们来聊聊在awk中怎样输出数组中的所有元素。在awk中,如果想要输出数组中的所有元素,则需要借助for循环语句。还记得在前文中介绍for循环时,有两种for循环语法吗?我们来回顾一下。

Shell

1 2 3 4 5 6 7 8 9 #for循环语法格式1 for (初始化 ; 布尔表达式 ; 更新 ) { //代码语句 } #for循环语法格式2 for (变量 in 数组 ) { //代码语句 } 这两种for循环语法都能够遍历输出数组中的元素,不过第一种for循环语法只能输出以数字作为下标的数组,示例如下。

awk从放弃到入门(9):awk数组详解你一定看出来了,我们利用了for循环中的变量“i”与数组中的下标都是“数字”的这一特性,按照顺序输出了数组中的元素值。

那么,当数组中的元素的下标为“无规律的字符串”时,我们该怎么办呢?这时可以使用for循环的第二种语法,示例如下。

awk从放弃到入门(9):awk数组详解注意,在这种语法中,for循环中的变量“i”表示的是元素的下标,而并非表示元素的值。所以,如果想要输出元素的值,则需要使用“print 数组名[变量]”。

细心如你,一定发现了一个小问题,当数组中的下标为“字符串”时,元素值输出的顺序与元素在数组中的顺序不同。这是因为awk中的数组本质上是关联数组,所以默认打印出的元素是无序的。

那么你可能会提问了,既然之前说过,数字下标最终也会被转换成“字符串”,本质上也是关联数组,既然都属于关联数组,那么为什么第一种for循环语法能够按照顺序输出数组中的元素值呢?

这就是以数字作为下标的优势。因为第一种for循环语法中的变量“i”为数字,由于for循环的原因,“i”是按照顺序递增的,当“i”的值与下标的值相同时,我们即可按照下标的顺序,输出对应元素的值。换句话说就是,我们是通过下标的顺序,输出对应元素值的顺序,也就是键值定位。但是,即使数组元素的下标为数字,如果使用第二种for循环语法,也不能够按照顺序输出,示例如下。

awk从放弃到入门(9):awk数组详解上例又印证我们之前所说的,awk中的数组本质上就是关联数组。

我想,经过上述对比,你应该已经明白了。

在前文中,我们都是手动为数组中的元素赋值,那么我们能不能将指定的文本分割,然后将分割后的字段自动赋值到数组的元素中呢?答案是肯定的,但如果我们想要实现这样的效果,需要借助于split函数,而我们还没有介绍过函数,所以此处就先跳过了。不过需要提前说明的是,通过split函数生成的数组的下标默认是从1开始的,这就是为什么之前说,awk中数组的下标默认是从1开始的了。

在实际的工作中,我们往往会使用数组,统计某些字符出现的次数。比如,我们想要统计日志中每个IP地址出现了多少次,我们就可以利用数组去统计。

卡奥斯智能交互引擎
卡奥斯智能交互引擎

聚焦工业领域的AI搜索引擎工具

下载

但是在统计的时候需要配合一些特殊用法,别着急,我们慢慢聊。

在awk中,我们可以进行数值运算,示例如下。

awk从放弃到入门(9):awk数组详解我们将变量a的值设置为1,进行加法计算,每次自加后,再次打印变量a的值,都会加1。

这并不难理解,因为上例中,a的值本来就是一个数字。

那么,如果变量a的值是一个字符串,我们能否对变量a进行自加运算呢?我们来试试。

awk从放弃到入门(9):awk数组详解如图所示,在awk中,当变量a的值为字符串时,竟然也可以进行加法运算。从上例可以看出,awk中,如果字符串参与运算,字符串将被当做数字0进行运算。

那么“空字符串”呢?当空字符串参与运算时,也会被当做数字0吗?我们来试试。

awk从放弃到入门(9):awk数组详解看样子,我们猜的不错,空字符串在参与运算时,也会被当做数字0。

之前说过,当我们直接引用一个数组中不存在的元素时,awk会自动创建这个元素,并且为其赋值为“空字符串”。

所以,如果我们引用一个不存在元素,并对其进行自加运算,那么会出现什么效果呢?我们来试一试。

awk从放弃到入门(9):awk数组详解如图所示,当引用了一个不存在的元素时,元素被赋值为空字符串。当对这个元素进行自加运算时,元素的值就变成了1,因为,空字符串在参与运算时,被当做0使用了。所以,综上所述,我们对一个不存在的元素进行自加运算后,这个元素的值就变成了自加运算的次数,自加x次,元素的值就被赋值为x,自加y次,元素的值就被赋值为y,示例如下。

awk从放弃到入门(9):awk数组详解利用这一点,我们就可以统计文本中某些字符出现的次数,比如IP地址,示例如下。

awk从放弃到入门(9):awk数组详解当然,看懂上图中的命令,需要掌握前文中的知识,同时需要理解今天所介绍的知识。

上图中,我们使用了一个空模式,一个END模式。

在空模式中,我们随便创建了一个数组,并且将IP地址作为引用元素的下标,进行了引用。所以,当执行到第一行时,我们引用的是count[“192.168.1.1”]。

很明显,这个元素并不存在,所以,当第一行被空模式中的动作处理完毕后,count[“192.168.1.1”]的值已经被赋值为1了。

由于END模式中的动作会最后执行,所以我们先不考虑END模式。

这时,空模式中的动作继续处理下一行,而下一行的IP地址为192.168.1.2。

所以,count[“192.168.1.2”]第一次参与运算的过程与上述过程同理。

其他IP地址第一次参与运算的过程与上述过程同理。

直到再次遇到相同的IP地址时,使用同样一个IP地址作为下标的元素将会再次被自加,每次遇到相同的IP地址,对应元素的值都会加1。

直到处理完所有行,开始执行END模式中的动作。

而END模式中,我们打印出了count数组中的所有元素的下标,以及元素对应的值。

此刻,count数组中的下标即为IP地址,元素的值即为对应IP地址出现的次数。

最终,我们统计出了每个IP地址出现的次数。

其实,我们就是利用了之前所演示的一个知识点:

我们对一个不存在的元素进行自加运算后,这个元素的值就变成了自加运算的次数。

上述过程可能比较绕,如果你之前没有接触过awk,一遍看不懂是很正常的,自己按照上述过程动手做几遍,细细品味一番,相信你会搞明白的。

如果你以后再想统计文本中某类文本出现的“次数”,就可以使用上述套路了,活学活用以后,你会发现上述套路特别好使。

比如,如果我们想要统计如下文本中每个人名出现的次数,我们则可以使用如下命令。

awk从放弃到入门(9):awk数组详解关于awk中数组的用法,就先总结到这里,这些知识已经能够满足我的日常使用了,但这些并不是数组的全部。如果你想要更加深入地了解数组,可以参考官方手册的数组部分,链接如下。

https://www.php.cn/link/3d5857912169d96359cb6c7df01db19d

希望这篇文章能够帮助到你,如果你觉得对你有所帮助,欢迎留言,常来呦亲~~

发布者:全栈程序员栈长,转载请注明出处:https://www.php.cn/link/9d201c59e6aa7ee34e3f1e6e95669d02

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

192

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

17

2026.02.03

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

846

2023.08.22

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

203

2023.11.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

738

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1561

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

649

2023.11.24

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

46

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.3万人学习

swoole入门物联网开发与实战
swoole入门物联网开发与实战

共15课时 | 1.3万人学习

swoole项目实战(第二季)
swoole项目实战(第二季)

共15课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号