• 使用awk统计字段重复实践


    awk

    awk是一种规格化文件的分析工具, 主要处理对象类似数据库导出的条目文本文件, 其中一行,就对应一个记录,每个记录包含若干个字段。

    类似这种文本:

    [root@www ~]# last -n 5 <==仅取出前五行
    root     pts/1   192.168.1.100  Tue Feb 10 11:21   still logged in
    root     pts/1   192.168.1.100  Tue Feb 10 00:46 - 02:28  (01:41)
    root     pts/1   192.168.1.100  Mon Feb  9 11:41 - 18:30  (06:48)
    dmtsai   pts/1   192.168.1.100  Mon Feb  9 11:41 - 11:41  (00:00)
    root     tty1                   Fri Sep  5 14:09 - 14:10  (00:01)

    本文利用awk工具实现 字段重复的统计功能, 例如某个字段不是主键,但是需要检测其值的重复性。

    具体参考资料:

    http://www.cnblogs.com/51linux/archive/2012/05/23/2515308.html

    http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html

    http://www.gnu.org/software/gawk/manual/gawk.html

    问题提出

    对于一个lua表文件, 为了避免lua表中,新添加的 key = value, 如果key已经在表中存在, 则新添加的条目在其后,则会将前面已经写过的key覆盖掉, 导致key的value值被改变。

    例如如下表:

    -- 这是个lua table。
    luatable = {
    --********************START覆盖标签区*****
    --********************END 覆盖标签区*******
    LANG = [[xxx]],
    LANG = [[xxx]]
    public_001 = [[ooo]],
    public_002 = [[,,,,,]],
    public_003 = [[sss]],
    public_004 = [[eeee]],

    };

    方案给出

    上面表文件,中包含 每个条目, key = value, 是我们需要处理的目标

    但是其中也有表定义行 和 注释行 , 需要在处理过程中舍弃掉。

    写一个awk文件, testdup.awk, 使用awk调用文件方式执行此文件。

    BEGIN{
            print "statistic duplicate ID starts";
            count = 0;
            FS = "=";
    }
    
    /(.+)=[[:blank:]]*[[.*]]/ {
            count ++;
            print $0;
            printf("key=%s", $1);
            if ( keyTimes[$1] )
            {
                    keyTimes[$1] = keyTimes[$1] + 1;
            }
            else
            {
                    keyTimes[$1] = 1;
            }
    }
    
    END{
            print "statistic duplicate ID ends";
            printf("count = %d
    ", count);
            printf("total row NR = %d", NR);
    
        for ( key in keyTimes )
        {
            if (keyTimes[key] > 1 )
            {
                printf("key(%s) duplicated times=%d", key, keyTimes[key]);
            }
        }
    }

    命令行执行:

    awk -f testdup.awk lang.conf

    执行效果:

    .......

    statistic duplicate ID ends
    count = 1986
    total row NR = 2289key(LANG ) duplicated times=2

  • 相关阅读:
    winform文本打印
    自动升级程序
    构造使用IN子句的动态TransactSQL方法进行编号查询
    加解密
    Caffe源码Layer类
    Caffe源码SyncedMemory类
    Caffe源码Blob类
    CSS 溢出文本显示省略号的方法(兼容 IE、FF、Chrome)
    文字内容超出自动换到第二行显示
    js面向对象编程两个主要点
  • 原文地址:https://www.cnblogs.com/lightsong/p/4264840.html
Copyright © 2020-2023  润新知