awk之利用数组去重

对于awk ‘!a[$3]++’,需要了解3个知识点:

1、awk数组知识,不说了。
2、awk的基本命令格式 awk ‘pattern{action}’
省略action时,默认action是{print},如awk ‘1’就是awk ‘1{print}’
pattern等于0,条件为假,不会执行后面省略的{action},非0则为真。
3、var++的形式:先读取var变量值,再对var值+1。

以数据为例:
1 2 3
1 2 3
1 2 4
1 2 5



1. awk ‘!a[$3]++’ file

awk处理第一行时: 先读取a[$3]值再自增一次,a[$3]即a[3]值为空(0),即为awk ‘!0’,即为awk ‘1’,即为awk ‘1{print}’
awk处理第二行时: 先读取a[$3]值再自增一次,a[$3]即a[3]值为1,即为awk ‘!1’,即为awk ‘0’,即为awk ‘0{print}’
………….
最后实现的效果就是对于$3是第一次出现的行进行打印,也就是去除$3重复的行。



 

 

 


1. awk ‘!($3 in a){a[$3];print}’ file

 

这句的作用也一样,如果$3的值不是在a数组的下标中,那么把$3存入数组下标中,并打印。执行到第2行时,$3的值是3,已经存在于数组a的下标中,则不会执行后面的{action}。同样达到去重目的。

 

 

再看下面一个例子:

 

May 6 23:45:04 387 282 105
May 6 23:45:14 391 283 108
May 6 23:45:25 392 285 105
May 6 23:45:35 385 284 101
May 6 23:45:45 391 296 95
May 6 23:45:55 390 292 97
May 6 23:50:07 370 277 92
May 6 23:50:17 369 276 93
May 6 23:50:28 375 282 93
May 6 23:50:38 373 282 91
May 6 23:50:48 370 283 87
May 6 23:50:58 370 285 85
May 6 23:55:00 344 266 78
May 6 23:55:10 348 268 80
May 6 23:55:21 349 271 78
May 6 23:55:31 342 264 77
May 6 23:55:41 348 272 76
May 6 23:55:51 351 274 77


 

提取每5分钟间隔秒数最小的行。

 

首先观察该文本,是按时间的增序排列,即取0分或5分时候的第一个记录,也是秒数最小的记录了。

 


1. awk -F: ‘$2%5==0 && !a[$1,$2]++’ file

 

以冒号为分割,$2即是分钟数,对5取模,只有0分和5分的时候余数等于0,满足条件,并且把$1 $2放入数组里,!a[$1,$2]++ 剔除该分数内重复的行。

 

结果:

May 6 23:45:04 387 282 105
May 6 23:50:07 370 277 92
May 6 23:55:00 344 266 78


 

我们再看个例子:


1. $ cat file

2. IP ADDRESS = 192.168.2.236 ;

3.

4. IP ADDRESS = 192.168.2.236 ;

5.

6. IP ADDRESS = 192.168.2.235 ;

7.

8. IP ADDRESS = 192.168.2.236 ;

9.

10. IP ADDRESS = 192.168.2.234 ;

11.

12. IP ADDRESS = 192.168.2.236 ;

13.

14. $ awk ‘!a[$0]++’ file

15. IP ADDRESS = 192.168.2.236 ;

16.

17. IP ADDRESS = 192.168.2.235 ;

18. IP ADDRESS = 192.168.2.234 ;


[解析]

文件本身里有空格,空格也算是一行内容,怎么排除这个空行?


1. awk ‘NF&&!a[$0]++’ file
 

本文转载自:http://blog.chinaunix.net/uid-10540984-id-313341.html