awk - formata dinamicamente colunas separadas por tabulação

3

Eu tenho um arquivo com colunas de comprimento dinâmico (quatro) separadas por guias (uma coluna pode ter espaços)

COL1    COL2 COL2 COL2  COL3 COL3       COL4
COL1    COL2 COL2       COL3    COL4 COL4
COL1 COL1       COL2 COL2       COL3    COL4 COL4 COL4

Eu gostaria de formatá-lo dinamicamente com o printf no awk? Eu posso formatá-lo com ajustes fixos:

$ awk 'BEGIN {FS="\t"}; {printf "%-10s %-10s %-15s %-15s\n", $1,$3,$4,$2}' test
COL1       COL3 COL3  COL4            COL2 COL2 COL2
COL1       COL3       COL4 COL4       COL2 COL2
COL1 COL1  COL3       COL4 COL4 COL4  COL2 COL2
    
por DonJ 09.02.2018 / 17:18

1 resposta

4

no bash, usando column

$ column -s $'\t' -t file.tsv
col1       col2 col2 col2  col3 col3  col4
col1       col2 col2       col3       col4 col4
col1 col1  col2 col2       col3       col4 col4 col4

column -t usa 2 espaços para separar as colunas

Com o awk, eu escreveria

awk -F '\t' -v cols=4 '
    NR == FNR {
        for (i=1; i<=cols; i++) 
            if (NR == 1 || length($i) > w[i]) 
                w[i] = length($i)
        next
    }
    {
        for (i=1; i<=cols; i++) 
            printf "%-*s%s", w[i], $i, (i == cols ? ORS : FS) 
    }
' file.tsv file.tsv

Onde estou processando o arquivo duas vezes: primeiro para encontrar as amplitudes máximas para cada coluna e, em seguida, novamente para reformatar o arquivo. Eu uso uma guia para separar as colunas na saída.

col1            col2 col2 col2  col3 col3       col4
col1            col2 col2       col3            col4 col4
col1 col1       col2 col2       col3            col4 col4 col4
    
por 09.02.2018 / 18:19