Linux-awk数组

Linux-awk数组linuxawk数组

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

闲话: Linux 从来没有系统的学过,AWK 这个高端的东西更没有系统全面的学过,知道真正项目中遇到的时候才会想着系统的学习一下,今天先写一下AWK的数组使用,网上有很多这样的文章,但是很多地方都没有讲的很细,所以看了半天还是一知半解,今天来细细的分析一下(本人忘心大,所以每次都的写的很细,以便以后能看懂,大牛或者觉得繁琐的请略过。偷笑


先简单说明一下awk吧

1. 官方解释AWK 

awk :适用程序,一种unix工具
就是一个强大的文本分析工具,相对于grep查找、sed的编辑,awk在对数据分析并生成报告的时候,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种处理。

用法:

1) awk [ -F separator] ‘{pattern action}’  fileName

或者2)awk [ -F separator] ‘ pattern {action}’  fileName


2. 个人理解

像一个for循环,逐行读入文件内容(或者管道传输过来的值) ,然后使用分隔符将每行切片(用户可以指定自己想使用的分隔符)


3. AWK数组

因为awk中数组的下标可以是数字和字母,数组的下标通常被称为关键字(key)。和Java等数组不一样,Java等数组下表只能是数字。其实这里的数组相当于Java等语言中的Map。 AWK 的下标是关键字。值和关键字都存储在内部的一张针对key/value应用hash的表格里。由于hash不是顺序存储,因此在显示数组内容时会发现,它们并不是按照你预料的顺序显示出来的。数组和变量一样,都是在使用时自动创建的,awk也同样会自动判断其存储的是数字还是字符串。一般而言,awk中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等。 说了一大堆,如果你没看太懂,你只要记住把awk数组看成是Map就可以

eg:  a[1] =  5 a[2] = 6 其实相当于 map.key = 1 map.value = 5 map.key=2 map.value=6 这也就说是为什么下表可以是数字或者字母。


4. 举例


1)[root@admin home]# cat awk.txt
aaa

bbb

ccc

aaa

bbb

aaa


统计一下awk.txt文件中每个字符串名出现的次数:cat awk.txt | awk ‘{a[$1]++} END { for (i in a) {print i,a[i]}}’

a[$1]++ : 就是awk  数组的形式,  a 是数组名称, [$1]做为key . 现在我们需要计算每个字符串出现的次数,所以需要把扫描到的相同的字符串名分别存储起来 ,就是键值对的数组,这里的键—对应的就是字符串,如aaa,值 — 对应的就是aaa出现的次数。数组a中的下标$1代表的是第一个域中列名,如aaa。awk开始逐行扫描,相当于for循环,每扫到一个相同的字符串,对应的hash数组里的值就+1,如a[aaa]++,直到扫到文件的结尾。(注:数组的默认值为空,如果要做++操作了,就会把里的值变成0)

awk数组不需要定义,可以直接赋值。 


2) 有文件file.log内容如下:

http://www.sohu.com/aaa

http://www.sina.com/111

http://www.sohu.com/bbb

http://www.sina.com/222

http://www.sohu.com/ccc

http://www.163.com/zzz

http://www.sohu.com/ddd


要统每个域名出现次数:

http://www.sohu.com 4

http://www.sina.com 2

http://www.163.com 1


答案是:  awk -F / ‘{a[$3]++} END{for(i in a){print i,a[i] | “sort -r -k 2”}}’ file.log;



-F参数是制定awk分隔符,这里制定的是 /,所以每行被分成4个部分。


sort 的-r是降序,-k是按照第几组字符排序,从1开始。


a可以理解成key-value形式的对象,域名做key 个数做value。

在end动作里完成对结果a的打印


3) awk统计ip访问次数(进阶)
现在有一个文件,数据量大概在200多万条记录,想用shell的awk做统计,文件的格式如下
#关键字#URL#IP地址#
key1|url1|192.80.80.1

key1|url1|192.80.80.1

key1|url2|192.80.80.2
key1|url1|192.80.80.2
key2|url1|192.80.80.1
key2|url2|192.80.80.2
key2|url1|192.80.80.2
现在想要统计的结果是:查看同一个关键字和URL总的访问的次数,以及多少个不同的IP,输出到一个文件中

awk -F”|” ‘{a[$1″ “$2]++;b[$1” “$2” “$3]++}(b[$1” “$2” “$3]==1){++c[$1” “$2]}END{ for (i in a) print i,c[i],a[i]}’ file

看起来很复杂,其实分开理解还算简单

有三个值  a[$1″ “$2] 很好理解key url为关键字的访问次数。 就是理解为就是key url为关键字的 然后 a[$1” “$2]++ 可以理解为如果以$1″ “$2为关键字的。如果存在了就增加1,如果还不存在,就设值为1

那算多少个不同的IP怎么算呢? 单纯的想,做法应该是如果  #关键字#URL#IP地址#  是第一次出现, key url为关键字的访问IP肯定要+1 ,但是如果不是第一次出现,那此IP之前已经计算过了。就不用计算了。翻译为代码就是     (b[$1″ “$2” “$3]==1){++c[$1” “$2]}      


再看一下:处理方法就是: 

依次加载一行(for 循环/awk)  如果以$1″ “$2为关键字的。如果存在了就增加1,如果还不存在,就设值为1    a[$1” “$2]++

如果  #关键字#URL#IP地址#  是第一次出现, key url为关键字的访问IP肯定要+1 ,但是如果不是第一次出现,什么都不需要做  {b[$1″ “$2” “$3]++}(b[$1” “$2” “$3]==1){++c[$1” “$2]}

现在再看是不是就好理解了,最后结果为:

key2 url2 1 1
key1 url1 2 3
key2 url1 2 2
key1 url2 1 1

                                                                                                                                                                                                                                       


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

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

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


相关推荐

  • HTML/CSS面试题(收集)[通俗易懂]

    HTML/CSS面试题(收集)[通俗易懂]1、目前主流的浏览器以及其内核名有哪些?点这里查看2、内元素和块级元素的区别?行内元素:不会独立出现在一行,单独使用的时候后面不会有换行符的元素。eg:span,strong,img,a等。这些元素,默认的高宽,总是其内容的高宽。并且,margin和padding值,只有左右有效。块级元素:独立在一行的元素,他们后面会自动带有换行符。eg:di

    2022年5月20日
    31
  • 有趣的python代码_python五角星代码

    有趣的python代码_python五角星代码原标题:使用Python代码的程序员也浪漫代码也浪漫:用Python放一场圣诞节烟花秀!天天敲代码的朋友,有没有想过代码也可以变得很酷炫又浪漫?今天就教大家用Python模拟出绽放的烟花庆祝昨晚法国队夺冠,工作之余也可以随时让程序为自己放一场烟花秀。这个有趣的小项目并不复杂,只需一点可视化技巧,100余行Python代码和程序库Tkinter,最后我们就能达到下面这个效果:学完本教程后,你也能做…

    2022年9月24日
    0
  • java反射的原理,作用

    什么是反射,反射原理Java反射的原理:java类的执行需要经历以下过程,编译:.java文件编译后生成.class字节码文件加载:类加载器负责根据一个类的全限定名来读取此类的二进制字节流到JVM内部,并存储在运行时内存区的方法区,然后将其转换为一个与目标类型对应的java.lang.Class对象实例连接:细分三步验证:格式(class文件规范)语义(final类是否有子类)…

    2022年4月11日
    40
  • yum安装telnet命令_centos 安装telnet

    yum安装telnet命令_centos 安装telnet简介Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登…

    2022年9月23日
    0
  • java时间类的使用和区别

    java时间类的使用和区别java中经常使用的6大时间类:java.util.Date              日期格式:年月日时分秒java.sql.Date               日期格式:年月日java.sql.Time               日期格式:时分秒java.sql.Timestamp          日期格式:年月日时分秒纳秒    从数据库中取出来的日期一般都用getTimestamp(…

    2022年6月13日
    26
  • 光盘制作软件UltraISO软碟通-原版下载+正版注册码

    光盘制作软件UltraISO软碟通-原版下载+正版注册码下载地址为官方下载,个人再提供个正版注册码!一、简要软件类型:光碟工具出品商:EZBSystems语言:中文简体运行平台:WindowsVista,WindowsServer2003,WindowsXP,Windows2000等二、功能UltraISO是一款功能强大而又方便实用的光盘映像文件制作/编辑/格式转换工具。它可以直接编辑光盘映像和从映像中直接提取…

    2022年7月26日
    1

发表回复

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

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