Comando para "preencher" colunas em arquivo de texto, como a função de preenchimento do Excel

Comando para "preencher" colunas em arquivo de texto, como a função de preenchimento do Excel

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 savearray 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 savematriz 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).

informação relacionada