zoukankan      html  css  js  c++  java
  • [2012-05-31]awk去重复项


    参考http://bbs.chinaunix.net/thread-2309494-1-1.html

    10.awk ‘! a[$0]++’ 怎么理解?
    这是一个非常经典的去重复项的awk语句,虽然短小,不过涉及到了不少知识点,下面一一解读:
    <1>:”!” 即非。
    <2>:a[$0],以$0为数据下标,建立数组a
    <3>:a[$0]++,即给数组a赋值,a[$0]+=1
    <4>:那么组合起来,awk是怎么执行!a[$0]++的呢?

    '!a[$0]++'

    1. 当$0的内容首次出现时,a[$0]将为空(相当于0)。
    2. 此时将先求!a[$0]的值(也是整个式子的值,即为非空 true ,将影响后续动作,执行默认的print)。
    3. 然后对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]++值

    personball@vostro:~$awk '{print a[$0]}' test #未对a[$0]进行处理,a[$0]恒为空
    personball@vostro:~$awk '{print !a[$0]}' test #取反
    1
    1
    1
    1
    1
    1
    1
    personball@vostro:~$awk '{print !a[$0]++}' test  #自加操作,更改a[$0]的值
    1                                      # 111 首次出现
    1                                      # 222 首次出现
    0                                      # 111 2次出现
    0                                      # 222 2次出现
    1                                      # 333 首次出现
    0                                      # 111 3次出现
    1                                      # 444 首次出现
    personball@vostro:~$cat test
    111
    222
    111
    222
    333
    111
    444
  • 相关阅读:
    java反射机制
    jdbc连接mysql时发出警告:WARN: Establishing SSL connection without server's identity verification is not recommended...
    java,jdbc操作数据库
    vue.js 第十课-第十六课
    vue.js 第九课
    vue.js 第八课
    如何扒代码。。。
    vue.js第七课
    工作总结
    滤镜 filter:gray 变灰色
  • 原文地址:https://www.cnblogs.com/personball/p/7455755.html
Copyright © 2011-2022 走看看