Как добавить уникальные элементы в массив в awk только из нескольких входных текстовых файлов

как предлагает топик, как мне читать информацию из нескольких текстовых файлов и добавлять элементы только 1 раз в массив, независимо от того, встречаются ли они несколько раз в разных текстовых файлах?

Я начал с этого скрипта, который считывает и распечатывает все элементы в том порядке, в котором они встречаются в разных документах.

Например, взгляните на эти 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) После этого отсортируйте массив, если это возможно

Спасибо =)


person Adam    schedule 30.06.2011    source источник
comment
Ваш вопрос очень похож на этот stackoverflow.com/questions/6523656/ ваш коллега, или вы используете разные имена для входа? :-)   -  person Fredrik Pihl    schedule 30.06.2011


Ответы (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

Обратите внимание, что правильный порядок сортировки здесь является чисто случайным... Порядок помещения в массив не соответствует порядку, в котором он печатается.

person Fredrik Pihl    schedule 30.06.2011
comment
Да, это тот. Извините, но я не понимаю, как мне реализовать это в моем сценарии, возможно, вы могли бы указать мне правильное направление? знак равно - person Adam; 30.06.2011
comment
спасибо за вашу помощь, теперь к бонусному вопросу, можно ли распечатать эту информацию в обычный текстовый файл вместо текстового окна? знак равно - person Adam; 30.06.2011
comment
@ Адам, просто перенаправь, т.е. awk ... input > outfile - person Fredrik Pihl; 30.06.2011