当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

浅析awk里的数组

发表于: 2012-12-31   作者:nigelzeng   来源:转载   浏览:
摘要: awk绝对是文本处理中的神器,它本身也是一门编程语言,还有许多功能本人没有使用到。这篇文章就单单针对awk里的数组来进行讨论,如何利用数组来帮助完成文本分析。   有这么一组数据:   abcd,91#31#2012-12-31 11:24:00 case_a,136#19#2012-12-31 11:24:00 case_a,136#23#2012-12-31 1

awk绝对是文本处理中的神器,它本身也是一门编程语言,还有许多功能本人没有使用到。这篇文章就单单针对awk里的数组来进行讨论,如何利用数组来帮助完成文本分析。

 

有这么一组数据:

 

abcd,91#31#2012-12-31 11:24:00
case_a,136#19#2012-12-31 11:24:00
case_a,136#23#2012-12-31 11:24:00
test_b,1000#22#2012-12-31 11:24:00
case_a,136#23#2012-12-31 11:24:00
group,83#38#2012-12-31 11:25:00
case_a,289#4#2012-12-31 11:25:00
case_a,289#15#2012-12-31 11:25:00
case_a,289#4#2012-12-31 11:25:00

 

 

以这行数据为例 “abcd,91#31#2012-12-31 11:24:00”,稍微解释下每列的意思:

第一列,abcd: 访问的URI

第二列,91: URI参数的值

第三列,31: 访问次数

第四列,显而易见,时间戳。

 

现在想要完成任务是根据时间戳来对URI进行访问次数的统计,最后的结果需要具有这样的格式:

 

时间戳 URI和参数 访问次数
2012-12-31 11:24:00 case_a,289 23

 

 

一维数组:

awk的一维数组是使用频率最高的数据结构,利用一维数组我们可以用某一列作为下标,把对应的值存入数组中。一维数组的用法简单明了:

 

awk '{arr[$2]+=$3} END{ for(i in arr) print i,arr[i] }'

 

 用第二列做下标,对第三列求和。但是这样就不满足前面对结果的要求了,URI和参数无法体现出来。

也许你跟我想的一样,awk是否也有高级语言里的二维数组(多维数组)。

 

二维数组:

        查阅了相关资料,awk里没有原生的二维数组支持,但是我们可以利用一维数组来构造二维数组,一维数组的表示arr[a],那么根据awk的性质,我们可以用arr[a#b]来表示二维数组(注意,awk不支持arr[a][b]之类的写法)。

        也许你会有疑问,如何取出所有二维数组的值,在arr[a#b]这种情况下,利用一维数组的遍历方法,得出来值如下格式:

i="a#b", arr[i]="value" 

然后再利用awk的split内建函数来对i进行分割,得到一个新的一维数组,再进行一次遍历就可以达成前文的设想。直接上代码:

 

awk -F'#' '{sp="#";arr[$3sp$1]+=$2} END{ for(i in arr) { split(i,arr2,sp);print arr2[1],arr2[2],arr[i]} }' test.log |sort

 

稍作解释:

-F —— 设置awk的默认分隔符为"#"

sp=“#”——为下标分割符,split函数里也会用到。

 split(i,arr2,sp) —— 以sp作为分隔符,对i进行分割,结果保存到arr2里。(详细信息请man awk)

 

得到的结果如下:

 

012-12-31 11:24:00 abcd,91 31
2012-12-31 11:24:00 case_a,136 65
2012-12-31 11:24:00 test_b,1000 22
2012-12-31 11:25:00 case_a,289 23
2012-12-31 11:25:00 group,83 38

 结果完全符合预期。

 

多维数组:

        以此类推,在需要用到三维数组、四维数组或以上的情况下,我们完全可以按照构造二维数组的方式来构造其他的多维数组,只需要多次利用split函数即可。

        但是具体对性能的影响就需要逐一去测试了。顺便推荐一个time命令。

 

---- EOF 2012/12/31-----

---- nigelzeng ----

浅析awk里的数组

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
本文适用于HTML、ASP 中的 JavaScript 脚本代码。代码以 HTML 中的 JS 为例,如果在 ASP 中,请将 d
2 awk
1 #!/usr/bin/awk -f 2 # 在系统提示下输入脚本 3 # 本文为awk笔记 4 # 5 # **********************
文件,包含的内容如下: 去除重复列结果如下: 方法:awk '{for(i=1;i<=NF;i++)a[$i,NR]++}{for(
浅析连续子向量,子数组和(一维,二维)问题 By 钟桓 9月 16 2014 更新日期:9月 16 2014 文章目录 1.
1.前言   本来以为在改成ARC以后,不再需要考虑内存问题了,可是在实践中还是发现有一些内存问题
C语言结构体里的成员数组和指针(关于零数组) 【转自酷壳网:http://coolshell.cn/articles/11377.ht
目的是抛砖引玉,有谁可以教教我如何吧Excle的数据导入MyEclipse么? 如果只有⑨个字符的话我肯定是
写在前面 一般语言学习,我们都会先学习其变量,程序控制,数组,基本运算(逻辑运算,关系运算,数
awk的基本语法与C语言类似。 awk为程序员提供了完善的编程模型。 awk程序由一个主输入循环维持,主
数组 1 声明时不能指定长度;例如int a[5]//非法 2 多维数组声明和初始化应按高维到低维; int[][]
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号