J'ai un fichier avec des colonnes de longueur dynamique (quatre) séparées par des tabulations (une colonne peut avoir des espaces)
COL1    COL2 COL2 COL2  COL3 COL3       COL4
COL1    COL2 COL2       COL3    COL4 COL4
COL1 COL1       COL2 COL2       COL3    COL4 COL4 COL4
Je voudrais le formater dynamiquement avec printf en awk ? Je peux le formater avec des ajustements fixes :
$ awk 'BEGIN {FS="t"}; {printf "%-10s %-10s %-15s %-15sn", $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
Réponse acceptée :
 en bash, en utilisant 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 utilise 2 espaces pour séparer les colonnes
Avec awk, j'écrirais
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
Où je traite le fichier deux fois :d'abord pour trouver les largeurs maximales pour chaque colonne, puis à nouveau pour reformater le fichier. J'utilise un onglet pour séparer les colonnes dans la sortie.
col1            col2 col2 col2  col3 col3       col4
col1            col2 col2       col3            col4 col4
col1 col1       col2 col2       col3            col4 col4 col4