← retour aux snippets

cut: extraire des colonnes vite et bien

Extraire et réordonner des colonnes sur TSV/CSV simples, changer le délimiteur, slices de bytes et compléments.

objectif

Aller droit au but pour extraire des colonnes depuis des fichiers plats ou des sorties de commandes: TSV recommandé (sûr), CSV simple toléré, réordonnancement, changement de séparateur, compléments et tranches d’octets.

code minimal

# TSV: garder colonnes 1 et 3, dans l'ordre
cut -f1,3 data.tsv

utilisation

# 1) transformer un JSON en TSV puis extraire des colonnes (nom, statut)
curl -fsS https://api.data.pm/v1/metrics \
  | jq -r '.items[] | [.name, (.value|tostring), .unit] | @tsv' \
  | cut -f1,2

# 2) CSV simple (sans quotes complexes): extraire 1re et 3e colonnes
# users.csv: id,name,email
cut -d',' -f1,3 users.csv

# 3) réordonner les colonnes (3 puis 1)
cut -f3,1 data.tsv

# 4) changer le séparateur de sortie (GNU cut uniquement)
# TSV -> colonnes 1 et 3, séparateur de sortie = virgule
cut -f1,3 data.tsv --output-delimiter=','

# 5) ne garder que les colonnes non sélectionnées (complément)
cut -f1,2,4 data.tsv --complement

# 6) extraire un range d’octets (fichiers binaires ou fixes)
# 1-8 puis 17-24 (ex: en-têtes)
cut -b1-8,17-24 payload.bin | xxd

# 7) produire un petit rapport lisible (cut + column)
cut -f1,3 data.tsv | column -t

# 8) normaliser en TSV depuis CSV simple avant cut (plus fiable)
tr ',' '\t' < routes.csv | cut -f1,3

variante(s) utile(s)

# A) fallback portable pour changer le séparateur de sortie (BSD/macOS)
# équivalent de --output-delimiter=',' en remplaçant les tabs après coup
cut -f1,3 data.tsv | tr '\t' ','

# B) sélectionner un range de colonnes (ex: de 2 à 5)
cut -f2-5 data.tsv

# C) extraire colonnes depuis des données espacées irrégulièrement
# (normaliser en tabs puis cut)
some_cmd | tr -s ' ' '\t' | cut -f1,4

# D) éviter les pièges du CSV avec quotes/virgules internes: passer par jq/csvkit
# JSON -> TSV (sûr) puis cut
curl -fsS https://api.data.pm/v1/users \
  | jq -r '.[] | [.id, .email, .role] | @tsv' \
  | cut -f1,3
# CSV robuste (si csvkit dispo):
# csvcut -c id,role users.csv

# E) extraire jusqu’à la fin (open range)
cut -f3- data.tsv

# F) vérifier et forcer un fichier en TSV depuis une liste délimitée exotique (pipe)
tr '|' '\t' < data.pm.export | cut -f1,2,5

notes

  • Préférez TSV (\t) pour des données tabulaires: robuste et sans ambiguïté; cut -f fonctionne nativement.
  • cut -d',' -f... ne gère pas les CSV complexes (champs quotés contenant des virgules). Dans ce cas, convertissez via jq @tsv (si source JSON) ou utilisez un outil CSV dédié (csvkit, Miller).
  • --output-delimiter est propre à GNU cut; sur macOS/BSD, remplacez les tabs par tr '\t' ','.
  • Pour réordonner les colonnes, listez-les dans l’ordre désiré (-f3,1,2). --complement supprime les champs listés et garde le reste.
  • Les slices d’octets (-b) se font en bytes, pas en caractères UTF-8. Utilisez-les pour formats fixes ou binaires, pas pour du texte multioctet.