awk -F'^' -v OFS='^' \
'{
for (i = 1; i <= NF; i++) {
if ($i == "") $i = save[i]
else save[i] = $i
}
for (i = NF+1; i <= 99; i++) save[i] = ""
print
}'
Isso usa uma matriz chamada save
para salvar os valores de uma linha para a próxima (preenchendo).
Tudo em awk
é implicitamente inicializado como nulo
Portanto, a matriz save
ficará em branco até que os dados sejam atribuídos a ela.
(Portanto, quaisquer campos em branco na primeira linha serão deixados em branco,
porque não há dados anteriores para copiar neles.)
Para cada linha,
- Para cada campo que existe nesta linha (
for (i = 1; i <= NF; i++)
),- se estiver em branco, preencha-o com o valor salvo (copiado) desta coluna,
- caso contrário, salve o valor atual para possível uso nas linhas subsequentes.
-
Em seguida, apague a matriz
save
de todas as colunas que não estão presentes na linha atual. Por exemplo, quando chegamos à linha 4 (que tem apenas quatro campos), nós “esquecemos” que as colunas 5 e 6 da linha 3 continha “Singapura” e “Nova Deli”. E quando chegarmos a linha 7 (que tem apenas um campo), nós “esquecemos” que a coluna 2 da linha 5 continha “Bangkok”, por isso não está disponível para entrar na linha 8 (onde a coluna 2 está em branco).Substitua o
99
com o maior número de campos que você espera ver em uma linha (nunca).