← retour aux snippets

column: aligner des tableaux texte proprement

Mettre en forme des listes/CSV/TSV en tableaux lisibles avec column -t/-s, de façon portable (GNU/BSD).

objectif

Transformer rapidement des sorties en tableaux alignés pour les lire ou les partager (listes de fichiers, métriques, CSV/TSV) en utilisant column. Compatible Linux/macOS, avec délimiteurs sûrs.

code minimal

# aligner un key/value simple
printf '%s\n' "site data.pm" "api  https://api.data.pm" | column -t

utilisation

# 1) CSV -> tableau lisible (séparateur virgule)
printf '%s\n' \
  "route,method,status" \
  "/,GET,200" \
  "/health,GET,200" \
  "/login,POST,302" \
  | column -t -s ','

# 2) TSV (plus sûr quand les valeurs contiennent des virgules)
# générer un TSV puis aligner
printf 'path\tstatus\tbytes\n' > /tmp/report.tsv
printf '/\t200\t10240\n' >> /tmp/report.tsv
printf '/assets/app.js\t200\t532000\n' >> /tmp/report.tsv
column -t -s $'\t' /tmp/report.tsv

# 3) lister taille et nom de fichiers (du + sort + column)
du -sh ./build/* 2>/dev/null | sort -h | column -t

# 4) transformer un JSON en table (jq -> TSV -> column)
curl -fsS https://api.data.pm/v1/metrics \
  | jq -r '.items[] | [.name, (.value|tostring), .unit] | @tsv' \
  | column -t -s $'\t'

# 5) afficher un diff de numéros de version en colonnes
printf '%s\n' "current v1.8.2" "remote  v1.9.0" | column -t

# 6) regrouper des stats (ss, df) et les rendre lisibles
ss -s | sed 's/: \+/\t/' | column -t -s $'\t'
df -hT | column -t

variante(s) utile(s)

# A) largeur maximale d'une colonne (troncature amicale avec awk) avant column
# (utile pour des URLs très longues)
curl -fsS https://api.data.pm/v1/routes \
  | jq -r '.[] | [.path, .method, (.latency_ms|tostring)] | @tsv' \
  | awk -F'\t' 'BEGIN{OFS="\t"}{if(length($1)>60)$1=substr($1,1,57)"..."; print}' \
  | column -t -s $'\t'

# B) forcer une police monospace dans un fichier Markdown (préformaté)
( echo "path\tstatus\tbytes"
  echo "/\t200\t10240"
  echo "/assets/app.css\t200\t43100" ) \
  | column -t -s $'\t' | sed '1s/^/```\n/;$s/$/\n```/'

# C) stabiliser le tri avant affichage
LC_ALL=C sort -t',' -k1,1 routes.csv | column -t -s ','

# D) sorties avec multiples espaces irréguliers: normaliser en un séparateur
printf '%s\n' "name     size" "app.js   532000" "app.css     43100" \
  | tr -s ' ' '\t' | column -t -s $'\t'

# E) macOS (BSD column) et GNU: options communes (-t, -s). Éviter -o (pas portable).
# Si besoin, fallback sans column via awk:
printf '%s\n' "a bbb" "aa c" \
  | awk '
      { for (i=1; i<=NF; i++) if (length($i)>w[i]) w[i]=length($i); rows[NR]=$0 }
      END { for (r=1; r<=NR; r++) {
              split(rows[r], f, /[ \t]+/)
              for (i=1; i<=length(f); i++) printf "%-*s%s", w[i]+2, f[i], (i==length(f) ? ORS : "")
            }
          }'

notes

  • -t aligne les colonnes, -s <sep> définit le séparateur (, pour CSV, $'\t' pour TSV). Préférez TSV pour éviter les collisions de virgules.
  • Normalisez en amont: utilisez jq -r ... | @tsv, tr -s ' ' '\t', ou awk pour fabriquer des colonnes propres.
  • Sur macOS (BSD), column ne supporte pas certaines options GNU comme -o. Restez sur -t et -s pour la portabilité.
  • Gardez des largeurs raisonnables pour la lisibilité (tronquez les champs trop longs avant column).
  • column met en forme l’affichage; pour des exports sérieux (CSV/TSV), conservez aussi la version brute à côté du rendu.