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

2

Eu tenho um arquivo de texto com linhas e colunas nessas linhas. Eu quero, essencialmente, replicar a função "preencher" do Excel. Em outras palavras, se houver uma "célula" em branco em uma linha, ela olhará para a linha acima dela e preencherá o valor no campo correspondente acima dela. Exemplo, com "^" sendo usado como separador de coluna:

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 (preenche itens no 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

Assim, essencialmente, a função é identificar qualquer campo em branco e, onde houver um, extrair o valor do campo correspondente acima dele. Importante para poder especificar os separadores de campo / coluna. Alguma idéia?

    
por Simonmdr 01.11.2016 / 02:46

1 resposta

2

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

por 01.11.2016 / 07:02