在文本处理的工作中,awk的数组是必不可少的工具,在这里,同样以总结经验和教训的方式和大家分享下我的一些学习心得,如有错误的地方,请大家指正和补充。
awk的数组,一种关联数组(Associative Arrays),下标可以是数字和字符串。因无需对数组名和元素提前声明,也无需指定元素个数 ,所以awk的数组使用非常灵活。
首先介绍下几个awk数组相关的知识点:
<1>建立数组 <2>读取数组值 <3>多维数组,array[index1,index2,……]:SUBSEP是数组下标分割符,默认为“\034”。可以事先设定SUBSEP,也可以直接在SUBSEP的位置输入你要用的分隔符,如: 但,有些特殊情况需要避免,如: <4>删除数组或数组元素: 使用delete 函数 <5> 排序:awk中的asort函数可以实现对数组的值进行排序,不过排序之后的数组下标改为从1到数组的长度。在gawk 3.1.2以后的版本还提供了一个asorti函数,这个函数不是依据关联数组的值,而是依据关联数组的下标排序,即asorti(array)以后,仍会用数字(1到数组长度)来作为下标,但是array的数组值变为排序后的原来的下标,除非你指定另一个参数如:asorti(a,b)。(非常感谢lionfun对asorti的指正和补充 )
下面说awk数组的实际应用。
1. 除去重复项, 这个不多说, 只给出代码: 另一种: http://bbs.chinaunix.net/thread-1859344-1-1.html
2. 计算总数(sum),如: 3. 查看文件差异。 <1> 合并file1和file2,除去重复项: <2> 提取文件1中有,但文件2中没有: 另: http://bbs.chinaunix.net/viewthr ... &page=1#pid15547885
4. 排序: 5. 有序输出:采用(index in array)的方式打印数组值的顺序是随机的,如果要按原序输出,则可以使用下面的方法: http://bbs2.chinaunix.net/viewthread.php?tid=1811279 6. 多个文本编辑:这里主要指的是待处理的文本之间的格式上有区别,如分隔符不同,;或是待处理文本需提取的信息的位置不同,如不同的列或行。
<例1>: 要求输出: 实现代码如下: 这里是利用awk的内置变量ARGIND来处理完成对文件的处理。关于ARGIND,ARGV,ARGC的使用,大家可以参考: http://bbs.chinaunix.net/viewthr ... 0335&from=favorites 。
当然,我们也可以利用另外一个内置变量FILENAME来完成相同的任务(大家可以先想想怎么写),如下: <例2>:对上面的数据的格式稍作改动,每个文件的分隔符都一样的情况,但输出要求不变: 实现代码如下: 因为这个例子的数据比较简单,我们也可以在BEGIN模块中完成对FS值设置,如下: 利用FILENAME 同样可以解决问题: 推荐一个关于数组处理文件的帖子 http://www.chinaunix.net/jh/24/577044.html ,里面有不少例子供大家学习。
7. 文本翻转或移位:二维或多维数组的应用
<例1>: <例2>:来自 http://bbs.chinaunix.net/viewthr ... &page=1#pid13339226
有两个文本a和b,要求输出c文本,合并的规则是按照第一行的headline(按字母顺序)合并文本a和b,空缺按“0”补齐。 下面我们来参看并解读下Tim大师的代码: 8. 选择性打印:
打印某个关键字前几行,以3行为例: 利用NR取余数,建立数组,这是一种非常高效的代码。
9. 通过split函数建立数组:数组的下标为从1开始的数字。 10. awk数组使用的小技巧和需要避免的用法:
<1> 嵌套数组: <2> 下标设为变量或函数: <3> 不可以将数组名作为变量使用,否则会报错: <4> 数组的长度: <5> match 函数也可以建立数组(你知道么? ,版本要求高于gawk 3.1.2) <6>想到过用split清空数组么?
awk的数组,一种关联数组(Associative Arrays),下标可以是数字和字符串。因无需对数组名和元素提前声明,也无需指定元素个数 ,所以awk的数组使用非常灵活。
首先介绍下几个awk数组相关的知识点:
<1>建立数组 <2>读取数组值 <3>多维数组,array[index1,index2,……]:SUBSEP是数组下标分割符,默认为“\034”。可以事先设定SUBSEP,也可以直接在SUBSEP的位置输入你要用的分隔符,如: 但,有些特殊情况需要避免,如: <4>删除数组或数组元素: 使用delete 函数 <5> 排序:awk中的asort函数可以实现对数组的值进行排序,不过排序之后的数组下标改为从1到数组的长度。在gawk 3.1.2以后的版本还提供了一个asorti函数,这个函数不是依据关联数组的值,而是依据关联数组的下标排序,即asorti(array)以后,仍会用数字(1到数组长度)来作为下标,但是array的数组值变为排序后的原来的下标,除非你指定另一个参数如:asorti(a,b)。(非常感谢lionfun对asorti的指正和补充 )
下面说awk数组的实际应用。
1. 除去重复项, 这个不多说, 只给出代码: 另一种: http://bbs.chinaunix.net/thread-1859344-1-1.html
2. 计算总数(sum),如: 3. 查看文件差异。 <1> 合并file1和file2,除去重复项: <2> 提取文件1中有,但文件2中没有: 另: http://bbs.chinaunix.net/viewthr ... &page=1#pid15547885
4. 排序: 5. 有序输出:采用(index in array)的方式打印数组值的顺序是随机的,如果要按原序输出,则可以使用下面的方法: http://bbs2.chinaunix.net/viewthread.php?tid=1811279 6. 多个文本编辑:这里主要指的是待处理的文本之间的格式上有区别,如分隔符不同,;或是待处理文本需提取的信息的位置不同,如不同的列或行。
<例1>: 要求输出: 实现代码如下: 这里是利用awk的内置变量ARGIND来处理完成对文件的处理。关于ARGIND,ARGV,ARGC的使用,大家可以参考: http://bbs.chinaunix.net/viewthr ... 0335&from=favorites 。
当然,我们也可以利用另外一个内置变量FILENAME来完成相同的任务(大家可以先想想怎么写),如下: <例2>:对上面的数据的格式稍作改动,每个文件的分隔符都一样的情况,但输出要求不变: 实现代码如下: 因为这个例子的数据比较简单,我们也可以在BEGIN模块中完成对FS值设置,如下: 利用FILENAME 同样可以解决问题: 推荐一个关于数组处理文件的帖子 http://www.chinaunix.net/jh/24/577044.html ,里面有不少例子供大家学习。
7. 文本翻转或移位:二维或多维数组的应用
<例1>: <例2>:来自 http://bbs.chinaunix.net/viewthr ... &page=1#pid13339226
有两个文本a和b,要求输出c文本,合并的规则是按照第一行的headline(按字母顺序)合并文本a和b,空缺按“0”补齐。 下面我们来参看并解读下Tim大师的代码: 8. 选择性打印:
打印某个关键字前几行,以3行为例: 利用NR取余数,建立数组,这是一种非常高效的代码。
9. 通过split函数建立数组:数组的下标为从1开始的数字。 10. awk数组使用的小技巧和需要避免的用法:
<1> 嵌套数组: <2> 下标设为变量或函数: <3> 不可以将数组名作为变量使用,否则会报错: <4> 数组的长度: <5> match 函数也可以建立数组(你知道么? ,版本要求高于gawk 3.1.2) <6>想到过用split清空数组么?