Transformar coluna única em várias colunas com base nos valores

1

Eu tenho 1 coluna como abaixo:

AAA
999888
BBB
1111
BBB
2222
AAA
999777
BBB
3333
AAA
999666
BBB
4444
CCC
Doit
...

Considere acima de alguns milhares de linhas.
Eu quero convertê-lo para abaixo da tabela de 3 colunas com linhas de um AAA para a próxima linha AAA:

AAA     BBB     CCC
999888  1111    
999888  2222    
999777  3333    
999666  4444    Doit

De acordo com o padrão / regras abaixo:

  1. Existem 3 tipos de cabeçalhos: AAA, BBB e CCC. A próxima linha depois deles são seus valores correspondentes.

  2. Os valores de AAA e BBB (isto é, as linhas seguintes depois deles) não são nulos. ex:

    AAA
    BBB

    ou

    BBB
    CCC

    não pode ser visto. Eles sempre terão valores depois deles.

  3. O cabeçalho da coluna CCC não pode ser visto entre 2 entradas AAA, como no exemplo acima. De um AAA para o próximo AAA, se não houver CCC, a nova coluna do CCC estará vazia para essa linha.

Qual é a maneira de realizar isso no Excel (qualquer versão)? Perl, shell, awk etc. também estão bem.

    
por user194938 02.02.2013 / 21:45

1 resposta

0

Eu usei

#!/bin/bash
input_file=${1}
declare -A columns
SEP='\t'
curr_level=0
headers=""
while read line; do
if [ -n "${column}" ]; then
    for (( i=${curr_level}; i<${columns[$column]}; i++ )); do
        echo -ne ${SEP} >> tmpout.txt
    done
    curr_level=${columns[$column]}
    echo -n ${line} >> tmpout.txt
    column=""      
else
    column="${line}"
    if [ -z "${columns[$line]}" ]; then
        columns[$line]="${#columns[@]}"
        headers+="${line}${SEP}"
    elif [ ${columns[$line]} -le $curr_level ]; then
        echo "" >> tmpout.txt
        curr_level=0
    fi
fi             
done < $input_file

echo -e $headers | cat - tmpout.txt >> out.txt
unset columns column headers
rm tmpout.txt

Coloque isso em um arquivo, digamos script.sh, torne-o executável e chame script.sh file_to_format.sh . Ele criará um arquivo chamado out.txt , contendo o resultado, e um arquivo chamado tmpout.txt , que será excluído, será usado para o trabalho temporário.

Observação: isso deixará lacunas verticais, como

AAA     BBB     CCC     
999888  1111
        2222
999777  3333
999666  4444    Doit
    
por 02.02.2013 / 23:10