如何只在几个输入文本文件的awk中向数组添加唯一元素

时间:2011-06-30 08:50:33

标签: awk gawk

正如toppic建议的那样,如何从多个文本文件中读取信息,只在元素中添加一次元素,无论它们是否在不同的文本文件中多次出现?

我已经开始使用这个脚本读入并按照它们在不同文档中出现的顺序打印出所有元素。

例如,请查看包含以下数据的这3个不同文本文件

文件1:

2011-01-22 22:12 test1 22 1312 75 13.55 1399 
2011-01-23 22:13 test4 22 1112 72 12.55 1499

文件2:

2011-01-24 22:14 test1 21 1322 75 23.55 1599 
2011-01-25 22:15 test2 23 2312 77 33.55 1699 

文件3:

2011-01-26 22:16 test2 20 1412 79 63.55 1799 
2011-01-27 22:17 test5 12 1352 78 43.55 1999 

我想检查当前元素是否已添加到数组中,但是现在我的脚本会打印出所有元素。

{
    BUILDd[NR-1] = $3; len++
}
   END { 
        SUBSYSTEM=substr(FILENAME, 1, length(FILENAME)-7)
        LABEL= "\"" toupper(SUBSYSTEM) "\""
        print  "#{"
        print "\"buildnames\": {"
        print "        \"label\": \"buildnames\","
        print "        \"data\": ["
        for (i = 0 ; i <= len-1; i ++ ) {
        if(i == len-1){print "            [\"" BUILDd[i] "\"]"}
        else
            { print "            [\"" BUILDd[i] "\"],"}
        }
        print "        ]"
        print " }"
        print "};"
}

提供此输出

#{
"buildnames": {
        "label": "buildnames",
        "data": [
            ["test1"]
            ["test4"]
            ["test1"]
            ["test2"]
            ["test2"]
            ["test5"]
        ]
        }
};

当我想要它给出以下

#{
"buildnames": {
        "label": "buildnames",
        "data": [
            ["test1"]
            ["test2"]
            ["test4"]
            ["test5"]
        ]
        }
};

1)换句话说,首先检查元素是否已经在数组中,如果没有,则添加它们/它们

2)如果可能,然后对数组进行排序

谢谢=)

1 个答案:

答案 0 :(得分:1)

除了格式化之外,这是你想要实现的(a,b,c,是包含你的日志的文件)吗?

$ cut -d" " -f3 a b c | sort | uniq
test1
test2
test4
test5

使用awk

{
    BUILDd[$3] = 1
}
END {
    for (i in BUILDd) {
    print i
    }
}

给出

awk -f a.awk a b c
test1
test2
test4
test5

请注意,这里正确的排序顺序是纯粹意外的...订单内容放入数组不是它打印的顺序。