Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3024147
  • 博文数量: 272
  • 博客积分: 5544
  • 博客等级: 大校
  • 技术积分: 5496
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 00:48
个人简介

  每个人都要有一个骨灰级的爱好,不为金钱,而纯粹是为了在这个领域享受追寻真理的快乐。

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2011-05-14 14:35:53

对于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. IP ADDRESS = 192.168.2.236 ;

  4. IP ADDRESS = 192.168.2.235 ;

  5. IP ADDRESS = 192.168.2.236 ;

  6. IP ADDRESS = 192.168.2.234 ;

  7. IP ADDRESS = 192.168.2.236 ;

  8. $ awk '!a[$0]++' file
  9. IP ADDRESS = 192.168.2.236 ;

  10. IP ADDRESS = 192.168.2.235 ;
  11. IP ADDRESS = 192.168.2.234 ;

[解析]

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

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

 

 

阅读(10689) | 评论(2) | 转发(1) |
给主人留下些什么吧!~~

pdw223366992015-03-31 00:59:44

我刚看明白,不过下面的例子容易误解。。。。不是第一行  第二行   举例子的话 我觉得还是写第一次出现和第二次出现比较好。。。我把a[$0]的下标都当成
同一个了。。。。。
对于awk '!a[$3]++',需要了解3个知识点
1、awk数组知识,不说了
2、awk的基本命令格式 awk 'pattern{action}'
    省略action时,默认action是{print},如awk '1'就是awk '1{print}'
3、var++的形式:先读取var变量值,再对var值+1

以数据
1 2 3
1 2 3
1 2 4
1 2 5
为例,对于awk '!a[$3]++'
awk处理第一行时: 先读取a[$3]值再自增,a[$3]即a[3]值为空(0),即为awk '!0',即为awk '1',即为awk '1{print}'
awk处理第二行

pdw223366992015-03-31 00:07:48

刚看awk ,
awk 是通过表达式按行执行的 
awk去重awk '!a[$0]++' file的执行也就是没执行一行之前都要执行下表达式'!a[$0]++;
假如file文件内容为
123
aaa
123
执行第一行是表达式为!a[$0]即!0 为1条件为真第一行打印
执行第二行是!和++结合性为自右向左 即为!(a[$0]+1)即!1为0条件为假,aaa不打印(实际file打印为123和aaa)
请问问题出在哪里?

--------------awk手册讲的是没执行玩表达式九路一行
awk的工作流程 : 

执行awk时, 它会反复进行下列四步骤. 

 

自动从指定的数据文件中读取一个数据行. 
自动更新(Update)相关的内建变量之值. 如 : NF, NR, $0... 
依次执行程序中 所有 的 Pattern { Actions