awk数组详解、实战
1.其它编程语言数组的下标一般从0开始,awk中数组下标默认从1开始,也可以从0开始设置:
- awk 'BEGIN{huluwa[0]="大娃";huluwa[1]="二娃";huluwa[3]="三娃";print huluwa[1]}'
- 二娃
- awk 'BEGIN{huluwa[0]="大娃";huluwa[1]="二娃";huluwa[3]="三娃";huluwa[4]="";print huluwa[4]}'
- 第二条命令没有内容输出
2.在awk中,元素的值设置为"空字符串"是合法的,所以不能用元素值是否为空,判断该元素是否存在于数组中.
- 当一个元素不存在于数组时,引用该元素,awk会自动创建这个元素,为这个元素赋值为空字符串,
- 所以引用一个不存在于数组的元素时,这个元素已经被赋值了,也就是已经存在了.
- awk 'BEGIN{huluwa[0]="大娃";huluwa[1]="二娃";huluwa[3]="三娃";huluwa[4]="";
- if(5 in huluwa){print "第6个元素存在就能看到这句话"}}'
3.使用语法if(下标 in 数组名),可以判断数组中是否存在对应的元素.
- awk 'BEGIN{huluwa[0]="大娃";huluwa[1]="二娃";huluwa[3]="三娃";huluwa[4]="";
- if(!(5 in huluwa)){print "第6个元素存在就能看到这句话"}}'
- 第6个元素存在就能看到这句话
4.用delete可以删除数组中的元素,也可以删除整个数组
- awk 'BEGIN{huluwa["yiwa"]="大娃";huluwa["erwa"]="二娃";
- huluwa["sanwa"]="三娃";print huluwa["yiwa"];delete huluwa["yiwa"];print huluwa["yiwa"]}'
- 大娃
- awk 'BEGIN{huluwa["yiwa"]="大娃";huluwa["erwa"]="二娃";
- huluwa["sanwa"]="三娃";print huluwa["yiwa"];delete huluwa;print huluwa["yiwa"]}'
- 大娃
5.两种for循环
- awk 'BEGIN{huluwa[1]="大娃";huluwa[2]="二娃";huluwa[3]="三娃";
- huluwa[4]="四 娃";for(i=1;i<=4;i++){print i,huluwa[i]}}'
- 1 大娃
- 2 二娃
- 3 三娃
- 4 四娃
- awk 'BEGIN{ huluwa["yiwa"]="大娃";huluwa["erwa"]="二娃";huluwa["sanwa"]="三 娃"huluwa["siwa"]="四娃";for(i in huluwa){print i,huluwa[i]} }'
- siwa 四娃
- yiwa 大娃
- erwa 二娃
- sanwa 三娃
发现数组其实是无序的,可以把它当成python中的字典.
6.数组应用1:
- awk 'BEGIN{ a=1; print a; a++; print a}'
- 1
- 2
- 当字符串或者空字符串参与运算时,将被当做数字0.
- awk 'BEGIN{ a="test"; print a; a++; print a; a++; print a}'
- test
- 1
- 2
- awk 'BEGIN{ a=""; print a; a++; print a; a++; print a}'
- 1
- 2
- 引用数组中一个不存在的元素时,元素被赋值为空字符串,参与运算时被当做0使用
- awk 'BEGIN{ print a["ip"]; a["ip"]++;a["ip"]++; print a["ip"]}'
- 2
统计ip出现的次数:
- # cat test10
- 192.168.1.1
- 192.168.1.2
- 192.168.1.3
- 192.168.1.12
- 192.168.1.3
- 192.168.1.3
- 192.168.1.2
- 192.168.1.4
- 192.168.1.12
- 192.168.1.1
- # awk '{count[$1]++} END{for(i in count) {print i,count[i]} }' test10
- 192.168.1.12
- 192.168.1.1
- 192.168.1.2
- 192.168.1.3
- 192.168.1.4
awk实现统计ip次数
7.数组应用2:
- # cat test4
- zhangsan lisi
- wangwu zhaoliu
- zhouqi zhangsan wangwu
- lisi zhaoliu
- # awk '{ for(i=1;i<=NF;i++){a[$i]++} } END{ for(j in a){print j,a[j]} }' test4
- zhaoliu
- zhangsan
- wangwu
- lisi
- zhouqi
awk统计名字出现次数
8.数组应用3:
- # cat a.txt
- 李四|
- 张三|
- 王五|
- 赵六|
- # cat b.txt
- |
- |
- |
- |
- |
- |
- |
- |
- # awk -F '|' 'NR == FNR{a[$2]=$1;} NR>FNR {print a[$1],"|", $0}' a.txt b.txt
- # awk -F "|" 'NR == FNR{a[$2]=$1;next}{print a[$1],"|",$0}' a.txt b.txt
- # awk -F "|" 'NR == FNR{a[$2]=$0;next}{print a[$1]"|"$2}' a.txt b.txt
- 张三 | |
- 张三 | |
- 李四 | |
- 李四 | |
- 李四 | |
- 王五 | |
- 王五 | |
- 赵六 | |
数组的活学活用
解释说明:
在NR == FNR时,也就是在处理前四行时,将数组的格式变成:
a={"000002":"李四","000001":"张三","000003":"王五","000001":"赵六"},
处理剩下的行时,用a[$1]去找姓名,再加上每一行内容就是想要的内容.
9.内置函数(用到时再研究)
- 常用的算数函数--rand、srand、int;
- 字符串函数--sub、gsub替换某些文本,length函数获取指定字符串长度;
- index函数获取的到指定字符串在整个字符串中的位置;
- split函数可以将指定的字符串按照指定的分隔符分割,将每段内容赋值到数组中,从而动态的创建数组.
10.三元运算
三元运算语法:条件?结果1:结果2
- 使用变量usertype接收了三元运算后的返回值,当条件成立时,usertype被赋值为"系统用户",反之为"普通用户"
- awk -F: '{ usertype=$3<500?"系统用户" : "普通用户"; print $1,usertype}' /etc/passwd
- 表达式1?表达式2:表达式3
- awk -F: '{$3<500?a++:b++}END{print a,b}' /etc/passwd
11.打印奇偶行
- # cat test11
- 第 行
- 第 行
- 第 行
- 第 行
- 第 行
- 第 行
- 第 行
- 第 行
- 第 行
test11文件内容
a.当使用了模式时,如果省略了对应的动作,会默认输出整行.
- awk '$2>7' test11
- 第 8 行
- 第 9 行
b.awk中,0或空字符串表示'假',非0值或非空字符串表示'真'.
- # awk '1{print $0}' test3
- hello
- helllo
- # awk '1' test3
- hello
- helllo
- # awk '0' test3 什么也不会输出
- # awk '!0' test3 0取反,即为真
- hello
- helllo
- # awk 'i=1' test3
- hello
- helllo
c.awk开始处理第一行,i被初始化,值为空,模式为假,所以i=!i,是将取反后的值又赋给了i,
此刻i的值为真,在awk处理第一行文本时i为真,且省略了动作,就会打印第一行内容;
在处理第二行时,将在第一行时为真的i取反,此时i为假,故第二行没有被打印.
- awk 'i=!i' test11
- 第 1 行
- 第 3 行
- 第 5 行
- 第 7 行
- 第 9 行
- awk '!(i=!i)' test11 或 awk 'a=!(i=!i)' test11
- 第 2 行
- 第 4 行
- 第 6 行
- 第 8 行
12.awk数组统计状态
- # 先解释split和数组时怎样结合的:
- awk -v ts="dawa;erwa;sanwa" 'BEGIN{ split(ts,huluwa,";");for(i in huluwa){print i,huluwa[i]} }'
- 1 dawa
- 2 erwa
- 3 sanwa
- # split按照指定的分隔符切割字符串,将切割后的字段赋值到元组中,键是数字,值是对应字段.
- netstat -pnta 2>&1|grep 'ESTABLISHED'|head | awk '{ split($5,a,":");b=a[1];c=a[2];{print b,c} }'
- 127.0.0.1 6025
- 127.0.0.1 6026
- 127.0.0.1 6025
- 127.0.0.1 6023
- 127.0.0.1 6025
- 127.0.0.1 6023
- 127.0.0.1 6023
- 127.0.0.1 6026
- 127.0.0.1 9090
- 127.0.0.1 6025
- # 统计ESTABLISHED(已建立的连接)的远程ip:
- netstat -pnta 2>&1|grep 'ESTABLISHED'|awk '{split($5,a,":");b=a[1];count[b]++}END{for(i in count)print i,count[i]}
13.注意几点书写:
不同模式之间用{}隔开;
数字的运算、判断放在()中;
数组的运算放在{}中;
print放在{}中.
参考博客:https://www.cnblogs.com/xudong-bupt/p/3721210.html
参考博客:https://www.cnblogs.com/jiqianqian/p/7944013.html
朱双印的博客写的很详细,通俗易懂:http://www.zsythink.net/archives/2093
awk数组详解、实战的更多相关文章
- 3.awk数组详解及企业实战案例
awk数组详解及企业实战案例 3.打印数组: [root@nfs-server test]# awk 'BEGIN{array[1]="zhurui";array[2]=" ...
- (转)awk数组详解及企业实战案例
awk数组详解及企业实战案例 原文:http://www.cnblogs.com/hackerer/p/5365967.html#_label03.打印数组:1. [root@nfs-server t ...
- linux awk命令详解
linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...
- awk命令详解二
awk命令详解 简单使用: awk :对于文件中一行行的独处来执行操作 . awk -F :'{print $1,$4}' :使用‘:’来分割这一行,把这一行的第一第四个域打印出来 . 详细介绍: ...
- shell编程之awk命令详解
shell编程之awk命令详解 a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; out ...
- linux awk命令详解,使用system来内嵌系统命令, awk合并两列
linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...
- Shell学习(五)—— awk命令详解
一.awk简介 awk是一个非常好用的数据处理工具,相对于sed常常作用于一整个行的处理,awk则比较倾向于一行当中分成数个[字段]处理,因此,awk相当适合处理小型的数据数据处理.awk是一种报 ...
- JavaScript进阶(十)Array 数组详解
JS array 数组详解 数组的声明方法 arrayObj = new Array(); 的数组 ,并且第一位是5 数组的运算(传地址) var t2=new Array(); t2[0]=1; t ...
- Java基础之 数组详解
前言:Java内功心法之数组详解,看完这篇你向Java大神的路上又迈出了一步(有什么问题或者需要资料可以联系我的扣扣:734999078) 数组概念 同一种类型数据的集合.其实数组就是一个容器. 数组 ...
随机推荐
- PEP-8 规范1
代码布局 缩进 每个缩进级别使用4个空格. 延续线应使用Python的隐含线连接在括号,括号和大括号内,或使用悬挂缩进[7],垂直对齐包装元素.使用悬挂式凹痕时,应考虑以下因素;第一行应该没有参数,应 ...
- POJ 3241 曼哈顿距离最小生成树 Object Clustering
先上几个资料: 百度文库有详细的分析和证明 cxlove的博客 TopCoder Algorithm Tutorials #include <cstdio> #include <cs ...
- LOFTER 迁移
title: LOFTER 迁移 date: 2018-09-01 16:41:02 updated: tags: [其他] description: keywords: comments: imag ...
- 光学字符识别OCR-8 综合评估
数据验证 尽管在测试环境下模型工作良好,但是实践是检验真理的唯一标准.在本节中,我们通过自己的模型,与京东的测试数据进行比较验证. 衡量OCR系统的好坏有两部分内容:(1)是否成功地圈 ...
- day18-socket 编程
1.Socket是网络上的使用的交互信息得方法,也叫套接字 用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 通讯原理 Soc ...
- 一个JS判断客户端是否已安装某个字体(Only IE)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- CornerStone使用教程(配置SVN,HTTP及svn简单使用)
1.SVN配置 假设你公司svn地址为:svn://192.168.1.111/svn/ios,用户名:svnserver,密码:123456 1:填写主机地址 2:如果你的主机地址中有端口号,如为1 ...
- sql中group by 和having 用法解析
--sql中的group by 用法解析:-- Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”.--它的作用是通过一定的规则将一个数据集划分成若干个小的 ...
- BZOJ 4584 [Apio2016]赛艇 ——动态规划
Subtask 1 直接$N^2$ $DP$,就可以了 Subtask 2 用$f[i][j]$表示当前位置为$i$,结束元素为$j$的方案数. Subtask 3 看下面 Subtask 4 首先可 ...
- NOIP2017赛前模拟(3):总结
题目: 1.购买板凳(100) 大意:区间修改最后查询全局最大值; 2.新排序(40分暴力) 大意:给一串长度小于100000的数列···每次操作找出序列中严格小于其左边的数字或者严格大于其右边的数字 ...