Envolvendo células longas em um tsv para mantê-las na mesma coluna

3

Formatar um TSV com células longas com column torna a legibilidade muito baixa. Simplesmente quebra linhas como esta:

$ python3 -c 'for i in (1,2,3): print(((str(i)*50)+"\t")*3)' | column -s $'\t' -t

11111111111111111111111111111111111111111111111111  11111111111111111111111111111111111111111111111111  1111111111111111111
1111111111111111111111111111111
22222222222222222222222222222222222222222222222222  22222222222222222222222222222222222222222222222222  2222222222222222222
2222222222222222222222222222222
33333333333333333333333333333333333333333333333333  33333333333333333333333333333333333333333333333333  3333333333333333333
3333333333333333333333333333333

A minha pergunta é, como posso formatar arquivos tsv (provavelmente csv também), para ter certeza que quando um tamanho máximo da célula (que pode ser definido com um parâmetro) ser alcançado, não apenas uma quebra de linha, mas os dados começarão em uma nova linha com o mesmo recuo.

Para os dados acima, o resultado pode ser algo como:

1111111111 1111111111 1111111111 
1111111111 1111111111 1111111111 
1111111111 1111111111 1111111111 
1111111111 1111111111 1111111111 
1111111111 1111111111 1111111111 

2222222222 2222222222 2222222222 
2222222222 2222222222 2222222222 
2222222222 2222222222 2222222222 
2222222222 2222222222 2222222222 
2222222222 2222222222 2222222222 

3333333333 3333333333 3333333333 
3333333333 3333333333 3333333333 
3333333333 3333333333 3333333333 
3333333333 3333333333 3333333333 
3333333333 3333333333 3333333333 
    
por Grzegorz Wierzowiecki 17.01.2012 / 19:49

1 resposta

1

Não sei se entendo o que quero alcançar, mas talvez esse programa awk seja útil para você:

Conteúdo de script.awk :

{
    ## Number of blocks printed to output.
    block = 0 

    ## Get number of columns searching how many tabs exists in the line.
    ## I substract one because each line has a tab at the end and splits
    ## function count blank space after it like a new column.
    col_nums = split( $0, dummy, /\t+/ )
    --col_nums

    ## Incorrect line if it has not any tab. Omit it.
    if ( col_nums < 1 ) { 
        next
    }   

    ## Get number of chars of each block to output.
    ## 'max_cell_length' is an input argument provided by the user. It means
    ## number of chars to input by line.
    chars = max_cell_length / col_nums

    ## For each column...
    for ( i = 1; i <= NF; i++ ) { 

        ## This is the index where I begin to extract a substring. Zero is
        ## at first char.
        begin_idx = 0 

        ## Get for each column blocks of 'chars' characters. And repeat until
        ## end of column.
        while ( begin_idx < length( $i ) ) { 
            column = substr( $i, begin_idx, chars )

            ## Increment index to extract next block where last one ended.
            begin_idx += chars

            ## Print block to output.
            printf "%s ", column

            ## When have been printed number of columns indicated by the 
            ## user, change to next line.
            if ( ++block % col_nums == 0 ) { 
                printf "\n"
            }   
        }   
    }   
}

{
    ## For each line, print an extra newline for a pretty output.
    printf "\n"
}

Executando o script:

python3 -c 'for i in (1,2,3): print(((str(i)*50)+"\t")*3)' | awk -v max_cell_length=30 -f script.awk -

E resultado:

1111111111 1111111111 1111111111 
1111111111 1111111111 1111111111 
1111111111 1111111111 1111111111 
1111111111 1111111111 1111111111 
1111111111 1111111111 1111111111 

2222222222 2222222222 2222222222 
2222222222 2222222222 2222222222 
2222222222 2222222222 2222222222 
2222222222 2222222222 2222222222 
2222222222 2222222222 2222222222 

3333333333 3333333333 3333333333 
3333333333 3333333333 3333333333 
3333333333 3333333333 3333333333 
3333333333 3333333333 3333333333 
3333333333 3333333333 3333333333 

Você pode usar a variável max_cell_length para indicar o número de caracteres por linha de saída (sem bancos), e suponho que seja um fator de número de caracteres nos dados originais. Caso contrário, a saída será mal formatada, testei-a com 30 , como você pode ver nesta postagem e com 50 . Ambos parecem corretos, mas não com muitos outros números estranhos.

    
por 17.01.2012 / 23:13