首页 > 代码库 > 使用awk统计字段重复实践

使用awk统计字段重复实践

awk

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

类似这种文本:

[root@www ~]# last -n 5 <==仅取出前五行root     pts/1   192.168.1.100  Tue Feb 10 11:21   still logged inroot     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统计字段重复实践