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