Chinaunix首页 | 论坛 | 博客
  • 博客访问: 616594
  • 博文数量: 104
  • 博客积分: 1968
  • 博客等级: 上尉
  • 技术积分: 1587
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-01 17:52
文章分类

全部博文(104)

文章存档

2013年(12)

2012年(50)

2011年(42)

分类: Python/Ruby

2012-09-16 10:55:24

  今天遇到要过滤重复域的问题,于是乎逛CU论坛,看到一个用awk数组过滤的方法,很精简,在这里贴出来和大家分享下。

  以这个 testawk 文本为例:
   点击(此处)折叠或打开
  1. 1 2 3
  2. 1 2 2
  3. 2 2 2
  4. 3 4 4
  5. 3 4 5
  6. 2 2 2
  7. 4 4 4
  8. 5 5 5
  9. 6 6 6
  10. 7 7 7
  11. 8 8 8
  12. 1 4 3
 先要讲解下 awk'!a[$1]++'  这种格式的每个部分的意义。

   
   1、awk数组知识
   2、awk的基本命令格式 awk 'pattern{action}'
      省略action时,默认action是{print},如awk '1'就是awk '1{print}'
   3、var++的形式:先读取var变量值,再对var值+1

       awk处理第一行时:先读取a[$1]值再自增,a[$1]即a[1]值为空(0),即为awk '!0',
    即为awk '1',即为 awk'1{print}'
          awk处理第二行时: 先读取a[$1]值再自增,a[$1]即a[1]值为1,即为awk '!1',
    即为awk '0',即为awk '0{print}'
  
   效果就是有重复$1的行只有第一次出现被打印,其他的都过滤了。

 实践下:
  

点击(此处)折叠或打开

  1. $ awk '!a[$1]++' testawk
  2. 1 2 3
  3. 2 2 2
  4. 3 4 4
  5. 4 4 4
  6. 5 5 5
  7. 6 6 6
  8. 7 7 7
  9. 8 8 8
  可以看出第一个域重复的2、5、6、13行都被过滤掉了。

 如果要顾虑的时候参考的不止一个域那就可以在方括号里写上要参考的域,例如 awk '!a[$1 $3]++' 
 测试下:
   

点击(此处)折叠或打开

  1. $ awk '!a[$1$ $3]++' testawk
  2. 1 2 3
  3. 1 2 2
  4. 2 2 2
  5. 3 4 4
  6. 4 4 4
  7. 5 5 5
  8. 6 6 6
  9. 7 7 7
  10. 8 8 8


  可以看到第6、13行被过滤掉了。



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