Skip to content
Quick links:   Flags   Verbs   Functions   Glossary   Release docs

Miller command structure

Overview

The outline of an invocation of Miller is:

  • The program name mlr.
  • Flags controlling input/output formatting, etc. (see the flags reference).
  • One or more verbs -- such as cut, sort, etc. (see verbs reference) -- chained together using then. You use these to transform your data.
  • Zero or more filenames, with input taken from standard input if there are no filenames present. (You can place the filenames up front using --from or --mfrom as described on the keystroke-savers page.)

For example, reading from a file:

mlr --icsv --opprint head -n 2 then sort -f shape example.csv
color  shape    flag k index quantity rate
red    square   true 2 15    79.2778  0.0130
yellow triangle true 1 11    43.6498  9.8870
mlr --from example.csv --icsv --opprint head -n 2 then sort -f shape
color  shape    flag k index quantity rate
red    square   true 2 15    79.2778  0.0130
yellow triangle true 1 11    43.6498  9.8870

Reading from standard input:

cat example.csv | mlr --icsv --opprint head -n 2 then sort -f shape
color  shape    flag k index quantity rate
red    square   true 2 15    79.2778  0.0130
yellow triangle true 1 11    43.6498  9.8870

The rest of this reference section gives you full information on each of these parts of the command line.

See also the Glossary for more about terms such as record, field, key, streaming, and more.

Verbs vs DSL

When you type mlr {something} myfile.dat, the {something} part is called a verb. It specifies how you want to transform your data. Most of the verbs are counterparts of built-in system tools like cut and sort -- but with file-format awareness, and giving you the ability to refer to fields by name.

The verbs put and filter are special in that they have a rich expression language (domain-specific language, or "DSL"). More information about them can be found at on the Intro to Miller's programming language page; see also DSL reference for more details.

Here's a comparison of verbs and put/filter DSL expressions:

Example of using a verb for data processing:

mlr stats1 -a sum -f x -g a data/small
a=pan,x_sum=0.346791
a=eks,x_sum=1.140078
a=wye,x_sum=0.777891
  • Verbs are coded in Go
  • They run a bit faster
  • They take fewer keystrokes
  • There's less to learn
  • Their customization is limited to each verb's options

Example of doing the same thing using a DSL expression:

mlr  put -q '@x_sum[$a] += $x; end{emit @x_sum, "a"}' data/small
a=pan,x_sum=0.346791
a=eks,x_sum=1.140078
a=wye,x_sum=0.777891
  • You get to write your own expressions in Miller's programming language
  • They run a bit slower
  • They take more keystrokes
  • There's more to learn
  • They're highly customizable

Exit codes

When you do echo $? immediately after running a Miller command (or any shell command), that's the exit code.

Miller's are as follows:

  • 0 for normal exit.
  • 1 if an error was encountered. There should be helpful text written to stderr; please file a bug report, ideally with a reproducible scenario, if the text is either missing or unhelpful.
  • 2 if there was a panic in the Go runtime -- you'll see lots of stack-trace lines. Please file a bug report, ideally with a reproducible scenario, if you ever see this.
Back to top