Chinaunix首页 | 论坛 | 博客
  • 博客访问: 532807
  • 博文数量: 39
  • 博客积分: 1046
  • 博客等级: 准尉
  • 技术积分: 895
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-10 16:50
文章分类

全部博文(39)

文章存档

2013年(8)

2012年(31)

分类: LINUX

2012-05-31 16:07:58

参考

10. awk ‘! a[$0]++’ 怎么理解?

这是一个非常经典的去重复项的awk语句,虽然短小,不过涉及到了不少知识点,下面一一解读:

<1> :”!” 即非。

<2>:a[$0],以$0为数据下标,建立数组a

<3>:a[$0]++,即给数组a赋值,a[$0]+=1

<4> :那么组合起来,awk是怎么执行!a[$0]++的呢?




即: '!a[$0]++' 当$0的内容首次出现时,a[$0]将为空(相当于0),
此时将先求!a[$0]的值(也是整个式子的值,即为非空 true ,将影响后续动作,执行默认的print)
然后对a[$0]进行+1,a[$0] 加1后为1,当下次出现时a[$0]即不为空,表达式结果为非真 false,即不打印

【追加】:关于运算顺序,出现在上面帖子的9L
“   这是前加/后加的区别
     后加: 先使用变量的值,再自加。
     !a[$0]++ 对这个表达式的求值,它的值与 !a[$0] 相同(先使用变量a[$0]的值),但对表达式求值后 a[$0]会自加。  ”


同理,可针对某一列的数据重复情况进行处理,a[$1]等。

打印a[$0],!a[$0],!a[$0]++值

点击(此处)折叠或打开

  1. personball@vostro:~$awk '{print a[$0]}' test #未对a[$0]进行处理,a[$0]恒为空
  2. personball@vostro:~$awk '{print !a[$0]}' test #取反
  3. 1
  4. 1
  5. 1
  6. 1
  7. 1
  8. 1
  9. 1
  10. personball@vostro:~$awk '{print !a[$0]++}' test  #自加操作,更改a[$0]的值
  11. 1                                      # 111 首次出现
  12. 1                                      # 222 首次出现
  13. 0                                      # 111 2次出现
  14. 0                                      # 222 2次出现
  15. 1                                      # 333 首次出现
  16. 0                                      # 111 3次出现
  17. 1                                      # 444 首次出现
  18. personball@vostro:~$cat test
  19. 111
  20. 222
  21. 111
  22. 222
  23. 333
  24. 111
  25. 444




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