Formatando e preenchendo dados perdidos com base na coluna

2

Eu tenho os dados neste formato e quero classificá-los com base no rótulo em cada coluna. Gostaria de substituir o campo ausente por uma vírgula ( , ) como mostrado abaixo

2018-03-13 02:09:12,AB=123,BC=6,CAB=Jax,XYZ=Xax
2018-03-13 02:09:13,AB=234,BC=6,CAB=Jax,XYZ=Ram
2018-03-13 02:11:03,AB=567,BC=6,XYZ=Xulu

Resultados esperados.

2018-03-13 02:09:12,    AB=123, BC=6,   CAB=Jax,    XYZ=Xax
2018-03-13 02:09:13,    AB=234, BC=6,   CAB=Jax,    XYZ=Ram
2018-03-13 02:11:03,    AB=567, BC=6,          ,    XYZ=Xulu
    
por Jams 13.03.2018 / 15:53

1 resposta

0

BEGIN { OFS = FS = "," }

FNR==1 {
    for (i = 2; i <= NF; ++i) {
        split($i, a, "=")
        f[i] = a[1]
    }
}

{
    for (i = 2; i <= NF; ++i) {
        split($i, a, "=")
        if (a[1] != f[i]) {
            for (j = NF + 1; j > i; --j)
                $j = $(j - 1)
            $i = ""
        }

        $i = sprintf("%10s", $i)
    }

    print
}

Este programa awk assume que a primeira linha do arquivo de entrada é correta por conter todos os campos nas posições corretas.

No texto abaixo, "todos os campos" e "os campos" referem-se a todos, exceto ao primeiro campo, que não foi alterado.

Somente para a primeira linha, ele lê os bits antes do = nos campos e armazena na matriz f a posição do campo correspondente.

Para todas as linhas, ele faz o mesmo tipo de divisão do conteúdo dos campos em = e compara o bit antes do = com o que a matriz f diz que deveria ser. Se houver uma incompatibilidade, os campos desse ponto em diante serão "deslocados para a direita" em uma posição e o campo atual será esvaziado.

Em seguida, todos os campos são reformatados como uma string justificada à direita de 10 caracteres e o registro inteiro modificado (linha) é impresso.

Executando isso nos dados de exemplo:

$ awk -f script.awk file
2018-03-13 02:09:12,    AB=123,      BC=6,   CAB=Jax,   XYZ=Xax
2018-03-13 02:09:13,    AB=234,      BC=6,   CAB=Jax,   XYZ=Ram
2018-03-13 02:11:03,    AB=567,      BC=6,          ,  XYZ=Xulu
    
por 01.08.2018 / 13:14