Vai al contenuto

Miller 6.17.0: YAML finalmente supportato

Ci sono release che aggiungono funzioni "belle da leggere", e release che ti fanno risparmiare tempo da subito. La release Miller 6.17.0 (pubblicata il 21 febbraio 2026) è del secondo tipo: prende problemi reali emersi nelle issue e li trasforma in comandi più diretti.

Il risultato è semplice: meno passaggi intermedi, meno script collaterali, pipeline più corte.

Open Graph della release Miller 6.17.0

YAML I/O nativo

Chi lavora con configurazioni, metadati, OpenAPI o cataloghi dati si trova spesso file YAML da esplorare al volo. Prima, in tanti casi, c'era un passaggio esterno di conversione.

Prima

Input (input.yaml):

- id: 1
  city: Roma
  score: 10
- id: 2
  city: Milano
  score: 20

Dopo

mlr --iyaml --ocsv cat input.yaml

Output:

city,id,score
Roma,1,10
Milano,2,20

Puoi trattare YAML come CSV/JSON nella stessa pipeline, senza passaggi manuali extra.

Esempio d'uso minimo con creazione campo derivato:

- first_name: Ada
  last_name: Lovelace
- first_name: Alan
  last_name: Turing
mlr --yaml put '$full_name = $first_name . " " . $last_name' persone.yaml

Output:

- first_name: Ada
  full_name: Ada Lovelace
  last_name: Lovelace
- first_name: Alan
  full_name: Alan Turing
  last_name: Turing

🎉 Nota personale: questa feature mi rende particolarmente orgoglioso, perché la richiesta iniziale è partita proprio da me con l'issue #614.

Supporto DCF (Debian Control Format)

DCF (Debian Control Format) è un formato testuale usato storicamente nei metadati dei pacchetti Debian e, più in generale, in file descrittivi composti da record. Ogni record contiene campi chiave: valore, può avere righe di continuazione per i campi lunghi, e i record sono separati da una riga vuota. Prima si ricorreva spesso a workaround con grep/sed prima di passare i dati a Miller.

Prima

Input (sample.dcf):

Package: foo
Version: 1.0
Depends: libc6 (>= 2.0), libfoo (>= 1.2)
Description: A test package.

Package: bar
Version: 2.0
Recommends: foo
Description: Another package.

Dopo

mlr --idcf --ojson cat sample.dcf

Output:

[
  {
    "Package": "foo",
    "Version": "1.0",
    "Depends": ["libc6 (>= 2.0)", "libfoo (>= 1.2)"],
    "Description": "A test package."
  },
  {
    "Package": "bar",
    "Version": "2.0",
    "Recommends": ["foo"],
    "Description": "Another package."
  }
]

È un miglioramento pratico quando i file hanno continuation lines e campi non sempre uguali tra record.

Verbi correlati: cat.

reorder -r: riordinare colonne con regex

Quando lo schema è variabile ma i prefissi sono stabili (YYY_*, XXX_*), elencare i campi uno per uno è fragile.

Prima

Input (input.csv):

id,YYY_city,foo,YYY_region,XXX_score,bar
1,Roma,a,Lazio,10,x
2,Milano,b,Lombardia,20,y
mlr --icsv --ocsv reorder -f YYY_city,YYY_region,XXX_score input.csv

Output:

YYY_city,YYY_region,XXX_score,id,foo,bar
Roma,Lazio,10,1,a,x
Milano,Lombardia,20,2,b,y

Dopo

mlr --icsv --ocsv reorder -r '^YYY,^XXX' input.csv

Output:

YYY_city,YYY_region,XXX_score,id,foo,bar
Roma,Lazio,10,1,a,x
Milano,Lombardia,20,2,b,y

Utile soprattutto nei dataset dove le colonne cambiano spesso ma seguono convenzioni di naming.

Verbi correlati: reorder.

nest -r: selezione regex dei campi target

Nei dati reali capita di avere famiglie di colonne (tags_1, tags_2, tags_3, ...). Con -f devi indicare i campi a mano; con -r prendi tutta la famiglia in un colpo solo, anche quando compare un nuovo campo.

Prima

Input (input.csv):

id,tags_1,tags_2,tags_3,tags_4,other
1,alpha;beta,gamma,delta,uno;due,z
2,red;blue,green,black,tre;quattro,k
mlr --icsv --ocsv nest --explode --values --across-fields -f tags_1 -f tags_2 -f tags_3 input.csv

Output:

id,tags_1,tags_2,tags_3_1,tags_4,other
1,alpha;beta,gamma,delta,uno;due,z
2,red;blue,green,black,tre;quattro,k

Dopo

mlr --icsv --ocsv nest --explode --values --across-fields -r '^tags_' input.csv

Output:

id,tags_1_1,tags_1_2,tags_2_1,tags_3_1,tags_4_1,tags_4_2,other
1,alpha,beta,gamma,delta,uno,due,z
2,red,blue,green,black,tre,quattro,k

Meno manutenzione quando aumentano o cambiano i campi della stessa famiglia. In pratica non sei costretto a scrivere tutti i nomi dei campi: basta un'espressione regolare che li mappa.

🎉 Nota personale: anche questa mi rende felice: la richiesta iniziale era mia, nell'issue #381.

Verbi correlati: nest.

split --folder: output diretto in cartella

Qui la novità non è nel risultato finale (i file prodotti), ma nel modo in cui lo esprimi. Prima si usava spesso --prefix con path incorporato: funzionava, ma mescolava directory di destinazione e nome base dei file in un solo parametro. Con --folder le due cose sono separate e il comando è più leggibile/manutenibile.

Prima

Input (input.csv):

id,city
1,Roma
2,Milano
3,Torino
mlr --icsv split -m 10 --prefix /tmp/test --suffix csv input.csv

Output (file creati):

/tmp/test_1.csv
/tmp/test_2.csv
/tmp/test_3.csv

Dopo

mlr --icsv split -m 10 --folder /tmp --prefix test --suffix csv input.csv

Output (file creati):

/tmp/test_1.csv
/tmp/test_2.csv
/tmp/test_3.csv

Quindi: stesso output, ma semantica migliore del comando. Separare destinazione (--folder) e nome file (--prefix) rende script e automazioni più leggibili e meno ambigui.

Verbi correlati: split.


Questa non è una release "solo tecnica": aggiunge due formati richiesti da tempo (YAML, DCF) e migliora tre verbi usati ogni giorno (reorder, nest, split) nei punti dove prima servivano workaround.

Per chi lavora con dati da riga di comando, è una release che si sente subito. E oltre alle novità raccontate qui, include anche diversi bugfix e altre modifiche interne che rendono Miller ancora più solido.

Fonti