码迷,mamicode.com
首页 > 其他好文 > 详细

使用awk统计字段重复实践

时间:2015-01-31 23:14:16      阅读:355      评论:0      收藏:0      [点我收藏+]

标签:

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\n", 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

 

使用awk统计字段重复实践

标签:

原文地址:http://www.cnblogs.com/lightsong/p/4264840.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!