Chinaunix首页 | 论坛 | 博客
  • 博客访问: 183491
  • 博文数量: 55
  • 博客积分: 1471
  • 博客等级: 上尉
  • 技术积分: 420
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-08 14:00
文章分类

全部博文(55)

文章存档

2012年(5)

2011年(50)

分类: LINUX

2011-08-11 16:20:04

解释下

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

一看之下,首先是想到又用到awk的hash,又是缺省的pattern,一下子来了兴趣,做了以下的分析

这个要从awk的执行模式开始说,最后结合++运算符,和hash特色
有三个基本知识点是要了解的
1:a++的作用是先附值,再累加a,与++a正好相反。

2:hash的初始是undef,通过直接附值或声明进行定义,如a[1]=1,或直接声明a[1]。

3:awk的基本模式是,pattern   { action statements },action部分是可以省略的,缺省情况下是输出,即{print $0},至于pattern可以理解成是表达式,通过pattern表达式的值的真假,来确定是否要进行action。比如1,最简单的awk用来实现cat的功能就是 awk '1',这边1就是pattern,当然,1也可以是2,3,4,5等其他数字,但如果用字母的话,就不行,因为字母会解释成变量,变量初始值未定义,初始值为假,或者可以加个!反义

 

  1. 结合上边三点来分析awk '!a[$0]++' file
  2. "!a[$0]++"

0:整个模式,没有用到action,所以采用的是默认的{print $0},即在patten为真条件来,输出行
patten分析:
1:使用了一个hash数组,a,数组的键值采用$0,即每行值
2:当a[$0]未声明时,a[$0]为假,在未声明的情况下,进行一次a[$0]++后,a[$0]即为真
3:!取反
结论:当相同的行第一次读入时,pattern为真,行输出,再次读入后,patten为假,行乎略

基本理论知道了,要用得出来还得多锻炼应用

下面这个awk,也是这种情况

  1. awk '{if($2 in a);else{a[$2]=$0}}END{for(b in a)print a[b]}' urrfile

后来别人给出更简单的答案

  1. awk ' !($2 in i){ i[$2]; print } ' urrfile

现在看来,还可以更简单些

  1. awk '!a[$2]++' urrfile

原文地址:http://hi.baidu.com/sosodream/blog/item/a170c4097ad3038ed1581b26.html

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