`
nigelzeng
  • 浏览: 599587 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

浅析awk里的数组

阅读更多

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 ----

分享到:
评论

相关推荐

    Linux Awk数组操作详细介绍

    那么awk数组有那些特点,一般常见运算又会怎么样呢。我们先看下下面的一些介绍,结合例子我们会讲解下它的不同之处。在 awk 中数组叫做关联数组(associative arrays),因为下标记可以是数也可以是串。awk 中的数组...

    用awk数组处理两个文件

    主要讲解了关于shell中用awk数组处理文件的用法

    awk数组.xmind

    自己总结的awk数组相关的思维导图文件,可以下载xmind进行打开,第一次上传文件,多多赐教

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

    1.awk数组描述 在其他的编程语言中,数组的下标都是从0开始的,也就是说,如果想反向引用数组中 的第一个元素,则需要引用对应的下标[0],在awk中数组也是通过引用下标的方法,但是在awk中数组的下标是从1开始的,在...

    linux Shell脚本里面把一个数组传递到awk内部进行处理

    前段时间和几位同事讨论过一个问题:Shell脚本里面怎样把一个数组传递到awk内部进行处理? 当时没有找到方法。前两天在QQ群里讨论awk的时候,无意间又聊起这个话题。机缘巧合之下找到一个思路,特此分享。 测试环境...

    awk数组实战

    AWK是一种优良的文本处理工具。它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一

    awk入门到精通.pdf

    变量无类型之分 (Typeless), 可使用文字当数组的下标(Associative Array)...等特色. 因此, 使用awk撰写程序比起 使用其它语言更简洁便利且节省时间. awk还具有一些内建功能, 使得awk擅于处理具数据行 (Record), ...

    awk学习awk学习awk学习awk学习

    awk学习awk学习awk学习awk学习awk学习awk学习awk学习

    AWK用法AWK用法AWK用法

    awk ‘/101/’ file 显示文件file中包含101的匹配行。 awk ‘/101/,/105/’ file awk ‘$1 == 5′ file awk ‘$1 == “CT”‘ file 注意必须带双引号 awk ‘$1 * $2 >100 ‘ file awk ‘$2 >5 && $2<=15' file

    学习和理解AWK的最佳书籍Effective AWK Programming

    学习和理解AWK的最佳书籍  一致这本书是学习awk的最好书籍,网上下不到的,国内也买不到。国家图书馆和北京大学图书馆都有。强烈建议所有想学awk的同志们阅读(会有很多awk语言之外的启迪) 偶然机会得到,不敢独享...

    awk用法详解

    型之分( Typeless), 可使用文字当数组的下标(Associative Array)...等特色. 因此, 使用awk 撰写程序比起使用其它语言更简洁便利且节省时间. awk 还具有一些 内建功能, 使得awk 擅于处理具数据行(Record), 字段...

    AWK AWK 详细使用文档

    AWK 详细使用文档 AWK 详细使用文档 AWK 详细使用文档

    awk参考资料下载awk

    awk参考资料, awk参考资料详情.

    awk用法小结--有关awk的材料

    awk用法小结 - - - by ruson 2006.4 NTU 1. awk非常适合于结构化的文本文件(行、列数据)复杂处理。相对于sed而言,它可进行复杂的编程处理,并且可以产生复杂的报表输出。 2. awk通常有三个版本,旧awk、nawk...

    awk使用手册

    你可能对UNIX比较熟悉,但你可能对awk很陌生,这一点也不奇怪,的确,与其优秀的功能相比,awk还远没达到它应有的知名度。awk是什么?与其它大多数UNIX命令不同的是,从名字上看,我们不可能知道awk的功能:它既不是...

    awk详细用法小结awk awk

    因为遇到了awk问题,所以找到这个小结,共享一下

    sed_awk.chm

    This book is about a set of oddly named UNIX utilities, sed and awk. These utilities have many things in common, including the use of regular expressions for pattern matching. Since pattern matching ...

    awk入门级教材awk入门awk入门

    awk 是一门编程语言,它的基本操作是在一组文件上查找模式,并在包含这些模式实例的那 些行或字段上进行指定的动作。awk 使得特定数据的选择和变换操作更易于表达

Global site tag (gtag.js) - Google Analytics