Объединение нескольких файлов по первой колонке

С помощью vSphere Client вы можете увидеть все события, произошедшие с виртуальными машинами ESXi.

Зайдите в операционную систему vm и используйте last|less, чтобы проверить, кто выключил ваши машины.

-1
20.09.2018, 16:56
2 ответа

Вот довольно хитрый GNU awk. GNU awk(gawk)требуется для массивов -из -массивов

gawk -F, '
    NR  == 1 {n=1; header[n] = $1}
    FNR == 1 {n++; header[n] = $2; next}

    !($1 in data) {data[$1][1] = $1}
    {data[$1][n] = $2}

    # from https://www.gnu.org/software/gawk/manual/html_node/Join-Function.html
    function join(array, start, end, sep,    result, i)
    {
        if (sep == "")
            sep = " "
        else if (sep == SUBSEP) # magic value
            sep = ""
        result = array[start]
        for (i = start + 1; i <= end; i++)
            result = result sep array[i]
        return result
    }

    END {
        print join(header, 1, n, FS)
        PROCINFO["sorted_in"] = "@ind_str_asc"   # for sorted output
        for (type in data)
            print join(data[type], 1, n, FS)
    }
' file{1,2,3}
Type,A,B,C
CD,2,2,
FG,,3,8
QR,,,9
RR,1,,5

Я предполагаю, что каждый файл имеет 2 столбца, поэтому он не является полностью универсальным.


Версия, которая не зависит от GNU awk (протестирована с помощью mawk)

mawk -F, '
    NR  == 1 {n=1; header[n] = $1}
    FNR == 1 {n++; header[n] = $2; next}
    {key[$1]; data[$1,n] = $2}
    END {
        for (i=1; i<=n; i++)
            printf "%s%s", header[i], (i==n ? ORS : FS)
        for (type in key) {
            printf "%s%s", type, FS
            for (i=2; i<=n; i++)
                printf "%s%s", data[type,i], (i==n ? ORS : FS)
        }
    }
' file{1,2,3}
0
28.01.2020, 05:12

Это не особенно сложно сделать даже без реальных многомерных -массивов:

/Type/ { type=$2; types[$2] = 1 }
!/Type/ { data[type,$1] = $2; keys[$1] = 1 }
END {
    m = asorti(types)
    value = "Type"
    for (i = 1; i <= m; i++) {
        value = value "," types[i];
    }
    print value;
    n = asorti(keys)
    for (i = 1; i <= n; i++) {
        value=keys[i]
        for (k = 1; k <= m; k++) {
            value = value "," data[types[k],keys[i]]
        }
        print value;
    }
}

Однако для функций сортировки вам по-прежнему нужен GNU awk.

0
28.01.2020, 05:12

Теги

Похожие вопросы