Se não nos importamos com o alinhamento de colunas e queremos apenas dados separados em branco normalizados, o padrão básico é:
awk -F' +' '{ $1 = ($1 ~ /^$/ ? prev : $1); prev = $1; print }'
Veja, se configurarmos um separador de campo personalizado que não seja igual ao espaço padrão, conseguiremos a verdadeira separação de campos. Se o registro começar com uma correspondência para o separador, um campo vazio será delimitado.
Por padrão, o Awk não se separa; tokenizes: extrai de cada tokens de registro que são sequências de um ou mais caracteres não-em branco / não-newline. Isso significa que espaços em branco iniciais / finais são ignorados. Portanto, se você tiver uma coluna ausente 1, o valor na coluna 2 se tornará a coluna 1.
Com nosso regex separador / +/
, obtemos um comportamento de separação real. Um registro com espaços iniciais e finais como 1 2 3 4
é tratado como <SEP>1<SEP>2<SEP>3<SEP>4<SEP>
. Assim, existem seis campos: ""
, "1"
, ..., "4"
, ""
. Existe um campo antes do primeiro <SEP>
e depois do último.
A propósito, se o primeiro registro pode ter um campo perdido, obviamente precisamos de um padrão para prev
. Também não queremos que a lógica se aplique aos títulos. Também vamos substituir o operador ternário por um if
: Assim:
awk 'BEGIN { FS = " +"; prev = 0 }
NR == 1
NR > 1 { if ($1 == "") $1 = prev
print
prev = $1 }'
FOO BAR BAZ
FOO BAR BAZ
2 3 4
0 2 3 4
1 2 3 4
1 2 3 4
2 3 4
1 2 3 4