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

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

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2011-05-14 14:31:56

 

  1. http://www.sina.com.cn

  2. http://www.sina.com.cn

  3. ################

  4. http://www.163.com.cn

  5. http://www.163.com.cn

  6. ################

  7. http://www.163.com

  8. http://www.163.com

  9. ################

 

结果:

  1. http://www.sina.com.cn
  2. ################
  3. http://www.163.com.cn
  4. ################
  5. http://www.163.com
  6. ################

 


 

  1. awk '$0!=v&&NF;NF{v=$0}' file

  2. wk 'NF&&$0!=i{print;i=$0}' file

[解析]

  首先注意NF,它作为pattern是可以判断改行是否为空行的条件,这是个很经典的运用。

  $0不等于v,并且NF为真(即非零),第一行是满足条件的,这时候v是个空值,肯定是不等于$0的,并且第一行是有内容,NF为1,即为真,这里没有{action},在awk里没有{action}是默认打印该行,即写成 $0!=v&&NF{print $0} 也是一个含义。然后分号分割2个不同的命令,执行后面NF为真时把$0赋值给v,这时候NF是1,所以v的值就是第一行的文本内容。

  继续匹配第2行,NF为空,不满足条件,执行后面命令,NF也是为空,不满足条件,无任何动作,这时候v的值还是第一行内容,执行到第3行,$0的内容和v的值是一样的,不执行打印,NF为真,把第3行的内容赋值给v(和第一行内容一模一样)。一直执行到#号行,NF为真,并且v的值和$0不相等,打印该行,并且把该行的值赋给v,依次类推...得到了查重的效果。

  当然,做技术也要灵活运用举一反三,如果该文本没有空行,或者我们用 sed -i '/^$/d' file 来预先删除空行,然后执行 awk '$0!=v{print;v=$0}' file ,其实可以大大提高awk的处理效率,这时候不需要NF来作为pattern条件来判断空行了,只打印不重复的行,也无须一直对v进行赋值。在几千上万行的文本里执行效率会提高。

 

阅读(1751) | 评论(0) | 转发(1) |
0

上一篇:chroot用法详解

下一篇:awk之利用数组去重

给主人留下些什么吧!~~