awk linux 数组,Linux中的awk数组的基本使用方法

awk linux 数组,Linux中的awk数组的基本使用方法1.awk数组描述在其他的编程语言中,数组的下标都是从0开始的,也就是说,如果想反向引用数组中的第一个元素,则需要引用对应的下标[0],在awk中数组也是通过引用下标的方法,但是在awk中数组的下标是从1开始的,在其他语言中,你可能会习惯于先“声明”一个数组,在awk中,则不用这样,直接为数组的元素赋值即可(其实如果自己给数组赋值,下标从1或者从0开始那就无所谓了!)2.在声明数组时,可能值很多…

大家好,又见面了,我是你们的朋友全栈君。

1.awk数组描述

在其他的编程语言中,数组的下标都是从0开始的,也就是说,如果想反向引用数组中 的第一个元素,则需要引用对应的下标[0],在awk中数组也是通过引用下标的方法,但是在awk中数组的下标是从1开始的,在其他语言中,你可能会习惯于先“声明”一个数组,在awk中,则不用这样,直接为数组的元素赋值即可(其实如果自己给数组赋值,下标从1或者从0开始那就无所谓了!)

2.在声明数组时,可能值很多,命令太长,降低命令可读性,所以使用反斜杠“\”,来进 行换行,效果是完全一样的,代码如下所示:

[zkpk@master as]$ awk ‘BEGIN{arr[1]=”one”;arr[2]=”two”;arr[3]=”three”\

;arr[4]=”four”;print arr[3]}’

three

[zkpk@master as]$ awk ‘BEGIN{arr[1]=”one”;arr[2]=”two”;arr[3]=”three”;arr[4]=”four”;print arr[3]}’

three

3.数组的元素设置为空,是允许的,当数组中没有某个元素而直接引用它的时候,它默认被赋值为空,所以判断某个元素是否存在,不能采用数组元素值为空的方法,而应该采用下面的方法:

[zkpk@master as]$ awk ‘BEGIN{arr[1]=”one”;arr[2]=”two”;arr[3]=”three”;if(4 in arr){print “four in this arr”}}’

[zkpk@master as]$ awk ‘BEGIN{arr[1]=”one”;arr[2]=”two”;arr[3]=”three”;if(3 in arr){print “three in this arr”}}’

three in this arr

也可以采用取反的方式(使用运算符!)

[zkpk@master as]$ awk ‘BEGIN{arr[1]=”one”;arr[2]=”two”;arr[3]=”three”;if(!(4 in arr)){print “four not in this arr”}}’

four not in this arr

4.awk数组下标

在awk中数组的下标不仅可以是“数字”,还可以是“任意字符串”,其实,awk中的数组本来就是“关联数组”,之所以先用数字作为下标举例子是为了方便之前的习惯,能够有个好的过渡,不过,以数字作为数组的下标在某些场景有一定的优势,但是本质上也是“关联数组”,awk默认会把“数字”下标转换成“字符串”,所以它本质上还是一个使用字符串作为下标的“关联数组”

5.删除数组元素

使用 delete 可以删除数组中的元素,也可以使用 delete 删除整个数组

[zkpk@master as]$ awk ‘BEGIN{arr[1]=”one”;arr[2]=”two”;arr[3]=”three”;\

> delete arr[1];print arr[1]}’

____(空)

[zkpk@master as]$ awk ‘BEGIN{arr[1]=”one”;arr[2]=”two”;arr[3]=”three”;\

print arr[1];print arr[3];delete arr;print arr[1]}’

one

three

____(空)

6.使用for循环遍历数组

语法:for(变量 in 数组名){ 代码语句 }

注:其中变量循环的是数组的下标

[zkpk@master as]$ awk ‘BEGIN{arr[1]=”one”;arr[2]=”two”;arr[3]=”three”;arr[4]=”four”;\

> for ( i in arr){print arr[i]}}’

four

one

two

three

#无序的打印数组元素,进一步证明其是“关联数组”

#有序的打印数组元素

[zkpk@master as]$ awk ‘BEGIN{arr[1]=”one”;arr[2]=”two”;arr[3]=”three”;arr[4]=”four”;\

for ( i=1;i<=4;i++){print arr[i]}}’

one

two

three

four

7.awk数组使用实例

[zkpk@master as]$ awk ‘BEGIN{a=1;print a; a=a+1 ; print a}’

1

2

[zkpk@master as]$ awk ‘BEGIN{a=1;print a; a++ ; print a}’

1

2

将变量a设置为1,对其进行自加运算,则其数值会增加1,这不难理解,那么如果变量a是一个字符串哪?

[zkpk@master as]$ awk ‘BEGIN{a=”test”;print a; a++ ; print a}’

test

当a的值为字符串时,竟然也可以参与运算,而且可以看出,字符串被当成数字0参与运算,那么空字符串参与运算时也会被当成0运算吗?

[zkpk@master as]$ awk ‘BEGIN{a=””;print a; a++ ; print a}’

____(空)

结果显示,空字符串在参与运算时也会被当做数字0,之前我们说过,当我们引用数组中一个不存在的元素,元素被赋值成空字符串,当对这个元素进行自加运算时,元素的值就变成了1,因此当我们对一个不存在的元素进行自加运算后,这个元素的值就变成了自加的次数,自加x次,元素的值就被赋值为x,自加y次元素的值就被赋值为y,所以我们可以通过awk数组的这个特性来统计文本中某字符串出现的次数,代码如下所示

[zkpk@master as]$ cat text

Alice

Bob

Tom

Peter

Alice

Alice

Tom

Bob

Peter

Bob

[zkpk@master as]$ awk ‘{count[$1]++};END{for(i in count){print i,count[i]}}’ text

Bob 3

Tom 2

Alice 3

Peter 2

这回你该发现awk数组这个特性的强大所在了吧,好,也许你会说我不用awk照样可以统计啊,代码如下所示:

[zkpk@master as]$ cat text | sort | uniq -c

3 Alice

3 Bob

2 Peter

2 Tom

好吧,我承认你这个思路很棒,但是你看看下面例子哪?统计文本中人名出现的次数

[zkpk@master as]$ cat -tE text

Alice^IBob$

Bob^IAlice Alice Peter$

Tom Bob$

Peter Alice $

Alice Tom$

Alice^I^ITom $

Tom Peter$

Bob Bob$

Peter Alice$

Bob Alice Alice Tom$

#我们可以看出上面的文本中人名之间的分隔符有制表符,也有空格,来吧,统计人名出现的次数吧,

#我使用awk数组的方式可以这样统计

[zkpk@master as]$ awk ‘{for(i=1;i<=NF;i++){count[$i]++} }END{for(j in count)\

{print j , count[j]}}’ text

Bob 6

Tom 5

Alice 9

Peter 4

但若你不用awk,非得用其他命令实现可以参考如下代码( ^_^ )

[zkpk@master as]$ cat text | tr -s “\t” ” ” | tr -s ” ” “\n” | sort | uniq -c

9 Alice

6 Bob

4 Peter

5 Tom

结尾

本文介绍了awk数组的基本使用方法,但是要学会灵活的运用,我在上面的示例中也写出了一些可以在某种程度上替换awk数组的方式,所以本文不单单是介绍awk数组该如何使用,而是如何在合适的场景,选择出最优的解决方案,快速高效的解决问题。这就是我一直追求的,也是我学习Linux命令的真实意图。

以上所述是小编给大家介绍的Linux中的awk数组的基本使用方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/161632.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • maven 本地仓库配置_maven默认的本地仓库

    maven 本地仓库配置_maven默认的本地仓库一、maven配置本地仓库路径1.打开安装好的maven目录2.进入conf–>编辑settings.xml文件3.修改<localRepository>找到并修改<localRepository>,最初是注释掉的,取消注释就可以 <localRepository>你想存放的本地仓库路径</localRepository>(不修改默认${user.home}/.m2/repository这个路径)二、配置中央仓库我这里用的阿里

    2025年11月28日
    32
  • neokylin 系统_centos kde

    neokylin 系统_centos kdeNeoKylin(linux)操作系统基本操作使用的虚拟机工具是VMware虚拟机远程控制工具MobaXterm操作系统:NeoKylin操作系统,(GUI,桥接模式)NeoKylin相关操作开关机操作:init,shutdowm-t/-k/-r/-h…切换用户:suXXX查询文件/目录:ls,ll进入目录:cd绝对路径,相对路径设置别名:alias/unalias查看帮助:help/-hNeoKylin文件操作创建文件touch,vim,echo创建目录m

    2022年8月10日
    8
  • 视频编解码学习之二:编解码框架「建议收藏」

    视频编解码学习之二:编解码框架「建议收藏」第四章视频编码基础 1.压缩码流语法:码流中各个元素的位置关系01001001…图像编码类型(01),宏块类型(00),编码系数1001等语义:每个语法元素所表达的意义。例如:图像编码类型 2.

    2022年7月4日
    33
  • 关于个人能力提升

    关于个人能力提升

    2020年11月12日
    155
  • webstorm激活码【2021免费激活】[通俗易懂]

    (webstorm激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月26日
    516
  • 程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址

    程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址第一幕:缘起听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员……996程序员做的梦:第一场:团队招募为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。话说还是中国电信的信号好,地府都是满格,哈哈!!!经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下?而这次,面对这样的需求,这个程序员…

    2022年6月8日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号