awk linux 数组,Linux中的awk数组的基本使用方法
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数组的基本使用方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
awk linux 数组,Linux中的awk数组的基本使用方法相关推荐
- 查找数组B中不在数组A中的元素
@查找数组B中不在数组A中的元素(小白学demo_day1) 查找数组B中不在数组A中的元素 数组A(N个元素)按照从小到大的顺序,数组B(M个元素)无序 查找数组B中不在数组A中的元素 步骤: (方 ...
- linux 安装程序丢失链接动态库,Linux安装软件过程中提示缺少动态链接库.so的解决方法...
Linux在安装软件的时候有时会出现错误,提示缺少动态链接库.so,该问题是由什么原因导致的呢? 情况分析: 1.缺少动态连接库.so-cannot open shared object file:N ...
- python list转数组_python中list与数组
1.list转换为数组 python中list转换为数组的方法为:b = np.array(list) 今天在使用该方法将二维list转换为二维数组时一直不成功,结果仍然是两个list,最后发现是两个 ...
- 算法题1:数组A中存在而数组B中不存在的元素
1.题目描述: 有2个整型数组A和B,要求找出数组A中存在而数组B中不存在的元素,并打印输出(保持原顺序) 例如, 输入数组A:1 2 3 5 输如数组B:2 3 4 输出:1 5 2.python3 ...
- python怎么定义整数数组_python中输入整数数组长度python基础语法
变量 数字类型 运算符 流程控制 while循环 dead loop continue vs break while else 变量(Varibles) W WW.002pc .COM认为此文章对&l ...
- Linux下C++中可使用的3种Hook方法
Hook即钩子,截获API调用的技术,是将执行流程重定向到你自己的代码,类似于hack.如使程序运行时调用你自己实现的malloc函数代替调用系统库中的malloc函数.这里介绍下Linux下C++中 ...
- html怎么把图片放到数组,HTML5中的图像数组
所以,如果我想在网上抓取几张图片,将它们放入一个数组中并在网站上使用它们,我正在使用Javascript怎么做.HTML5中的图像数组 var images = [ {caption: "R ...
- ios 字符串转数组_ES6中常用的数组操作-必须收藏
来源:https://www.jianshu.com/p/a1f43027d3fd 判断是否为数组: const array = new Array();array instanceof Array; ...
- linux命令行改名字,使用nmcli在Linux命令行中更改或设置主机名的方法
如何使用nmcli在Linux机器上设置机器主机名?是否可以使用nmcli网络管理工具在CentOS/RHEL/Fedora/Ubuntu/Debian/RHCOS/FCOS机器上更改主机名?这两个问 ...
- 类型数组HTML5 中的新数组
每日一贴,今天的内容关键字为类型数组 Javascript中的数组是个壮大的家伙: 你可以创立的时候不定规长度,而是动态的去变改长度. 你可以把他成当通普的数组去取读,也可以当他是堆栈来用使. 你可以 ...
最新文章
- 直观讲解一下 RPC 调用和 HTTP 调用的区别!
- 【Jboss】热部署
- 《数据库原理与应用》(第三版)第12章 函数和游标 基础 习题参考答案
- *** line xxxx of `fraud.data': bad value of xxxx for attribute `id_11'
- [数据结构]链表中销毁和清空的区别
- java模拟银行_java模拟银行交易系统程序
- [Robot Framework] 怎么写动态等待?
- Flask框架 之重定向、cookie和session
- 【LeetCode】【数组】题号:73,矩阵置零
- 编译icedTea-web报错填坑之旅
- 人生七年 全系列 英文版(中文字幕)
- 小程序获取带有分享者信息的小程序码
- f5 gtm 工作原理_F5 LTM工作原理.ppt
- photoshop中的快速选择工具
- 基于Transformer的NLP智能对话机器人实战课程培训
- 看完这套书才发现,以前的四大名著都白看了!
- 将 zlib 引入到C++项目中 历程
- SQL 校验身份证号格式
- android 简单的贪吃蛇小游戏
- 2021J - Circular Billiard Table