zoukankan      html  css  js  c++  java
  • awk处理重复行错误分析

    [root@localhost ~]#cat 0712
    YRSD2-1-11
    YRSD2-2-18
    YRSD1-1-8
    YRSD1-1-18
    YRSD1-1-20
    YRSD1-1-25
    YRSD1-2-38
    YRSD1-2-39
    YRSD1-2-44
    YRSD1-2-48
    YRSD1-2-43
    YRSD1-3-58
    YRSD1-3-59
    YRSD1-4-67
    YRSD1-4-68
    YRSD1-4-70
    YRSD1-4-71
    YRSD1-3-52
    YRSD4-1-5
    YRSD3-1-7
    YRSD3-1-22
    YRSD3-1-28
    YRSD3-2-37
    YRSD3-2-50
    YRSD3-2-53
    YRSD3-2-55
    YRSD6-1-1
    YRSD6-1-5
    YRSD6-1-15
    YRSD6-2-28
    YRSD6-2-32
    YRSD6-2-36
    YRSD5-1-7
    YRSD5-1-22
    YRSD5-1-23
    YRSD5-1-24
    YRSD5-1-25
    YRSD5-1-26
    YRSD5-2-33
    YRSD5-2-37
    YRSD5-2-42
    YRSD5-2-51
    YRSD5-2-54
    YRSD5-2-53
    
    
    YRSD1-1-18
    YRSD1-2-38
    YRSD1-2-44
    YRSD1-2-48
    YRSD1-4-67
    YRSD1-4-68
    YRSD2-1-11
    YRSD2-2-18
    YRSD3-1-22
    YRSD3-1-28
    YRSD5-1-22
    YRSD5-1-25
    YRSD5-2-37
    YRSD5-2-42
    YRSD5-2-54
    YRSD6-1-1
    YRSD6-1-15
    

      

    想将重复的行打印出来,结果搞错了,闲来无聊想想为什么会有这样的结果,算是对awk的加深印象

    [root@localhost ~]#awk 'a[$0]++{for(i in a)print i,a[i]}' 0712 | wc -l
    810
    

      


    解析
    a[$0]++结果为真时,执行action,所以第一遍不重复的时候,将数组存储
    然后每次遇到重复的行,pattern结果为真,执行一次action,一共18个重复行,执行18次,每次结果为45行,共计45*18=810行

    顺序对结果也有影响,对计数有影响

    [root@localhost ~]#awk '++a[$0]{for(i in a)print i,a[i]}' 0712 | wc -l
    1845
    

      

    解析
    因为++a[$0]第一次就有结果了,所以第一次就将a[第一行]打印出来,
    第二行时,将第一行、第二行打印出来
    第三行时,将第一二三行打印出来
    以此类推
    不重复行为45行
    所以结果为45*(1+45)/2=1035
    从第46行开始重复,且每次打印时数组均为45项,即45*18=810
    1035+810=1845
    over

    [root@localhost ~]#awk 'a[$0]++;END{for(i in a)print i,a[i]}' 0712 | wc -l
    63
    

      


    awk只执行pattern对空间的内容没有影响,所以使用END模块也就没有效果
    百度百科awk
    其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号 ({}) 不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。


    所以正确的END模式如下:

    [root@localhost ~]#awk '{a[$0]++};END{for(i in a)print i,a[i]}' 0712 | wc -l
    45
    

      

  • 相关阅读:
    python BUGGGGGGGGGG
    Golang channel底层原理及 select 和range 操作channel用法
    Go reflect包用法和理解
    Golang 之sync包应用
    Golang 之 sync.Pool揭秘
    深入理解字节码文件
    java中的回调,监听器,观察者
    范式
    BIO,NIO,AIO总结(二)
    anaconda命令行运行过程中出现的错误
  • 原文地址:https://www.cnblogs.com/irockcode/p/7160922.html
Copyright © 2011-2022 走看看