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`中的一个重要概念,它允许我们存储和操作一组相关数据。本篇文章将详细讲解如何使用`awk`数组来处理两个文件,以及在不同场景下的应用。 在给定的例子中,有两个文件`a`和`b`,目标是找出`a`文件中与`b`...
那么awk数组有那些特点,一般常见运算又会怎么样呢。我们先看下下面的一些介绍,结合例子我们会讲解下它的不同之处。在 awk 中数组叫做关联数组(associative arrays),因为下标记可以是数也可以是串。awk 中的数组...
以下将详细介绍Linux中awk数组的基本使用方法。 1. **数组描述** 在awk中,数组的下标从1开始,不同于许多其他编程语言从0开始。这意味着访问数组的第一个元素时,你应该使用`arr[1]`。awk中的数组不需要预先声明...
自己总结的awk数组相关的思维导图文件,可以下载xmind进行打开,第一次上传文件,多多赐教
前段时间和几位同事讨论过一个问题:Shell脚本里面怎样把一个数组传递到awk内部进行处理? 当时没有找到方法。前两天在QQ群里讨论awk的时候,无意间又聊起这个话题。机缘巧合之下找到一个思路,特此分享。 测试环境...
本主题聚焦于`awk`的数组应用,将深入探讨如何利用`awk`处理数组,以实现对复杂数据集的分析和操作。 数组在`awk`中扮演着核心角色,它允许我们存储和处理一组相关的数据。与许多编程语言不同,`awk`中的数组并不...
AWK中的数组非常实用,可以存储和处理数据集合。此外,用户还可以定义自己的函数,实现程序的模块化。 ### AWK与输入输出 AWK处理输入的方式是基于记录和字段的概念。输入分隔符可以自定义,多行记录的处理可以通过...
awk支持数组和关联数组,允许存储和操作复杂的数据结构。 - **数组**:可以使用下标访问数组元素,下标可以是数字或字符串。 - **关联数组**:使用`in`运算符来判断一个键是否存在于数组中。 #### 七、gawk扩展...
在UNIX环境下,awk作为一种强大的文本处理工具,其优势在于它是一种解释型语言,无需预先编译,变量无类型限制,支持关联数组,以及内置的数据行(Record)和字段(Field)处理能力。awk还具备管道功能,能够与其他...
此外,书中还涵盖了数组的使用,包括关联数组和数值数组,它们允许开发者存储和处理多组相关数据。 模式匹配是awk的一大特色,书中详细解释了正则表达式的使用,包括基本的字符类、量词、括号表达式等,以及如何在...
`set`在`awk`中是一个关键的概念,它涉及到变量、数组以及模式匹配等方面。本手册将深入探讨`awk set`的使用方法,帮助你更好地理解和运用这一工具。 一、`awk`基础 `awk`的名字来源于它的创始人——Alfred V. Aho...
- **引用数组元素、使用循环遍历awk数组、删除数组元素、多维数组、SUBSEP下标分隔符、用asort为数组排序、用asorti为索引排序**:Awk的关联数组是处理文本数据的强大工具,它允许使用任意字符串作为数组的索引。...
AWK支持关联数组,即键值对形式的数组。数组可以动态增长,键可以是任何字符串,而不仅仅是数字。例如: ```awk array[key] = value ``` ### 6. **内置变量** - **NF**: 当前记录的字段数量。 - **NR**: 已处理的...
### Awk 使用手册详解 #### 一、Awk 简介 Awk 是一种功能强大的文本处理工具,广泛应用于 Unix 和类 Unix 系统中。它的名字来源于三位设计者的名字首字母:Aho (Peter)、Weinberger (Brian) 和 Kernighan (Doug)。...
awk关联数组部分,则解释了如何注册数组元素、引用数组元素、使用循环遍历数组、删除数组元素、多维数组以及数组排序等高级用法。 最后,手册还介绍了其他awk命令,如使用printf格式化输出,以及awk内置数值函数和...