Eu tenho um arquivo de texto com linhas e colunas dentro dessas linhas. Quero, essencialmente, replicar a função "preencher" do Excel. Em outras palavras, se houver uma “célula” em branco em uma linha, ele irá olhar para a linha acima dela e preencher o valor no campo correspondente acima dela. Exemplo, com "^" sendo usado como separador de colunas:
London^Paris^Moscow^Berlin
^^Melbourne^New York^Washington
^^^Sydney^Singapore^New Delhi
^^New York^Washington
Kuala Lumpur^Bangkok^Hong Kong
^^^^Johannesburg^Sydney^Singapore^New Delhi
Amsterdam
^^Bucharest
... torna-se (itens preenchidos em CAPS para maior clareza):
London^Paris^Moscow^Berlin
LONDON^PARIS^Melbourne^New York^Washington
LONDON^PARIS^MMELBOURNE^Sydney^Singapore^New Delhi
LONDON^PARIS^New York^Washington
Kuala Lumpur^Bangkok^Hong Kong
KUALA LUMPUR^BANGKOK^HONG KONG^^Johannesburg^Sydney^Singapore^New Delhi
Amsterdam
AMSTERDAM^^Bucharest
Então, essencialmente, a função é identificar qualquer campo em branco e, onde houver, extrair o valor do campo correspondente acima dele. Importante poder especificar os separadores de campo/coluna. Alguma ideia ?
Responder1
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 um array chamado save
para salvar os valores de uma linha para a próxima (preenchimento). Tudo em awk
é inicializado implicitamente como nulo, portanto o save
array ficará em branco até que os dados sejam atribuídos a ele. (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 com o valor salvo (copiado) para esta coluna,
- caso contrário, salve o valor atual para possível uso nas linhas subsequentes.
Em seguida, apague a
save
matriz de todas as colunas que não estão presentes na linha atual. Por exemplo, quando chegamos à linha 4 (que tem apenas quatro campos), “esquecemos” que as colunas 5 e 6 da linha 3 continham “Singapura” e “Nova Deli”. E quando chegamos à linha 7 (que tem apenas um campo), “esquecemos” que a coluna 2 da linha 5 continha “Bangkok”, portanto não está disponível para ser inserido na linha 8 (onde a coluna 2 está em branco).Substitua pelo
99
pelo maior número de campos que você espera ver em uma linha (sempre).