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