From 8fa4a3faa90b8ce3ace76934221c15b67714904d Mon Sep 17 00:00:00 2001 From: John Kerl Date: Wed, 4 Aug 2021 22:03:01 -0400 Subject: [PATCH] Replace miller-6 sphinx docs with mkdocs docs (#618) --- .gitignore | 2 +- docs/sphinx-hack/multi-join | 1 - docs/sphinx-hack/ngrams | 1 - docs/sphinx-hack/polyglot-dkvp-io | 1 - docs6/.vimrc | 2 - docs6/10min.rst | 653 - docs6/10min.rst.in | 378 - docs6/Makefile | 28 - docs6/README.md | 50 +- docs6/build-one | 13 - docs6/build.rst | 121 - docs6/build.rst.in | 118 - docs6/community.rst | 10 - docs6/community.rst.in | 7 - docs6/conf.py | 112 - docs6/contributing.rst | 47 - docs6/contributing.rst.in | 44 - docs6/csv-with-and-without-headers.rst | 149 - docs6/csv-with-and-without-headers.rst.in | 72 - docs6/customization.rst | 96 - docs6/customization.rst.in | 73 - docs6/data-cleaning-examples.rst | 77 - docs6/data-cleaning-examples.rst.in | 38 - docs6/data-diving-examples.rst | 234 - docs6/data-diving-examples.rst.in | 118 - docs6/dates-and-times.rst | 126 - docs6/dates-and-times.rst.in | 52 - docs6/dkvp-examples.rst | 253 - docs6/dkvp-examples.rst.in | 52 - docs6/doc-reorg.txt | 7 - {docs6b => docs6}/docs/.vimrc | 0 docs6/{ => docs}/10-1.sh | 0 docs6/{ => docs}/10-2.sh | 0 {docs6b => docs6}/docs/10min.md | 0 {docs6b => docs6}/docs/10min.md.in | 0 {docs6b => docs6}/docs/Makefile | 0 .../docs/_build/doctrees/10min.doctree | Bin .../docs/_build/doctrees/build.doctree | Bin .../docs/_build/doctrees/community.doctree | Bin .../docs/_build/doctrees/contact.doctree | Bin .../docs/_build/doctrees/contributing.doctree | Bin .../docs/_build/doctrees/cookbook.doctree | Bin .../docs/_build/doctrees/cookbook2.doctree | Bin .../docs/_build/doctrees/cookbook3.doctree | Bin .../docs/_build/doctrees/cookbook4.doctree | Bin .../csv-with-and-without-headers.doctree | Bin .../_build/doctrees/customization.doctree | Bin .../doctrees/data-cleaning-examples.doctree | Bin .../doctrees/data-diving-examples.doctree | Bin .../_build/doctrees/data-examples.doctree | Bin .../docs/_build/doctrees/data-sharing.doctree | Bin .../_build/doctrees/dates-and-times.doctree | Bin .../_build/doctrees/dkvp-examples.doctree | Bin .../docs/_build/doctrees/environment.pickle | Bin .../docs/_build/doctrees/etymology.doctree | Bin .../doctrees/ex-fields-not-selected.doctree | Bin .../doctrees/ex-no-output-at-all.doctree | Bin .../docs/_build/doctrees/faq.doctree | Bin .../doctrees/feature-comparison.doctree | Bin .../docs/_build/doctrees/features.doctree | Bin .../docs/_build/doctrees/file-formats.doctree | Bin .../docs/_build/doctrees/foo.doctree | Bin .../_build/doctrees/getting-started.doctree | Bin .../docs/_build/doctrees/index.doctree | Bin .../docs/_build/doctrees/install.doctree | Bin .../docs/_build/doctrees/installation.doctree | Bin .../doctrees/internationalization.doctree | Bin .../docs/_build/doctrees/introduction.doctree | Bin .../docs/_build/doctrees/joins.doctree | Bin .../_build/doctrees/keystroke-savers.doctree | Bin .../doctrees/log-processing-examples.doctree | Bin .../docs/_build/doctrees/manpage.doctree | Bin .../_build/doctrees/miller-by-example.doctree | Bin .../_build/doctrees/miller-on-windows.doctree | Bin .../_build/doctrees/misc-examples.doctree | Bin .../_build/doctrees/new-in-miller-6.doctree | Bin .../docs/_build/doctrees/old-10min.doctree | Bin .../doctrees/operating-on-all-fields.doctree | Bin .../docs/_build/doctrees/originality.doctree | Bin .../doctrees/output-colorization.doctree | Bin .../docs/_build/doctrees/performance.doctree | Bin .../doctrees/programming-examples.doctree | Bin .../doctrees/programming-language.doctree | Bin .../_build/doctrees/quick-examples.doctree | Bin .../doctrees/randomizing-examples.doctree | Bin .../doctrees/record-heterogeneity.doctree | Bin .../doctrees/reference-dsl-arrays.doctree | Bin .../reference-dsl-builtin-functions.doctree | Bin .../doctrees/reference-dsl-complexity.doctree | Bin .../reference-dsl-complexlity.doctree | Bin .../reference-dsl-control-structures.doctree | Bin .../doctrees/reference-dsl-errors.doctree | Bin .../reference-dsl-filter-statements.doctree | Bin .../doctrees/reference-dsl-operators.doctree | Bin .../reference-dsl-output-statements.doctree | Bin .../doctrees/reference-dsl-overview.doctree | Bin .../doctrees/reference-dsl-syntax.doctree | Bin .../_build/doctrees/reference-dsl-tbf.doctree | Bin .../reference-dsl-unset-statements.doctree | Bin ...ference-dsl-user-defined-functions.doctree | Bin .../doctrees/reference-dsl-variables.doctree | Bin .../_build/doctrees/reference-dsl.doctree | Bin .../reference-main-arithmetic.doctree | Bin .../reference-main-auxiliary-commands.doctree | Bin .../reference-main-data-types.doctree | Bin .../doctrees/reference-main-env-vars.doctree | Bin .../reference-main-io-options.doctree | Bin .../doctrees/reference-main-null-data.doctree | Bin .../reference-main-online-help.doctree | Bin .../doctrees/reference-main-overview.doctree | Bin ...reference-main-regular-expressions.doctree | Bin .../reference-main-then-chaining.doctree | Bin .../_build/doctrees/reference-verbs.doctree | Bin .../docs/_build/doctrees/reference.doctree | Bin .../docs/_build/doctrees/release-docs.doctree | Bin .../docs/_build/doctrees/repl.doctree | Bin .../_build/doctrees/shapes-of-data.doctree | Bin .../_build/doctrees/shell-commands.doctree | Bin .../special-symbols-and-formatting.doctree | Bin .../docs/_build/doctrees/sql-examples.doctree | Bin .../doctrees/statistics-examples.doctree | Bin .../_build/doctrees/then-chaining.doctree | Bin .../doctrees/two-pass-algorithms.doctree | Bin .../docs/_build/doctrees/why.doctree | Bin {docs6b => docs6}/docs/_build/html/.buildinfo | 0 .../docs => docs6/docs/_build/html}/10-1.sh | 0 .../docs => docs6/docs/_build/html}/10-2.sh | 0 {docs6b => docs6}/docs/_build/html/10min.html | 0 .../_build/html/_images}/colorization.png | Bin .../_build/html/_images}/colorization2.png | Bin .../_build/html/_images}/cover-combined.png | Bin .../_build/html/_images}/linreg-example.jpg | Bin .../_build/html/_images}/mand.png | Bin .../html/_images}/miller-msys-complex.png | Bin .../_build/html/_images}/miller-msys.png | Bin .../miller-windows-complex-workaround.png | Bin .../html/_images}/miller-windows-complex.png | Bin .../miller-windows-triple-double-quote.png | Bin .../_build/html/_images}/miller-windows.png | Bin .../{pix => docs/_build/html/_images}/omd.png | Bin .../docs/_build/html/_sources/10min.rst.txt | 0 .../docs/_build/html/_sources/build.rst.txt | 0 .../_build/html/_sources/community.rst.txt | 0 .../docs/_build/html/_sources/contact.rst.txt | 0 .../_build/html/_sources/contributing.rst.txt | 0 .../_build/html/_sources/cookbook.rst.txt | 0 .../_build/html/_sources/cookbook2.rst.txt | 0 .../_build/html/_sources/cookbook3.rst.txt | 0 .../_build/html/_sources/cookbook4.rst.txt | 0 .../csv-with-and-without-headers.rst.txt | 0 .../html/_sources/customization.rst.txt | 0 .../_sources/data-cleaning-examples.rst.txt | 0 .../_sources/data-diving-examples.rst.txt | 0 .../html/_sources/data-examples.rst.txt | 0 .../_build/html/_sources/data-sharing.rst.txt | 0 .../html/_sources/dates-and-times.rst.txt | 0 .../html/_sources/dkvp-examples.rst.txt | 0 .../_build/html/_sources/etymology.rst.txt | 0 .../_sources/ex-fields-not-selected.rst.txt | 0 .../html/_sources/ex-no-output-at-all.rst.txt | 0 .../docs/_build/html/_sources/faq.rst.txt | 0 .../html/_sources/feature-comparison.rst.txt | 0 .../_build/html/_sources/features.rst.txt | 0 .../_build/html/_sources/file-formats.rst.txt | 0 .../docs/_build/html/_sources/foo.rst.txt | 0 .../html/_sources/getting-started.rst.txt | 0 .../docs/_build/html/_sources/index.rst.txt | 0 .../docs/_build/html/_sources/install.rst.txt | 0 .../_build/html/_sources/installation.rst.txt | 0 .../_sources/internationalization.rst.txt | 0 .../_build/html/_sources/introduction.rst.txt | 0 .../docs/_build/html/_sources/joins.rst.txt | 0 .../html/_sources/keystroke-savers.rst.txt | 0 .../_sources/log-processing-examples.rst.txt | 0 .../docs/_build/html/_sources/manpage.rst.txt | 0 .../html/_sources/miller-by-example.rst.txt | 0 .../html/_sources/miller-on-windows.rst.txt | 0 .../html/_sources/misc-examples.rst.txt | 0 .../html/_sources/new-in-miller-6.rst.txt | 0 .../_build/html/_sources/old-10min.rst.txt | 0 .../_sources/operating-on-all-fields.rst.txt | 0 .../_build/html/_sources/originality.rst.txt | 0 .../html/_sources/output-colorization.rst.txt | 0 .../_build/html/_sources/performance.rst.txt | 0 .../_sources/programming-examples.rst.txt | 0 .../_sources/programming-language.rst.txt | 0 .../html/_sources/quick-examples.rst.txt | 0 .../_sources/randomizing-examples.rst.txt | 0 .../_sources/record-heterogeneity.rst.txt | 0 .../_sources/reference-dsl-arrays.rst.txt | 0 .../reference-dsl-builtin-functions.rst.txt | 0 .../_sources/reference-dsl-complexity.rst.txt | 0 .../reference-dsl-complexlity.rst.txt | 0 .../reference-dsl-control-structures.rst.txt | 0 .../_sources/reference-dsl-errors.rst.txt | 0 .../reference-dsl-filter-statements.rst.txt | 0 .../_sources/reference-dsl-operators.rst.txt | 0 .../reference-dsl-output-statements.rst.txt | 0 .../_sources/reference-dsl-overview.rst.txt | 0 .../_sources/reference-dsl-syntax.rst.txt | 0 .../html/_sources/reference-dsl-tbf.rst.txt | 0 .../reference-dsl-unset-statements.rst.txt | 0 ...ference-dsl-user-defined-functions.rst.txt | 0 .../_sources/reference-dsl-variables.rst.txt | 0 .../html/_sources/reference-dsl.rst.txt | 0 .../reference-main-arithmetic.rst.txt | 0 .../reference-main-auxiliary-commands.rst.txt | 0 .../reference-main-data-types.rst.txt | 0 .../_sources/reference-main-env-vars.rst.txt | 0 .../reference-main-io-options.rst.txt | 0 .../_sources/reference-main-null-data.rst.txt | 0 .../reference-main-online-help.rst.txt | 0 .../_sources/reference-main-overview.rst.txt | 0 ...reference-main-regular-expressions.rst.txt | 0 .../reference-main-then-chaining.rst.txt | 0 .../html/_sources/reference-verbs.rst.txt | 0 .../_build/html/_sources/reference.rst.txt | 0 .../_build/html/_sources/release-docs.rst.txt | 0 .../docs/_build/html/_sources/repl.rst.txt | 0 .../html/_sources/shapes-of-data.rst.txt | 0 .../html/_sources/shell-commands.rst.txt | 0 .../special-symbols-and-formatting.rst.txt | 0 .../_build/html/_sources/sql-examples.rst.txt | 0 .../html/_sources/statistics-examples.rst.txt | 0 .../html/_sources/then-chaining.rst.txt | 0 .../html/_sources/two-pass-algorithms.rst.txt | 0 .../docs/_build/html/_sources/why.rst.txt | 0 .../{ => docs/_build/html}/_static/basic.css | 0 .../_build/html}/_static/classic.css | 0 .../docs/_build/html/_static/darkmetal.png | Bin .../docs/_build/html/_static/doctools.js | 0 .../html/_static/documentation_options.js | 0 .../docs/_build/html/_static/file.png | Bin .../docs/_build/html/_static/headerbg.png | Bin .../docs/_build/html/_static/jquery-3.5.1.js | 0 .../docs/_build/html/_static/jquery.js | 0 .../docs/_build/html/_static/language_data.js | 0 .../docs/_build/html/_static/logo.png | Bin .../docs/_build/html/_static/metal.png | Bin .../docs/_build/html/_static/minus.png | Bin docs6/{ => docs/_build/html}/_static/mlr.jpg | Bin .../docs/_build/html/_static/navigation.png | Bin .../docs/_build/html/_static/plus.png | Bin .../docs/_build/html/_static/print.css | 0 .../_build/html}/_static/pygments.css | 0 .../_build/html}/_static/scrolls.css | 0 .../docs/_build/html/_static/searchtools.js | 0 .../docs/_build/html/_static/sidebar.js | 0 .../docs/_build/html/_static/theme_extras.js | 0 docs6/{ => docs/_build/html}/_static/top.png | Bin .../_build/html/_static/underscore-1.3.1.js | 0 .../docs/_build/html/_static/underscore.js | 0 .../docs/_build/html/_static/watermark.png | Bin .../_build/html/_static/watermark_blur.png | Bin {docs6b => docs6}/docs/_build/html/build.html | 0 docs6/{ => docs/_build/html}/circle.csv | 0 docs6/{ => docs/_build/html}/commas.csv | 0 .../docs/_build/html/community.html | 0 .../docs/_build/html/contact.html | 0 .../docs/_build/html/contributing.html | 0 .../docs/_build/html/cookbook.html | 0 .../docs/_build/html/cookbook2.html | 0 .../docs/_build/html/cookbook3.html | 0 .../docs/_build/html/cookbook4.html | 0 .../html/csv-with-and-without-headers.html | 0 .../docs/_build/html/customization.html | 0 .../_build/html/data-cleaning-examples.html | 0 .../_build/html/data-diving-examples.html | 0 .../docs/_build/html/data-examples.html | 0 .../docs/_build/html/data-sharing.html | 0 docs6/{ => docs/_build/html}/data/a.csv | 0 docs6/{ => docs/_build/html}/data/a.dkvp | 0 .../_build/html}/data/array-example.json | 0 docs6/{ => docs/_build/html}/data/b.csv | 0 docs6/{ => docs/_build/html}/data/b.dkvp | 0 .../_build/html}/data/begin-end-example-1.sh | 0 .../_build/html}/data/begin-end-example-2.sh | 0 .../_build/html}/data/begin-end-example-3.sh | 0 .../_build/html}/data/begin-end-example-4.sh | 0 .../_build/html}/data/begin-end-example-5.sh | 0 .../_build/html}/data/begin-end-example-6.sh | 0 .../_build/html}/data/begin-end-example-6a.sh | 0 .../_build/html}/data/begin-end-example-7.sh | 0 .../_build/html}/data/begin-end-example-7b.sh | 0 .../_build/html}/data/begin-end-example-8.sh | 0 docs6/{ => docs/_build/html}/data/budget.csv | 0 .../html}/data/bulk-rename-for-loop.mlr | 0 .../_build/html}/data/clean-whitespace.csv | 0 .../_build/html}/data/color-codes.csv | 0 .../_build/html}/data/color-names.csv | 0 .../_build/html}/data/colored-shapes.csv | 0 .../_build/html}/data/colored-shapes.dkvp | 0 docs6/{ => docs/_build/html}/data/colours.csv | 0 .../_build/html}/data/current_counters.csv | 0 .../{ => docs/_build/html}/data/currtemp.csv | 0 .../_build/html/data/delimiter-examples.txt | 0 .../_build/html}/data/dollar-sign.txt | 0 .../{ => docs/_build/html}/data/dynamic-nr.sh | 0 .../_build/html}/data/emit-lashed.sh | 0 .../_build/html}/data/english-words.txt | 0 .../_build/html}/data/factorial-example.sh | 0 .../_build/html}/data/fe-example-1.sh | 0 .../_build/html}/data/fe-example-2.sh | 0 .../_build/html}/data/fe-example-3.mlr | 0 .../_build/html}/data/fe-example-4.mlr | 0 .../_build/html}/data/feature-count.mlr | 0 .../{ => docs/_build/html}/data/features.json | 0 .../_build/html}/data/fibo-cached.sh | 0 .../_build/html}/data/fibo-uncached.sh | 0 .../{ => docs/_build/html}/data/fill-down.csv | 0 .../html}/data/filter-multiline-example.txt | 0 docs6/{ => docs/_build/html}/data/flins.csv | 0 docs6/{ => docs/_build/html}/data/flins.json | 0 .../html}/data/for-oosvar-example-0a.txt | 0 .../html}/data/for-oosvar-example-0b.sh | 0 .../html}/data/for-oosvar-example-0c.sh | 0 .../html}/data/for-oosvar-example-0d.sh | 0 .../html}/data/for-oosvar-example-0e.sh | 0 .../_build/html}/data/for-srec-example-1.sh | 0 .../_build/html}/data/for-srec-example-2.sh | 0 .../_build/html}/data/for-srec-example-3.sh | 0 .../_build/html}/data/for-srec-example.tbl | 0 .../_build/html}/data/fraction-example.csv | 0 .../{ => docs/_build/html}/data/full-reorg.sh | 0 .../_build/html}/data/headerless.csv | 0 .../{ => docs/_build/html}/data/het-bool.csv | 0 docs6/{ => docs/_build/html}/data/het.csv | 0 docs6/{ => docs/_build/html}/data/het.dkvp | 0 docs6/{ => docs/_build/html}/data/if-chain.sh | 0 docs6/{ => docs/_build/html}/data/inout.csv | 0 docs6/{ => docs/_build/html}/data/iqr1.sh | 0 docs6/{ => docs/_build/html}/data/iqrn.sh | 0 .../_build/html}/data/join-left-example.csv | 0 .../_build/html}/data/join-right-example.csv | 0 .../_build/html}/data/join-u-left.csv | 0 .../_build/html}/data/join-u-right.csv | 0 .../_build/html}/data/json-example-1.json | 0 .../_build/html}/data/json-example-2.json | 0 .../_build/html}/data/json-example-3.json | 0 .../html}/data/keyed-mean-with-oosvars.sh | 0 .../html}/data/keyed-min-max-with-oosvars.sh | 0 .../_build/html}/data/label-example.txt | 0 .../docs/_build/html/data}/linreg-example.jpg | Bin .../_build/html}/data/linreg-example.txt | 0 .../_build/html}/data/local-example-1.sh | 0 .../html}/data/map-literal-example-1.sh | 0 .../html}/data/map-literal-example-2.sh | 0 .../html}/data/map-literal-example-3.sh | 0 docs6/{ => docs/_build/html}/data/maxrows.mlr | 0 docs6/{ => docs/_build/html}/data/maxrows.tsv | 0 .../_build/html}/data/mean-with-oosvars.sh | 0 docs6/{ => docs/_build/html}/data/medium | 0 .../_build/html}/data/medium-squares | 0 .../_build/html}/data/miss-date-1.sh | 0 .../_build/html}/data/miss-date-2.sh | 0 .../{ => docs/_build/html}/data/miss-date.csv | 0 docs6/{ => docs/_build/html}/data/mkdat2 | 0 .../_build/html}/data/multicountdown.dat | 0 .../_build/html}/data/multicountdown.rb | 0 docs6/{ => docs/_build/html}/data/mydata.txt | 0 docs6/{ => docs/_build/html}/data/nested.tsv | 0 .../_build/html}/data/newline-example.txt | 0 .../_build/html}/data/ping-delta-example.txt | 0 .../_build/html}/data/previous-to-current.sh | 0 .../_build/html}/data/previous_counters.csv | 0 .../{ => docs/_build/html}/data/prevtemp.csv | 0 .../html}/data/put-gating-example-1.dkvp | 0 .../html}/data/put-gating-example-2.dkvp | 0 .../html}/data/put-multiline-example.txt | 0 .../{ => docs/_build/html}/data/question.dat | 0 .../_build/html}/data/ragged-csv-2.sh | 0 .../{ => docs/_build/html}/data/ragged-csv.sh | 0 docs6/{ => docs/_build/html}/data/ragged.csv | 0 .../_build/html}/data/rect-inner.txt | 0 .../_build/html}/data/rect-middle.txt | 0 .../_build/html}/data/rect-outer.txt | 0 docs6/{ => docs/_build/html}/data/rect.sh | 0 docs6/{ => docs/_build/html}/data/rect.txt | 0 .../_build/html}/data/regex-in-data.dat | 0 .../html}/data/remove-empty-columns.csv | 0 .../_build/html}/data/repeat-example.dat | 0 .../{ => docs/_build/html}/data/repeats.dkvp | 0 .../_build/html}/data/sample-example.txt | 0 docs6/{ => docs/_build/html}/data/sar.csv | 0 docs6/{ => docs/_build/html}/data/sar.mlr | 0 .../_build/html}/data/scan-example-1.tbl | 0 .../_build/html}/data/scan-example-2.tbl | 0 .../_build/html}/data/scope-example.dat | 0 .../_build/html}/data/scope-example.mlr | 0 .../{ => docs/_build/html}/data/self-join.csv | 0 .../_build/html}/data/semicolon-example.txt | 0 .../_build/html}/data/single-for-example-1.sh | 0 .../_build/html}/data/single-for-example-2.sh | 0 .../html}/data/single-quote-example.mlr | 0 docs6/{ => docs/_build/html}/data/small | 0 docs6/{ => docs/_build/html}/data/small.csv | 0 docs6/{ => docs/_build/html}/data/small2 | 0 .../{ => docs/_build/html}/data/sort-het.dkvp | 0 .../_build/html}/data/sort-missing.dkvp | 0 .../{ => docs/_build/html}/data/sort-null.dat | 0 .../html}/data/sort-within-records.json | 0 docs6/{ => docs/_build/html}/data/spaces.csv | 0 docs6/{ => docs/_build/html}/data/sparse.json | 0 .../_build/html}/data/subcommand-example.txt | 0 .../_build/html}/data/subr-example.sh | 0 .../html}/data/system-file-ojson-example.txt | 0 .../data/system-file-opprint-example.txt | 0 .../html}/data/system-file-oxtab-example.txt | 0 .../html}/data/then-chaining-performance.txt | 0 .../_build/html}/data/then-example.csv | 0 .../_build/html}/data/timing-example.txt | 0 .../_build/html}/data/trailing-commas.sh | 0 .../_build/html}/data/triple-for-example-1.sh | 0 .../_build/html}/data/triple-for-example-2.sh | 0 .../_build/html}/data/trivial-records.csv | 0 .../_build/html}/data/two-pass-percentage.sh | 0 .../html}/data/two-pass-record-numbers.sh | 0 .../_build/html}/data/type-decl-example.mlr | 0 .../_build/html}/data/unsparsify.mlr | 0 .../_build/html}/data/weighted-mean.sh | 0 .../_build/html}/data/while-example-1.sh | 0 .../_build/html}/data/while-example-2.sh | 0 .../docs/_build/html/dates-and-times.html | 0 docs6/{ => docs/_build/html}/dates.csv | 0 .../docs/_build/html/dkvp-examples.html | 0 .../docs/_build/html/etymology.html | 0 .../_build/html/ex-fields-not-selected.html | 0 .../docs/_build/html/ex-no-output-at-all.html | 0 docs6/{ => docs/_build/html}/example.csv | 0 docs6/{ => docs/_build/html}/expo-sample.sh | 0 {docs6b => docs6}/docs/_build/html/faq.html | 0 .../docs/_build/html/feature-comparison.html | 0 .../docs/_build/html/features.html | 0 .../docs/_build/html/file-formats.html | 0 {docs6b => docs6}/docs/_build/html/foo.html | 0 .../docs/_build/html/genindex.html | 0 .../docs/_build/html/getting-started.html | 0 {docs6b => docs6}/docs/_build/html/index.html | 0 .../docs/_build/html/install.html | 0 .../docs/_build/html/installation.html | 0 .../_build/html/internationalization.html | 0 .../docs/_build/html/introduction.html | 0 {docs6b => docs6}/docs/_build/html/joins.html | 0 .../docs/_build/html/keystroke-savers.html | 0 .../_build/html/log-processing-examples.html | 0 docs6/{ => docs/_build/html}/log.txt | 0 docs6/{ => docs/_build/html}/make.bat | 0 .../docs/_build/html/manpage.html | 0 docs6/{ => docs/_build/html}/manpage.txt | 0 .../docs/_build/html/miller-by-example.html | 0 .../docs/_build/html/miller-on-windows.html | 0 .../docs/_build/html/misc-examples.html | 0 .../_build/html}/multi-join/input.csv | 0 .../_build/html}/multi-join/name-lookup.csv | 0 .../_build/html}/multi-join/status-lookup.csv | 0 .../docs/_build/html/new-in-miller-6.html | 0 .../_build/html}/ngrams/gsl-2000.txt | 0 docs6/{ => docs/_build/html}/ngrams/mkv.mlr | 0 docs6/{ => docs/_build/html}/ngrams/mkv3.mlr | 0 docs6/{ => docs/_build/html}/ngrams/mkv4.mlr | 0 docs6/{ => docs/_build/html}/ngrams/mkv5.mlr | 0 docs6/{ => docs/_build/html}/ngrams/ng1 | 0 docs6/{ => docs/_build/html}/ngrams/ng1.mlr | 0 .../{ => docs/_build/html}/ngrams/ng1.mlr.txt | 0 docs6/{ => docs/_build/html}/ngrams/ng2 | 0 docs6/{ => docs/_build/html}/ngrams/ng2.mlr | 0 .../{ => docs/_build/html}/ngrams/ng2.mlr.txt | 0 docs6/{ => docs/_build/html}/ngrams/ng3 | 0 docs6/{ => docs/_build/html}/ngrams/ng3.mlr | 0 .../{ => docs/_build/html}/ngrams/ng3.mlr.txt | 0 docs6/{ => docs/_build/html}/ngrams/ng4 | 0 docs6/{ => docs/_build/html}/ngrams/ng4.mlr | 0 .../{ => docs/_build/html}/ngrams/ng4.mlr.txt | 0 docs6/{ => docs/_build/html}/ngrams/ng5 | 0 docs6/{ => docs/_build/html}/ngrams/ng5.mlr | 0 .../{ => docs/_build/html}/ngrams/ng5.mlr.txt | 0 .../{ => docs/_build/html}/ngrams/ngfuncs.mlr | 0 .../_build/html}/ngrams/ngfuncs.mlr.txt | 0 .../docs/_build/html/objects.inv | Bin .../docs/_build/html/old-10min.html | 0 .../_build/html}/oosvar-example-ewma.sh | 0 .../html}/oosvar-example-sum-grouped.sh | 0 .../_build/html}/oosvar-example-sum.sh | 0 .../_build/html/operating-on-all-fields.html | 0 .../docs/_build/html/originality.html | 0 .../docs/_build/html/output-colorization.html | 0 .../docs/_build/html/performance.html | 0 .../docs/_build/html/pix}/colorization.png | Bin .../_build/html}/pix/colorization.png.000 | Bin .../docs/_build/html/pix}/colorization2.png | Bin .../_build/html}/pix/colorization2.png.000 | Bin .../docs/_build/html/pix}/mand.png | Bin .../_build/html/pix}/miller-msys-complex.png | Bin .../docs/_build/html/pix}/miller-msys.png | Bin .../miller-windows-complex-workaround.png | Bin .../html/pix}/miller-windows-complex.png | Bin .../miller-windows-triple-double-quote.png | Bin .../docs/_build/html/pix}/miller-windows.png | Bin .../_build/html}/pix/mlr-doc-sepia.jpg | Bin docs6/{ => docs/_build/html}/pix/mlr.jpg | Bin .../docs/_build/html/pix}/omd.png | Bin .../_build/html}/pix/sepia-overlay.jpg | Bin .../_build/html}/polyglot-dkvp-io/dkvp_io.py | 0 .../_build/html}/polyglot-dkvp-io/dkvp_io.rb | 0 .../_build/html}/polyglot-dkvp-io/example.py | 0 .../_build/html}/polyglot-dkvp-io/example.rb | 0 .../_build/html/programming-examples.html | 0 .../_build/html/programming-language.html | 0 .../{ => docs/_build/html}/programs/mand.mlr | 0 docs6/{ => docs/_build/html}/programs/mand.sh | 0 .../{ => docs/_build/html}/programs/sieve.mlr | 0 .../docs/_build/html/quick-examples.html | 0 .../_build/html/randomizing-examples.html | 0 .../_build/html/record-heterogeneity.html | 0 .../_build/html/reference-dsl-arrays.html | 0 .../html/reference-dsl-builtin-functions.html | 0 .../_build/html/reference-dsl-complexity.html | 0 .../html/reference-dsl-complexlity.html | 0 .../reference-dsl-control-structures.html | 0 .../_build/html/reference-dsl-errors.html | 0 .../html/reference-dsl-filter-statements.html | 0 .../_build/html/reference-dsl-operators.html | 0 .../html/reference-dsl-output-statements.html | 0 .../_build/html/reference-dsl-overview.html | 0 .../_build/html/reference-dsl-syntax.html | 0 .../docs/_build/html/reference-dsl-tbf.html | 0 .../html/reference-dsl-unset-statements.html | 0 .../reference-dsl-user-defined-functions.html | 0 .../_build/html/reference-dsl-variables.html | 0 .../docs/_build/html/reference-dsl.html | 0 .../html/reference-main-arithmetic.html | 0 .../reference-main-auxiliary-commands.html | 0 .../html/reference-main-data-types.html | 0 .../_build/html/reference-main-env-vars.html | 0 .../html/reference-main-io-options.html | 0 .../_build/html/reference-main-null-data.html | 0 .../html/reference-main-online-help.html | 0 .../_build/html/reference-main-overview.html | 0 .../reference-main-regular-expressions.html | 0 .../html/reference-main-then-chaining.html | 0 .../docs/_build/html/reference-verbs.html | 0 .../docs/_build/html/reference.html | 0 .../docs/_build/html/release-docs.html | 0 {docs6b => docs6}/docs/_build/html/repl.html | 0 docs6/{ => docs/_build/html}/sample_mlrrc | 0 .../docs/_build/html/search.html | 0 .../docs/_build/html/searchindex.js | 0 .../docs/_build/html/shapes-of-data.html | 0 .../docs/_build/html/shell-commands.html | 0 .../html/special-symbols-and-formatting.html | 0 .../docs/_build/html/sql-examples.html | 0 docs6/{ => docs/_build/html}/square.csv | 0 .../docs/_build/html/statistics-examples.html | 0 .../docs/_build/html/then-chaining.html | 0 docs6/{ => docs/_build/html}/triangle.csv | 0 .../docs/_build/html/two-pass-algorithms.html | 0 docs6/{ => docs/_build/html}/variance.mlr | 0 .../_build/html}/verb-example-ewma.sh | 0 {docs6b => docs6}/docs/_build/html/why.html | 0 .../html => docs6/docs}/_static/basic.css | 0 .../html => docs6/docs}/_static/classic.css | 0 .../html => docs6/docs}/_static/mlr.jpg | Bin .../html => docs6/docs}/_static/pygments.css | 0 .../html => docs6/docs}/_static/scrolls.css | 0 .../html => docs6/docs}/_static/top.png | Bin docs6/{ => docs}/absent-example.json | 0 {docs6b => docs6}/docs/build-one | 0 {docs6b => docs6}/docs/build.md | 0 {docs6b => docs6}/docs/build.md.in | 0 .../_build/html => docs6/docs}/circle.csv | 0 .../_build/html => docs6/docs}/commas.csv | 0 {docs6b => docs6}/docs/community.md | 0 {docs6b => docs6}/docs/community.md.in | 0 docs6/{ => docs}/context-example.mlr | 0 {docs6b => docs6}/docs/contributing.md | 0 {docs6b => docs6}/docs/contributing.md.in | 0 docs6/{ => docs}/coverart/cover-cat.png | Bin .../docs/coverart}/cover-combined.png | Bin .../coverart/cover-filter-to-json.png | Bin .../coverart/cover-sort-to-pprint.png | Bin docs6/{ => docs}/coverart/coverart.key | Bin .../docs/csv-with-and-without-headers.md | 0 .../docs/csv-with-and-without-headers.md.in | 0 {docs6b => docs6}/docs/customization.md | 0 {docs6b => docs6}/docs/customization.md.in | 0 .../docs/data-cleaning-examples.md | 0 .../docs/data-cleaning-examples.md.in | 0 .../docs/data-diving-examples.md | 0 .../docs/data-diving-examples.md.in | 0 .../_build/html => docs6/docs}/data/a.csv | 0 .../_build/html => docs6/docs}/data/a.dkvp | 0 .../docs}/data/array-example.json | 0 .../_build/html => docs6/docs}/data/b.csv | 0 .../_build/html => docs6/docs}/data/b.dkvp | 0 .../docs/data/begin-end-example-1.sh | 0 .../docs/data/begin-end-example-2.sh | 0 .../docs/data/begin-end-example-3.sh | 0 .../docs/data/begin-end-example-4.sh | 0 .../docs/data/begin-end-example-5.sh | 0 .../docs/data/begin-end-example-6.sh | 0 .../docs}/data/begin-end-example-6a.sh | 0 .../docs/data/begin-end-example-7.sh | 0 .../docs}/data/begin-end-example-7b.sh | 0 .../docs}/data/begin-end-example-8.sh | 0 .../html => docs6/docs}/data/budget.csv | 0 .../docs}/data/bulk-rename-for-loop.mlr | 0 .../docs}/data/clean-whitespace.csv | 0 .../html => docs6/docs}/data/color-codes.csv | 0 .../html => docs6/docs}/data/color-names.csv | 0 .../docs}/data/colored-shapes.csv | 0 .../docs}/data/colored-shapes.dkvp | 0 .../html => docs6/docs}/data/colours.csv | 0 .../docs}/data/current_counters.csv | 0 .../html => docs6/docs}/data/currtemp.csv | 0 .../html => docs6/docs}/data/dollar-sign.txt | 0 .../html => docs6/docs}/data/dynamic-nr.sh | 0 .../html => docs6/docs}/data/emit-lashed.sh | 0 .../docs}/data/english-words.txt | 0 .../docs}/data/factorial-example.sh | 0 .../html => docs6/docs}/data/fe-example-1.sh | 0 .../html => docs6/docs}/data/fe-example-2.sh | 0 .../html => docs6/docs}/data/fe-example-3.mlr | 0 .../html => docs6/docs}/data/fe-example-4.mlr | 0 .../docs}/data/feature-count.mlr | 0 .../html => docs6/docs}/data/features.json | 0 .../html => docs6/docs}/data/fibo-cached.sh | 0 .../html => docs6/docs}/data/fibo-uncached.sh | 0 .../html => docs6/docs}/data/fill-down.csv | 0 .../docs}/data/filter-multiline-example.txt | 0 .../_build/html => docs6/docs}/data/flins.csv | 0 .../html => docs6/docs}/data/flins.json | 0 .../docs}/data/for-oosvar-example-0a.txt | 0 .../docs}/data/for-oosvar-example-0b.sh | 0 .../docs}/data/for-oosvar-example-0c.sh | 0 .../docs}/data/for-oosvar-example-0d.sh | 0 .../docs}/data/for-oosvar-example-0e.sh | 0 .../docs}/data/for-srec-example-1.sh | 0 .../docs}/data/for-srec-example-2.sh | 0 .../docs}/data/for-srec-example-3.sh | 0 .../docs}/data/for-srec-example.tbl | 0 .../docs}/data/fraction-example.csv | 0 .../html => docs6/docs}/data/full-reorg.sh | 0 .../html => docs6/docs}/data/headerless.csv | 0 .../html => docs6/docs}/data/het-bool.csv | 0 .../_build/html => docs6/docs}/data/het.csv | 0 .../_build/html => docs6/docs}/data/het.dkvp | 0 .../html => docs6/docs}/data/if-chain.sh | 0 .../_build/html => docs6/docs}/data/inout.csv | 0 .../_build/html => docs6/docs}/data/iqr1.sh | 0 .../_build/html => docs6/docs}/data/iqrn.sh | 0 .../docs}/data/join-left-example.csv | 0 .../docs}/data/join-right-example.csv | 0 .../html => docs6/docs}/data/join-u-left.csv | 0 .../html => docs6/docs}/data/join-u-right.csv | 0 .../docs}/data/json-example-1.json | 0 .../docs}/data/json-example-2.json | 0 .../docs}/data/json-example-3.json | 0 .../docs}/data/keyed-mean-with-oosvars.sh | 0 .../docs}/data/keyed-min-max-with-oosvars.sh | 0 .../docs}/data/label-example.txt | 0 .../docs}/data/linreg-example.jpg | Bin .../docs}/data/linreg-example.txt | 0 .../docs}/data/local-example-1.sh | 0 .../docs}/data/map-literal-example-1.sh | 0 .../docs}/data/map-literal-example-2.sh | 0 .../docs}/data/map-literal-example-3.sh | 0 .../html => docs6/docs}/data/maxrows.mlr | 0 .../html => docs6/docs}/data/maxrows.tsv | 0 .../docs}/data/mean-with-oosvars.sh | 0 .../_build/html => docs6/docs}/data/medium | 0 .../html => docs6/docs}/data/medium-squares | 0 .../html => docs6/docs}/data/miss-date-1.sh | 0 .../html => docs6/docs}/data/miss-date-2.sh | 0 .../html => docs6/docs}/data/miss-date.csv | 0 .../_build/html => docs6/docs}/data/mkdat2 | 0 .../docs}/data/multicountdown.dat | 0 .../docs}/data/multicountdown.rb | 0 .../html => docs6/docs}/data/mydata.txt | 0 .../html => docs6/docs}/data/nested.tsv | 0 .../docs}/data/newline-example.txt | 0 .../docs}/data/ping-delta-example.txt | 0 .../docs}/data/previous-to-current.sh | 0 .../docs}/data/previous_counters.csv | 0 .../html => docs6/docs}/data/prevtemp.csv | 0 .../docs}/data/put-gating-example-1.dkvp | 0 .../docs}/data/put-gating-example-2.dkvp | 0 .../docs}/data/put-multiline-example.txt | 0 .../html => docs6/docs}/data/question.dat | 0 .../html => docs6/docs}/data/ragged-csv-2.sh | 0 .../html => docs6/docs}/data/ragged-csv.sh | 0 .../html => docs6/docs}/data/ragged.csv | 0 .../html => docs6/docs}/data/rect-inner.txt | 0 .../html => docs6/docs}/data/rect-middle.txt | 0 .../html => docs6/docs}/data/rect-outer.txt | 0 .../_build/html => docs6/docs}/data/rect.sh | 0 .../_build/html => docs6/docs}/data/rect.txt | 0 .../docs}/data/regex-in-data.dat | 0 .../docs}/data/remove-empty-columns.csv | 0 .../docs}/data/repeat-example.dat | 0 .../html => docs6/docs}/data/repeats.dkvp | 0 .../docs}/data/sample-example.txt | 0 .../_build/html => docs6/docs}/data/sar.csv | 0 {docs6b => docs6}/docs/data/sar.mlr | 0 .../docs}/data/scan-example-1.tbl | 0 .../docs}/data/scan-example-2.tbl | 0 .../docs}/data/scope-example.dat | 0 .../docs}/data/scope-example.mlr | 0 .../html => docs6/docs}/data/self-join.csv | 0 .../docs}/data/semicolon-example.txt | 0 .../docs}/data/single-for-example-1.sh | 0 .../docs}/data/single-for-example-2.sh | 0 .../docs}/data/single-quote-example.mlr | 0 .../_build/html => docs6/docs}/data/small | 0 .../_build/html => docs6/docs}/data/small.csv | 0 .../_build/html => docs6/docs}/data/small2 | 0 .../html => docs6/docs}/data/sort-het.dkvp | 0 .../docs}/data/sort-missing.dkvp | 0 .../html => docs6/docs}/data/sort-null.dat | 0 .../docs}/data/sort-within-records.json | 0 .../html => docs6/docs}/data/spaces.csv | 0 .../html => docs6/docs}/data/sparse.json | 0 .../docs}/data/subcommand-example.txt | 0 .../html => docs6/docs}/data/subr-example.sh | 0 .../docs}/data/system-file-ojson-example.txt | 0 .../data/system-file-opprint-example.txt | 0 .../docs}/data/system-file-oxtab-example.txt | 0 .../docs}/data/then-chaining-performance.txt | 0 .../html => docs6/docs}/data/then-example.csv | 0 .../docs}/data/timing-example.txt | 0 .../docs}/data/trailing-commas.sh | 0 .../docs}/data/triple-for-example-1.sh | 0 .../docs}/data/triple-for-example-2.sh | 0 .../docs}/data/trivial-records.csv | 0 .../docs}/data/two-pass-percentage.sh | 0 .../docs}/data/two-pass-record-numbers.sh | 0 .../docs}/data/type-decl-example.mlr | 0 .../html => docs6/docs}/data/unsparsify.mlr | 0 .../html => docs6/docs}/data/weighted-mean.sh | 0 .../docs}/data/while-example-1.sh | 0 .../docs}/data/while-example-2.sh | 0 {docs6b => docs6}/docs/dates-and-times.md | 0 {docs6b => docs6}/docs/dates-and-times.md.in | 0 .../docs/_build/html => docs6/docs}/dates.csv | 0 {docs6b => docs6}/docs/dkvp-examples.md | 0 {docs6b => docs6}/docs/dkvp-examples.md.in | 0 {docs6b => docs6}/docs/doc-reorg.txt | 0 docs6/{ => docs}/dsl-example-multiline.sh | 0 docs6/{ => docs}/dsl-example.mlr | 0 {docs6b => docs6}/docs/etymology.md | 0 {docs6b => docs6}/docs/etymology.md.in | 0 .../_build/html => docs6/docs}/example.csv | 0 {docs6b => docs6}/docs/expo-sample.sh | 0 {docs6b => docs6}/docs/extra.css | 0 docs6/{ => docs}/factorial-example.mlr | 0 {docs6b => docs6}/docs/feature-comparison.md | 0 .../docs/feature-comparison.md.in | 0 {docs6b => docs6}/docs/features.md | 0 {docs6b => docs6}/docs/features.md.in | 0 {docs6b => docs6}/docs/file-formats.md | 0 {docs6b => docs6}/docs/file-formats.md.in | 0 docs6/{ => docs}/for-example.mlr | 0 {docs6b => docs6}/docs/genmd-filter | 0 {docs6b => docs6}/docs/genmds | 0 docs6/{ => docs}/h1foo | 0 docs6/{ => docs}/h2foo | 0 docs6/{ => docs}/h3foo | 0 docs6/{ => docs}/if-example.mlr | 0 {docs6b => docs6}/docs/index.md | 0 {docs6b => docs6}/docs/index.md.in | 0 {docs6b => docs6}/docs/installation.md | 0 {docs6b => docs6}/docs/installation.md.in | 0 .../docs/internationalization.md | 0 .../docs/internationalization.md.in | 0 {docs6b => docs6}/docs/joins.md | 0 {docs6b => docs6}/docs/joins.md.in | 0 {docs6b => docs6}/docs/keystroke-savers.md | 0 {docs6b => docs6}/docs/keystroke-savers.md.in | 0 docs6/{ => docs}/link.txt | 0 .../docs/log-processing-examples.md | 0 .../docs/log-processing-examples.md.in | 0 .../docs/_build/html => docs6/docs}/log.txt | 0 .../docs/_build/html => docs6/docs}/make.bat | 0 {docs6b => docs6}/docs/manpage.md | 0 {docs6b => docs6}/docs/manpage.md.in | 0 .../_build/html => docs6/docs}/manpage.txt | 0 {docs6b => docs6}/docs/miller-on-windows.md | 0 .../docs/miller-on-windows.md.in | 0 {docs6b => docs6}/docs/misc-examples.md | 0 {docs6b => docs6}/docs/misc-examples.md.in | 0 {docs6b => docs6}/docs/mk-func-h2s.sh | 0 docs6/{ => docs}/mk-func-table.rb | 0 docs6/{ => docs}/mlr.1 | 0 {docs6b => docs6}/docs/morph | 0 {docs6b => docs6}/docs/morphs | 0 .../html => docs6/docs}/multi-join/input.csv | 0 .../docs}/multi-join/name-lookup.csv | 0 .../docs}/multi-join/status-lookup.csv | 0 {docs6b => docs6}/docs/new-in-miller-6.md | 0 {docs6b => docs6}/docs/new-in-miller-6.md.in | 0 .../html => docs6/docs}/ngrams/gsl-2000.txt | 0 .../_build/html => docs6/docs}/ngrams/mkv.mlr | 0 .../html => docs6/docs}/ngrams/mkv3.mlr | 0 .../html => docs6/docs}/ngrams/mkv4.mlr | 0 .../html => docs6/docs}/ngrams/mkv5.mlr | 0 .../_build/html => docs6/docs}/ngrams/ng1 | 0 .../_build/html => docs6/docs}/ngrams/ng1.mlr | 0 .../html => docs6/docs}/ngrams/ng1.mlr.txt | 0 .../_build/html => docs6/docs}/ngrams/ng2 | 0 .../_build/html => docs6/docs}/ngrams/ng2.mlr | 0 .../html => docs6/docs}/ngrams/ng2.mlr.txt | 0 .../_build/html => docs6/docs}/ngrams/ng3 | 0 .../_build/html => docs6/docs}/ngrams/ng3.mlr | 0 .../html => docs6/docs}/ngrams/ng3.mlr.txt | 0 .../_build/html => docs6/docs}/ngrams/ng4 | 0 .../_build/html => docs6/docs}/ngrams/ng4.mlr | 0 .../html => docs6/docs}/ngrams/ng4.mlr.txt | 0 .../_build/html => docs6/docs}/ngrams/ng5 | 0 .../_build/html => docs6/docs}/ngrams/ng5.mlr | 0 .../html => docs6/docs}/ngrams/ng5.mlr.txt | 0 .../html => docs6/docs}/ngrams/ngfuncs.mlr | 0 .../docs}/ngrams/ngfuncs.mlr.txt | 0 .../docs}/oosvar-example-ewma.sh | 0 .../docs}/oosvar-example-sum-grouped.sh | 0 .../html => docs6/docs}/oosvar-example-sum.sh | 0 .../docs/operating-on-all-fields.md | 0 .../docs/operating-on-all-fields.md.in | 0 {docs6b => docs6}/docs/originality.md | 0 {docs6b => docs6}/docs/originality.md.in | 0 {docs6b => docs6}/docs/output-colorization.md | 0 .../docs/output-colorization.md.in | 0 {docs6b => docs6}/docs/performance.md | 0 {docs6b => docs6}/docs/performance.md.in | 0 .../html => docs6/docs}/pix/colorization.png | Bin .../docs}/pix/colorization.png.000 | Bin .../html => docs6/docs}/pix/colorization2.png | Bin .../docs}/pix/colorization2.png.000 | Bin .../_build/html => docs6/docs}/pix/mand.png | Bin .../docs}/pix/miller-msys-complex.png | Bin .../html => docs6/docs}/pix/miller-msys.png | Bin .../pix/miller-windows-complex-workaround.png | Bin .../docs}/pix/miller-windows-complex.png | Bin .../miller-windows-triple-double-quote.png | Bin .../docs}/pix/miller-windows.png | Bin .../html => docs6/docs}/pix/mlr-doc-sepia.jpg | Bin .../_build/html => docs6/docs}/pix/mlr.jpg | Bin .../_build/html => docs6/docs}/pix/omd.png | Bin .../html => docs6/docs}/pix/sepia-overlay.jpg | Bin .../docs}/polyglot-dkvp-io/dkvp_io.py | 0 .../docs}/polyglot-dkvp-io/dkvp_io.rb | 0 .../docs}/polyglot-dkvp-io/example.py | 0 .../docs}/polyglot-dkvp-io/example.rb | 0 .../docs/programming-examples.md | 0 .../docs/programming-examples.md.in | 0 .../docs/programming-language.md | 0 .../docs/programming-language.md.in | 0 .../html => docs6/docs}/programs/mand.mlr | 0 .../html => docs6/docs}/programs/mand.sh | 0 .../html => docs6/docs}/programs/sieve.mlr | 0 .../docs/randomizing-examples.md | 0 .../docs/randomizing-examples.md.in | 0 .../docs/record-heterogeneity.md | 0 .../docs/record-heterogeneity.md.in | 0 .../docs/reference-dsl-arrays.md | 0 .../docs/reference-dsl-arrays.md.in | 0 .../docs/reference-dsl-builtin-functions.md | 0 .../reference-dsl-builtin-functions.md.in | 0 .../docs/reference-dsl-complexity.md | 0 .../docs/reference-dsl-complexity.md.in | 0 .../docs/reference-dsl-control-structures.md | 9 +- .../reference-dsl-control-structures.md.in | 0 .../docs/reference-dsl-errors.md | 0 .../docs/reference-dsl-errors.md.in | 0 .../docs/reference-dsl-filter-statements.md | 0 .../reference-dsl-filter-statements.md.in | 0 .../docs/reference-dsl-operators.md | 0 .../docs/reference-dsl-operators.md.in | 0 .../docs/reference-dsl-output-statements.md | 0 .../reference-dsl-output-statements.md.in | 0 .../docs/reference-dsl-syntax.md | 0 .../docs/reference-dsl-syntax.md.in | 0 .../docs/reference-dsl-unset-statements.md | 0 .../docs/reference-dsl-unset-statements.md.in | 0 .../reference-dsl-user-defined-functions.md | 0 ...reference-dsl-user-defined-functions.md.in | 0 .../docs/reference-dsl-variables.md | 0 .../docs/reference-dsl-variables.md.in | 0 {docs6b => docs6}/docs/reference-dsl.md | 0 {docs6b => docs6}/docs/reference-dsl.md.in | 0 .../docs/reference-main-arithmetic.md | 0 .../docs/reference-main-arithmetic.md.in | 0 .../docs/reference-main-auxiliary-commands.md | 0 .../reference-main-auxiliary-commands.md.in | 0 .../docs/reference-main-data-types.md | 0 .../docs/reference-main-data-types.md.in | 0 .../docs/reference-main-env-vars.md | 0 .../docs/reference-main-env-vars.md.in | 0 .../docs/reference-main-io-options.md | 0 .../docs/reference-main-io-options.md.in | 0 .../docs/reference-main-null-data.md | 0 .../docs/reference-main-null-data.md.in | 0 .../docs/reference-main-online-help.md | 0 .../docs/reference-main-online-help.md.in | 0 .../docs/reference-main-overview.md | 0 .../docs/reference-main-overview.md.in | 0 .../reference-main-regular-expressions.md | 0 .../reference-main-regular-expressions.md.in | 0 .../docs/reference-main-then-chaining.md | 0 .../docs/reference-main-then-chaining.md.in | 0 {docs6b => docs6}/docs/reference-verbs.md | 0 {docs6b => docs6}/docs/reference-verbs.md.in | 0 {docs6b => docs6}/docs/release-docs.md | 0 {docs6b => docs6}/docs/release-docs.md.in | 0 {docs6b => docs6}/docs/repl.md | 0 {docs6b => docs6}/docs/repl.md.in | 0 .../_build/html => docs6/docs}/sample_mlrrc | 0 {docs6b => docs6}/docs/shapes-of-data.md | 0 {docs6b => docs6}/docs/shapes-of-data.md.in | 0 {docs6b => docs6}/docs/shell-commands.md | 0 {docs6b => docs6}/docs/shell-commands.md.in | 0 .../docs/special-symbols-and-formatting.md | 0 .../docs/special-symbols-and-formatting.md.in | 0 {docs => docs6/docs}/sphinx-hack/data | 0 docs6/{ => docs}/sphinx-hack/multi-join | 0 docs6/{ => docs}/sphinx-hack/ngrams | 0 docs6/{ => docs}/sphinx-hack/pix | 0 docs6/{ => docs}/sphinx-hack/polyglot-dkvp-io | 0 {docs => docs6/docs}/sphinx-hack/programs | 0 {docs6b => docs6}/docs/sql-examples.md | 0 {docs6b => docs6}/docs/sql-examples.md.in | 0 .../_build/html => docs6/docs}/square.csv | 0 {docs6b => docs6}/docs/statistics-examples.md | 0 .../docs/statistics-examples.md.in | 0 {docs6b => docs6}/docs/then-chaining.md | 0 {docs6b => docs6}/docs/then-chaining.md.in | 0 .../_build/html => docs6/docs}/triangle.csv | 0 {docs6b => docs6}/docs/two-pass-algorithms.md | 0 .../docs/two-pass-algorithms.md.in | 0 .../_build/html => docs6/docs}/variance.mlr | 0 .../html => docs6/docs}/verb-example-ewma.sh | 0 {docs6b => docs6}/docs/why.md | 0 {docs6b => docs6}/docs/why.md.in | 0 {docs6b => docs6}/docs/x | 0 docs6/etymology.rst | 9 - docs6/etymology.rst.in | 6 - docs6/feature-comparison.rst | 71 - docs6/feature-comparison.rst.in | 51 - docs6/features.rst | 43 - docs6/features.rst.in | 40 - docs6/file-formats.rst | 660 - docs6/file-formats.rst.in | 332 - docs6/genrst-filter | 164 - docs6/genrsts | 21 - docs6/index.rst | 108 - docs6/installation.rst | 65 - docs6/installation.rst.in | 56 - docs6/internationalization.rst | 15 - docs6/internationalization.rst.in | 12 - docs6/introduction.rst | 24 - docs6/introduction.rst.in | 21 - docs6/joins.rst | 180 - docs6/joins.rst.in | 89 - docs6/keystroke-savers.rst | 78 - docs6/keystroke-savers.rst.in | 43 - docs6/log-processing-examples.rst | 217 - docs6/log-processing-examples.rst.in | 50 - docs6/manpage.rst | 2381 - docs6/manpage.rst.in | 6 - docs6/miller-on-windows.rst | 48 - docs6/miller-on-windows.rst.in | 45 - docs6/misc-examples.rst | 344 - docs6/misc-examples.rst.in | 224 - docs6/mk-func-h2s.sh | 115 - {docs6b => docs6}/mkdocs.yml | 0 docs6/morph | 19 - docs6/morphs | 13 - docs6/new-in-miller-6.rst | 141 - docs6/new-in-miller-6.rst.in | 129 - docs6/operating-on-all-fields.rst | 128 - docs6/operating-on-all-fields.rst.in | 59 - docs6/originality.rst | 43 - docs6/originality.rst.in | 40 - docs6/output-colorization.rst | 56 - docs6/output-colorization.rst.in | 53 - docs6/performance.rst | 23 - docs6/performance.rst.in | 20 - docs6/programming-examples.rst | 261 - docs6/programming-examples.rst.in | 47 - docs6/programming-language.rst | 370 - docs6/programming-language.rst.in | 191 - docs6/randomizing-examples.rst | 174 - docs6/randomizing-examples.rst.in | 88 - docs6/record-heterogeneity.rst | 219 - docs6/record-heterogeneity.rst.in | 80 - docs6/reference-dsl-arrays.rst | 20 - docs6/reference-dsl-arrays.rst.in | 8 - docs6/reference-dsl-builtin-functions.rst | 2177 - docs6/reference-dsl-builtin-functions.rst.in | 16 - docs6/reference-dsl-complexity.rst | 12 - docs6/reference-dsl-complexity.rst.in | 9 - docs6/reference-dsl-control-structures.rst | 549 - docs6/reference-dsl-control-structures.rst.in | 176 - docs6/reference-dsl-errors.rst | 27 - docs6/reference-dsl-errors.rst.in | 24 - docs6/reference-dsl-filter-statements.rst | 38 - docs6/reference-dsl-filter-statements.rst.in | 22 - docs6/reference-dsl-operators.rst | 45 - docs6/reference-dsl-operators.rst.in | 42 - docs6/reference-dsl-output-statements.rst | 583 - docs6/reference-dsl-output-statements.rst.in | 247 - docs6/reference-dsl-syntax.rst | 220 - docs6/reference-dsl-syntax.rst.in | 101 - docs6/reference-dsl-unset-statements.rst | 83 - docs6/reference-dsl-unset-statements.rst.in | 24 - .../reference-dsl-user-defined-functions.rst | 110 - ...eference-dsl-user-defined-functions.rst.in | 56 - docs6/reference-dsl-variables.rst | 1118 - docs6/reference-dsl-variables.rst.in | 384 - docs6/reference-dsl.rst | 90 - docs6/reference-dsl.rst.in | 64 - docs6/reference-main-arithmetic.rst | 50 - docs6/reference-main-arithmetic.rst.in | 47 - docs6/reference-main-auxiliary-commands.rst | 119 - .../reference-main-auxiliary-commands.rst.in | 46 - docs6/reference-main-data-types.rst | 49 - docs6/reference-main-data-types.rst.in | 46 - docs6/reference-main-env-vars.rst | 12 - docs6/reference-main-env-vars.rst.in | 9 - docs6/reference-main-io-options.rst | 156 - docs6/reference-main-io-options.rst.in | 133 - docs6/reference-main-null-data.rst | 148 - docs6/reference-main-null-data.rst.in | 90 - docs6/reference-main-online-help.rst | 43 - docs6/reference-main-online-help.rst.in | 14 - docs6/reference-main-overview.rst | 78 - docs6/reference-main-overview.rst.in | 59 - docs6/reference-main-regular-expressions.rst | 83 - .../reference-main-regular-expressions.rst.in | 70 - docs6/reference-main-then-chaining.rst | 46 - docs6/reference-main-then-chaining.rst.in | 24 - docs6/reference-verbs.rst | 3678 - docs6/reference-verbs.rst.in | 1312 - docs6/release-docs.rst | 21 - docs6/release-docs.rst.in | 18 - docs6/repl.rst | 184 - docs6/repl.rst.in | 158 - docs6/rework.txt | 40 - docs6/shapes-of-data.rst | 422 - docs6/shapes-of-data.rst.in | 257 - docs6/shell-commands.rst | 69 - docs6/shell-commands.rst.in | 43 - docs6/special-symbols-and-formatting.rst | 146 - docs6/special-symbols-and-formatting.rst.in | 97 - docs6/sphinx-hack/data | 1 - docs6/sphinx-hack/programs | 1 - docs6/sql-examples.rst | 252 - docs6/sql-examples.rst.in | 242 - docs6/statistics-examples.rst | 71 - docs6/statistics-examples.rst.in | 20 - docs6/then-chaining.rst | 125 - docs6/then-chaining.rst.in | 67 - docs6/two-pass-algorithms.rst | 718 - docs6/two-pass-algorithms.rst.in | 218 - docs6/why.rst | 56 - docs6/why.rst.in | 53 - docs6b/README.md | 42 - docs6b/docs/_build/html/10-1.sh | 2 - docs6b/docs/_build/html/10-2.sh | 4 - .../_build/html/data/begin-end-example-1.sh | 5 - .../_build/html/data/begin-end-example-2.sh | 4 - .../_build/html/data/begin-end-example-3.sh | 4 - .../_build/html/data/begin-end-example-4.sh | 8 - .../_build/html/data/begin-end-example-5.sh | 1 - .../_build/html/data/begin-end-example-6.sh | 8 - .../_build/html/data/begin-end-example-7.sh | 1 - docs6b/docs/_build/html/data/sar.mlr | 3 - docs6b/docs/_build/html/expo-sample.sh | 27 - docs6b/docs/_static/basic.css | 861 - docs6b/docs/_static/classic.css | 271 - docs6b/docs/_static/mlr.jpg | Bin 12800 -> 0 bytes docs6b/docs/_static/pygments.css | 76 - docs6b/docs/_static/scrolls.css | 524 - docs6b/docs/_static/top.png | Bin 16618 -> 0 bytes docs6b/docs/absent-example.json | 3 - docs6b/docs/circle.csv | 4 - docs6b/docs/commas.csv | 3 - docs6b/docs/context-example.mlr | 6 - docs6b/docs/coverart/cover-cat.png | Bin 103973 -> 0 bytes docs6b/docs/coverart/cover-combined.png | Bin 210203 -> 0 bytes docs6b/docs/coverart/cover-filter-to-json.png | Bin 107313 -> 0 bytes docs6b/docs/coverart/cover-sort-to-pprint.png | Bin 114080 -> 0 bytes docs6b/docs/coverart/coverart.key | Bin 529114 -> 0 bytes docs6b/docs/data/a.csv | 3 - docs6b/docs/data/a.dkvp | 2 - docs6b/docs/data/array-example.json | 8 - docs6b/docs/data/b.csv | 2 - docs6b/docs/data/b.dkvp | 1 - docs6b/docs/data/begin-end-example-6a.sh | 7 - docs6b/docs/data/begin-end-example-7b.sh | 0 docs6b/docs/data/begin-end-example-8.sh | 14 - docs6b/docs/data/budget.csv | 5 - docs6b/docs/data/bulk-rename-for-loop.mlr | 5 - docs6b/docs/data/clean-whitespace.csv | 4 - docs6b/docs/data/color-codes.csv | 4 - docs6b/docs/data/color-names.csv | 3 - docs6b/docs/data/colored-shapes.csv | 10079 - docs6b/docs/data/colored-shapes.dkvp | 10078 - docs6b/docs/data/colours.csv | 3 - docs6b/docs/data/current_counters.csv | 5 - docs6b/docs/data/currtemp.csv | 5 - docs6b/docs/data/dollar-sign.txt | 32 - docs6b/docs/data/dynamic-nr.sh | 11 - docs6b/docs/data/emit-lashed.sh | 10 - docs6b/docs/data/english-words.txt | 210687 --------------- docs6b/docs/data/factorial-example.sh | 14 - docs6b/docs/data/fe-example-1.sh | 1 - docs6b/docs/data/fe-example-2.sh | 1 - docs6b/docs/data/fe-example-3.mlr | 4 - docs6b/docs/data/fe-example-4.mlr | 3 - docs6b/docs/data/feature-count.mlr | 13 - docs6b/docs/data/features.json | 12 - docs6b/docs/data/fibo-cached.sh | 18 - docs6b/docs/data/fibo-uncached.sh | 15 - docs6b/docs/data/fill-down.csv | 4 - docs6b/docs/data/filter-multiline-example.txt | 5 - docs6b/docs/data/flins.csv | 9 - docs6b/docs/data/flins.json | 8 - docs6b/docs/data/for-oosvar-example-0a.txt | 8 - docs6b/docs/data/for-oosvar-example-0b.sh | 10 - docs6b/docs/data/for-oosvar-example-0c.sh | 16 - docs6b/docs/data/for-oosvar-example-0d.sh | 17 - docs6b/docs/data/for-oosvar-example-0e.sh | 17 - docs6b/docs/data/for-srec-example-1.sh | 11 - docs6b/docs/data/for-srec-example-2.sh | 10 - docs6b/docs/data/for-srec-example-3.sh | 9 - docs6b/docs/data/for-srec-example.tbl | 4 - docs6b/docs/data/fraction-example.csv | 12 - docs6b/docs/data/full-reorg.sh | 15 - docs6b/docs/data/headerless.csv | 4 - docs6b/docs/data/het-bool.csv | 5 - docs6b/docs/data/het.csv | 14 - docs6b/docs/data/het.dkvp | 5 - docs6b/docs/data/if-chain.sh | 11 - docs6b/docs/data/inout.csv | 4 - docs6b/docs/data/iqr1.sh | 3 - docs6b/docs/data/iqrn.sh | 7 - docs6b/docs/data/join-left-example.csv | 6 - docs6b/docs/data/join-right-example.csv | 21 - docs6b/docs/data/join-u-left.csv | 4 - docs6b/docs/data/join-u-right.csv | 10 - docs6b/docs/data/json-example-1.json | 100 - docs6b/docs/data/json-example-2.json | 140 - docs6b/docs/data/json-example-3.json | 8 - docs6b/docs/data/keyed-mean-with-oosvars.sh | 10 - .../docs/data/keyed-min-max-with-oosvars.sh | 7 - docs6b/docs/data/label-example.txt | 11 - docs6b/docs/data/linreg-example.jpg | Bin 140569 -> 0 bytes docs6b/docs/data/linreg-example.txt | 22 - docs6b/docs/data/local-example-1.sh | 16 - docs6b/docs/data/map-literal-example-1.sh | 7 - docs6b/docs/data/map-literal-example-2.sh | 7 - docs6b/docs/data/map-literal-example-3.sh | 19 - docs6b/docs/data/maxrows.mlr | 15 - docs6b/docs/data/maxrows.tsv | 32 - docs6b/docs/data/mean-with-oosvars.sh | 8 - docs6b/docs/data/medium | 10000 - docs6b/docs/data/medium-squares | 4990 - docs6b/docs/data/miss-date-1.sh | 5 - docs6b/docs/data/miss-date-2.sh | 5 - docs6b/docs/data/miss-date.csv | 1372 - docs6b/docs/data/mkdat2 | 125 - docs6b/docs/data/multicountdown.dat | 100 - docs6b/docs/data/multicountdown.rb | 21 - docs6b/docs/data/mydata.txt | 3 - docs6b/docs/data/nested.tsv | 3 - docs6b/docs/data/newline-example.txt | 9 - docs6b/docs/data/ping-delta-example.txt | 11 - docs6b/docs/data/previous-to-current.sh | 5 - docs6b/docs/data/previous_counters.csv | 5 - docs6b/docs/data/prevtemp.csv | 5 - docs6b/docs/data/put-gating-example-1.dkvp | 5 - docs6b/docs/data/put-gating-example-2.dkvp | 3 - docs6b/docs/data/put-multiline-example.txt | 7 - docs6b/docs/data/question.dat | 1 - docs6b/docs/data/ragged-csv-2.sh | 6 - docs6b/docs/data/ragged-csv.sh | 8 - docs6b/docs/data/ragged.csv | 4 - docs6b/docs/data/rect-inner.txt | 7 - docs6b/docs/data/rect-middle.txt | 7 - docs6b/docs/data/rect-outer.txt | 3 - docs6b/docs/data/rect.sh | 10 - docs6b/docs/data/rect.txt | 17 - docs6b/docs/data/regex-in-data.dat | 3 - docs6b/docs/data/remove-empty-columns.csv | 4 - docs6b/docs/data/repeat-example.dat | 3 - docs6b/docs/data/repeats.dkvp | 57 - docs6b/docs/data/sample-example.txt | 44 - docs6b/docs/data/sar.csv | 3 - docs6b/docs/data/scan-example-1.tbl | 5 - docs6b/docs/data/scan-example-2.tbl | 11 - docs6b/docs/data/scope-example.dat | 3 - docs6b/docs/data/scope-example.mlr | 23 - docs6b/docs/data/self-join.csv | 3 - docs6b/docs/data/semicolon-example.txt | 4 - docs6b/docs/data/single-for-example-1.sh | 8 - docs6b/docs/data/single-for-example-2.sh | 8 - docs6b/docs/data/single-quote-example.mlr | 1 - docs6b/docs/data/small | 5 - docs6b/docs/data/small.csv | 6 - docs6b/docs/data/small2 | 5 - docs6b/docs/data/sort-het.dkvp | 7 - docs6b/docs/data/sort-missing.dkvp | 4 - docs6b/docs/data/sort-null.dat | 5 - docs6b/docs/data/sort-within-records.json | 15 - docs6b/docs/data/spaces.csv | 4 - docs6b/docs/data/sparse.json | 4 - docs6b/docs/data/subcommand-example.txt | 3 - docs6b/docs/data/subr-example.sh | 17 - .../docs/data/system-file-ojson-example.txt | 22 - .../docs/data/system-file-opprint-example.txt | 8 - .../docs/data/system-file-oxtab-example.txt | 16 - .../docs/data/then-chaining-performance.txt | 16 - docs6b/docs/data/then-example.csv | 6 - docs6b/docs/data/timing-example.txt | 27 - docs6b/docs/data/trailing-commas.sh | 17 - docs6b/docs/data/triple-for-example-1.sh | 7 - docs6b/docs/data/triple-for-example-2.sh | 10 - docs6b/docs/data/trivial-records.csv | 5 - docs6b/docs/data/two-pass-percentage.sh | 16 - docs6b/docs/data/two-pass-record-numbers.sh | 11 - docs6b/docs/data/type-decl-example.mlr | 37 - docs6b/docs/data/unsparsify.mlr | 26 - docs6b/docs/data/weighted-mean.sh | 24 - docs6b/docs/data/while-example-1.sh | 6 - docs6b/docs/data/while-example-2.sh | 9 - docs6b/docs/dates.csv | 4 - docs6b/docs/dsl-example-multiline.sh | 4 - docs6b/docs/dsl-example.mlr | 2 - docs6b/docs/example.csv | 11 - docs6b/docs/factorial-example.mlr | 7 - docs6b/docs/for-example.mlr | 4 - docs6b/docs/h1foo | 12 - docs6b/docs/h2foo | 12 - docs6b/docs/h3foo | 12 - docs6b/docs/if-example.mlr | 13 - docs6b/docs/link.txt | 1 - docs6b/docs/log.txt | 43 - docs6b/docs/make.bat | 35 - docs6b/docs/manpage.txt | 2371 - docs6b/docs/mk-func-table.rb | 93 - docs6b/docs/mlr.1 | 4114 - docs6b/docs/multi-join/input.csv | 9 - docs6b/docs/multi-join/name-lookup.csv | 4 - docs6b/docs/multi-join/status-lookup.csv | 4 - docs6b/docs/ngrams/gsl-2000.txt | 2283 - docs6b/docs/ngrams/mkv.mlr | 83 - docs6b/docs/ngrams/mkv3.mlr | 125 - docs6b/docs/ngrams/mkv4.mlr | 155 - docs6b/docs/ngrams/mkv5.mlr | 183 - docs6b/docs/ngrams/ng1 | 2 - docs6b/docs/ngrams/ng1.mlr | 39 - docs6b/docs/ngrams/ng1.mlr.txt | 39 - docs6b/docs/ngrams/ng2 | 2 - docs6b/docs/ngrams/ng2.mlr | 52 - docs6b/docs/ngrams/ng2.mlr.txt | 52 - docs6b/docs/ngrams/ng3 | 2 - docs6b/docs/ngrams/ng3.mlr | 64 - docs6b/docs/ngrams/ng3.mlr.txt | 64 - docs6b/docs/ngrams/ng4 | 2 - docs6b/docs/ngrams/ng4.mlr | 79 - docs6b/docs/ngrams/ng4.mlr.txt | 79 - docs6b/docs/ngrams/ng5 | 2 - docs6b/docs/ngrams/ng5.mlr | 95 - docs6b/docs/ngrams/ng5.mlr.txt | 95 - docs6b/docs/ngrams/ngfuncs.mlr | 49 - docs6b/docs/ngrams/ngfuncs.mlr.txt | 49 - docs6b/docs/oosvar-example-ewma.sh | 5 - docs6b/docs/oosvar-example-sum-grouped.sh | 6 - docs6b/docs/oosvar-example-sum.sh | 6 - docs6b/docs/pix/colorization.png | Bin 312953 -> 0 bytes docs6b/docs/pix/colorization.png.000 | Bin 452036 -> 0 bytes docs6b/docs/pix/colorization2.png | Bin 525723 -> 0 bytes docs6b/docs/pix/colorization2.png.000 | Bin 710314 -> 0 bytes docs6b/docs/pix/mand.png | Bin 646689 -> 0 bytes docs6b/docs/pix/miller-msys-complex.png | Bin 55627 -> 0 bytes docs6b/docs/pix/miller-msys.png | Bin 231291 -> 0 bytes .../pix/miller-windows-complex-workaround.png | Bin 102694 -> 0 bytes docs6b/docs/pix/miller-windows-complex.png | Bin 255699 -> 0 bytes .../miller-windows-triple-double-quote.png | Bin 87256 -> 0 bytes docs6b/docs/pix/miller-windows.png | Bin 660936 -> 0 bytes docs6b/docs/pix/mlr-doc-sepia.jpg | Bin 185327 -> 0 bytes docs6b/docs/pix/mlr.jpg | Bin 12800 -> 0 bytes docs6b/docs/pix/omd.png | Bin 78450 -> 0 bytes docs6b/docs/pix/sepia-overlay.jpg | Bin 449328 -> 0 bytes docs6b/docs/polyglot-dkvp-io/dkvp_io.py | 58 - docs6b/docs/polyglot-dkvp-io/dkvp_io.rb | 52 - docs6b/docs/polyglot-dkvp-io/example.py | 34 - docs6b/docs/polyglot-dkvp-io/example.rb | 24 - docs6b/docs/programs/mand.mlr | 100 - docs6b/docs/programs/mand.sh | 33 - docs6b/docs/programs/sieve.mlr | 32 - docs6b/docs/sample_mlrrc | 15 - docs6b/docs/sphinx-hack/data | 1 - docs6b/docs/sphinx-hack/multi-join | 1 - docs6b/docs/sphinx-hack/ngrams | 1 - docs6b/docs/sphinx-hack/pix | 1 - docs6b/docs/sphinx-hack/polyglot-dkvp-io | 1 - docs6b/docs/sphinx-hack/programs | 1 - docs6b/docs/square.csv | 5 - docs6b/docs/triangle.csv | 4 - docs6b/docs/variance.mlr | 9 - docs6b/docs/verb-example-ewma.sh | 1 - docs6b/wishlist.txt | 11 - go/README.md | 2 +- 1313 files changed, 32 insertions(+), 287985 deletions(-) delete mode 120000 docs/sphinx-hack/multi-join delete mode 120000 docs/sphinx-hack/ngrams delete mode 120000 docs/sphinx-hack/polyglot-dkvp-io delete mode 100644 docs6/.vimrc delete mode 100644 docs6/10min.rst delete mode 100644 docs6/10min.rst.in delete mode 100644 docs6/Makefile delete mode 100755 docs6/build-one delete mode 100644 docs6/build.rst delete mode 100644 docs6/build.rst.in delete mode 100644 docs6/community.rst delete mode 100644 docs6/community.rst.in delete mode 100644 docs6/conf.py delete mode 100644 docs6/contributing.rst delete mode 100644 docs6/contributing.rst.in delete mode 100644 docs6/csv-with-and-without-headers.rst delete mode 100644 docs6/csv-with-and-without-headers.rst.in delete mode 100644 docs6/customization.rst delete mode 100644 docs6/customization.rst.in delete mode 100644 docs6/data-cleaning-examples.rst delete mode 100644 docs6/data-cleaning-examples.rst.in delete mode 100644 docs6/data-diving-examples.rst delete mode 100644 docs6/data-diving-examples.rst.in delete mode 100644 docs6/dates-and-times.rst delete mode 100644 docs6/dates-and-times.rst.in delete mode 100644 docs6/dkvp-examples.rst delete mode 100644 docs6/dkvp-examples.rst.in delete mode 100644 docs6/doc-reorg.txt rename {docs6b => docs6}/docs/.vimrc (100%) rename docs6/{ => docs}/10-1.sh (100%) rename docs6/{ => docs}/10-2.sh (100%) rename {docs6b => docs6}/docs/10min.md (100%) rename {docs6b => docs6}/docs/10min.md.in (100%) rename {docs6b => docs6}/docs/Makefile (100%) rename {docs6b => docs6}/docs/_build/doctrees/10min.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/build.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/community.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/contact.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/contributing.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/cookbook.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/cookbook2.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/cookbook3.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/cookbook4.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/csv-with-and-without-headers.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/customization.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/data-cleaning-examples.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/data-diving-examples.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/data-examples.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/data-sharing.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/dates-and-times.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/dkvp-examples.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/environment.pickle (100%) rename {docs6b => docs6}/docs/_build/doctrees/etymology.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/ex-fields-not-selected.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/ex-no-output-at-all.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/faq.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/feature-comparison.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/features.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/file-formats.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/foo.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/getting-started.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/index.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/install.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/installation.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/internationalization.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/introduction.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/joins.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/keystroke-savers.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/log-processing-examples.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/manpage.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/miller-by-example.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/miller-on-windows.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/misc-examples.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/new-in-miller-6.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/old-10min.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/operating-on-all-fields.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/originality.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/output-colorization.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/performance.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/programming-examples.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/programming-language.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/quick-examples.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/randomizing-examples.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/record-heterogeneity.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/reference-dsl-arrays.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/reference-dsl-builtin-functions.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/reference-dsl-complexity.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/reference-dsl-complexlity.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/reference-dsl-control-structures.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/reference-dsl-errors.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/reference-dsl-filter-statements.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/reference-dsl-operators.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/reference-dsl-output-statements.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/reference-dsl-overview.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/reference-dsl-syntax.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/reference-dsl-tbf.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/reference-dsl-unset-statements.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/reference-dsl-user-defined-functions.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/reference-dsl-variables.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/reference-dsl.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/reference-main-arithmetic.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/reference-main-auxiliary-commands.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/reference-main-data-types.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/reference-main-env-vars.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/reference-main-io-options.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/reference-main-null-data.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/reference-main-online-help.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/reference-main-overview.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/reference-main-regular-expressions.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/reference-main-then-chaining.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/reference-verbs.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/reference.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/release-docs.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/repl.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/shapes-of-data.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/shell-commands.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/special-symbols-and-formatting.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/sql-examples.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/statistics-examples.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/then-chaining.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/two-pass-algorithms.doctree (100%) rename {docs6b => docs6}/docs/_build/doctrees/why.doctree (100%) rename {docs6b => docs6}/docs/_build/html/.buildinfo (100%) rename {docs6b/docs => docs6/docs/_build/html}/10-1.sh (100%) mode change 100755 => 100644 rename {docs6b/docs => docs6/docs/_build/html}/10-2.sh (100%) mode change 100755 => 100644 rename {docs6b => docs6}/docs/_build/html/10min.html (100%) rename docs6/{pix => docs/_build/html/_images}/colorization.png (100%) rename docs6/{pix => docs/_build/html/_images}/colorization2.png (100%) rename docs6/{coverart => docs/_build/html/_images}/cover-combined.png (100%) rename docs6/{data => docs/_build/html/_images}/linreg-example.jpg (100%) rename docs6/{pix => docs/_build/html/_images}/mand.png (100%) rename docs6/{pix => docs/_build/html/_images}/miller-msys-complex.png (100%) rename docs6/{pix => docs/_build/html/_images}/miller-msys.png (100%) rename docs6/{pix => docs/_build/html/_images}/miller-windows-complex-workaround.png (100%) rename docs6/{pix => docs/_build/html/_images}/miller-windows-complex.png (100%) rename docs6/{pix => docs/_build/html/_images}/miller-windows-triple-double-quote.png (100%) rename docs6/{pix => docs/_build/html/_images}/miller-windows.png (100%) rename docs6/{pix => docs/_build/html/_images}/omd.png (100%) rename {docs6b => docs6}/docs/_build/html/_sources/10min.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/build.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/community.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/contact.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/contributing.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/cookbook.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/cookbook2.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/cookbook3.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/cookbook4.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/csv-with-and-without-headers.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/customization.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/data-cleaning-examples.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/data-diving-examples.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/data-examples.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/data-sharing.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/dates-and-times.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/dkvp-examples.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/etymology.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/ex-fields-not-selected.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/ex-no-output-at-all.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/faq.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/feature-comparison.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/features.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/file-formats.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/foo.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/getting-started.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/index.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/install.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/installation.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/internationalization.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/introduction.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/joins.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/keystroke-savers.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/log-processing-examples.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/manpage.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/miller-by-example.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/miller-on-windows.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/misc-examples.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/new-in-miller-6.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/old-10min.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/operating-on-all-fields.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/originality.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/output-colorization.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/performance.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/programming-examples.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/programming-language.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/quick-examples.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/randomizing-examples.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/record-heterogeneity.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/reference-dsl-arrays.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/reference-dsl-builtin-functions.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/reference-dsl-complexity.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/reference-dsl-complexlity.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/reference-dsl-control-structures.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/reference-dsl-errors.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/reference-dsl-filter-statements.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/reference-dsl-operators.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/reference-dsl-output-statements.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/reference-dsl-overview.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/reference-dsl-syntax.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/reference-dsl-tbf.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/reference-dsl-unset-statements.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/reference-dsl-user-defined-functions.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/reference-dsl-variables.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/reference-dsl.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/reference-main-arithmetic.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/reference-main-auxiliary-commands.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/reference-main-data-types.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/reference-main-env-vars.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/reference-main-io-options.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/reference-main-null-data.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/reference-main-online-help.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/reference-main-overview.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/reference-main-regular-expressions.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/reference-main-then-chaining.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/reference-verbs.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/reference.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/release-docs.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/repl.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/shapes-of-data.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/shell-commands.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/special-symbols-and-formatting.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/sql-examples.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/statistics-examples.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/then-chaining.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/two-pass-algorithms.rst.txt (100%) rename {docs6b => docs6}/docs/_build/html/_sources/why.rst.txt (100%) rename docs6/{ => docs/_build/html}/_static/basic.css (100%) rename docs6/{ => docs/_build/html}/_static/classic.css (100%) rename {docs6b => docs6}/docs/_build/html/_static/darkmetal.png (100%) rename {docs6b => docs6}/docs/_build/html/_static/doctools.js (100%) rename {docs6b => docs6}/docs/_build/html/_static/documentation_options.js (100%) rename {docs6b => docs6}/docs/_build/html/_static/file.png (100%) rename {docs6b => docs6}/docs/_build/html/_static/headerbg.png (100%) rename {docs6b => docs6}/docs/_build/html/_static/jquery-3.5.1.js (100%) rename {docs6b => docs6}/docs/_build/html/_static/jquery.js (100%) rename {docs6b => docs6}/docs/_build/html/_static/language_data.js (100%) rename {docs6b => docs6}/docs/_build/html/_static/logo.png (100%) rename {docs6b => docs6}/docs/_build/html/_static/metal.png (100%) rename {docs6b => docs6}/docs/_build/html/_static/minus.png (100%) rename docs6/{ => docs/_build/html}/_static/mlr.jpg (100%) rename {docs6b => docs6}/docs/_build/html/_static/navigation.png (100%) rename {docs6b => docs6}/docs/_build/html/_static/plus.png (100%) rename {docs6b => docs6}/docs/_build/html/_static/print.css (100%) rename docs6/{ => docs/_build/html}/_static/pygments.css (100%) rename docs6/{ => docs/_build/html}/_static/scrolls.css (100%) rename {docs6b => docs6}/docs/_build/html/_static/searchtools.js (100%) rename {docs6b => docs6}/docs/_build/html/_static/sidebar.js (100%) rename {docs6b => docs6}/docs/_build/html/_static/theme_extras.js (100%) rename docs6/{ => docs/_build/html}/_static/top.png (100%) rename {docs6b => docs6}/docs/_build/html/_static/underscore-1.3.1.js (100%) rename {docs6b => docs6}/docs/_build/html/_static/underscore.js (100%) rename {docs6b => docs6}/docs/_build/html/_static/watermark.png (100%) rename {docs6b => docs6}/docs/_build/html/_static/watermark_blur.png (100%) rename {docs6b => docs6}/docs/_build/html/build.html (100%) rename docs6/{ => docs/_build/html}/circle.csv (100%) rename docs6/{ => docs/_build/html}/commas.csv (100%) rename {docs6b => docs6}/docs/_build/html/community.html (100%) rename {docs6b => docs6}/docs/_build/html/contact.html (100%) rename {docs6b => docs6}/docs/_build/html/contributing.html (100%) rename {docs6b => docs6}/docs/_build/html/cookbook.html (100%) rename {docs6b => docs6}/docs/_build/html/cookbook2.html (100%) rename {docs6b => docs6}/docs/_build/html/cookbook3.html (100%) rename {docs6b => docs6}/docs/_build/html/cookbook4.html (100%) rename {docs6b => docs6}/docs/_build/html/csv-with-and-without-headers.html (100%) rename {docs6b => docs6}/docs/_build/html/customization.html (100%) rename {docs6b => docs6}/docs/_build/html/data-cleaning-examples.html (100%) rename {docs6b => docs6}/docs/_build/html/data-diving-examples.html (100%) rename {docs6b => docs6}/docs/_build/html/data-examples.html (100%) rename {docs6b => docs6}/docs/_build/html/data-sharing.html (100%) rename docs6/{ => docs/_build/html}/data/a.csv (100%) rename docs6/{ => docs/_build/html}/data/a.dkvp (100%) rename docs6/{ => docs/_build/html}/data/array-example.json (100%) rename docs6/{ => docs/_build/html}/data/b.csv (100%) rename docs6/{ => docs/_build/html}/data/b.dkvp (100%) rename docs6/{ => docs/_build/html}/data/begin-end-example-1.sh (100%) rename docs6/{ => docs/_build/html}/data/begin-end-example-2.sh (100%) rename docs6/{ => docs/_build/html}/data/begin-end-example-3.sh (100%) rename docs6/{ => docs/_build/html}/data/begin-end-example-4.sh (100%) rename docs6/{ => docs/_build/html}/data/begin-end-example-5.sh (100%) rename docs6/{ => docs/_build/html}/data/begin-end-example-6.sh (100%) rename docs6/{ => docs/_build/html}/data/begin-end-example-6a.sh (100%) rename docs6/{ => docs/_build/html}/data/begin-end-example-7.sh (100%) rename docs6/{ => docs/_build/html}/data/begin-end-example-7b.sh (100%) rename docs6/{ => docs/_build/html}/data/begin-end-example-8.sh (100%) rename docs6/{ => docs/_build/html}/data/budget.csv (100%) rename docs6/{ => docs/_build/html}/data/bulk-rename-for-loop.mlr (100%) rename docs6/{ => docs/_build/html}/data/clean-whitespace.csv (100%) rename docs6/{ => docs/_build/html}/data/color-codes.csv (100%) rename docs6/{ => docs/_build/html}/data/color-names.csv (100%) rename docs6/{ => docs/_build/html}/data/colored-shapes.csv (100%) rename docs6/{ => docs/_build/html}/data/colored-shapes.dkvp (100%) rename docs6/{ => docs/_build/html}/data/colours.csv (100%) rename docs6/{ => docs/_build/html}/data/current_counters.csv (100%) rename docs6/{ => docs/_build/html}/data/currtemp.csv (100%) rename {docs6b => docs6}/docs/_build/html/data/delimiter-examples.txt (100%) rename docs6/{ => docs/_build/html}/data/dollar-sign.txt (100%) rename docs6/{ => docs/_build/html}/data/dynamic-nr.sh (100%) rename docs6/{ => docs/_build/html}/data/emit-lashed.sh (100%) rename docs6/{ => docs/_build/html}/data/english-words.txt (100%) rename docs6/{ => docs/_build/html}/data/factorial-example.sh (100%) rename docs6/{ => docs/_build/html}/data/fe-example-1.sh (100%) rename docs6/{ => docs/_build/html}/data/fe-example-2.sh (100%) rename docs6/{ => docs/_build/html}/data/fe-example-3.mlr (100%) rename docs6/{ => docs/_build/html}/data/fe-example-4.mlr (100%) rename docs6/{ => docs/_build/html}/data/feature-count.mlr (100%) rename docs6/{ => docs/_build/html}/data/features.json (100%) rename docs6/{ => docs/_build/html}/data/fibo-cached.sh (100%) rename docs6/{ => docs/_build/html}/data/fibo-uncached.sh (100%) rename docs6/{ => docs/_build/html}/data/fill-down.csv (100%) rename docs6/{ => docs/_build/html}/data/filter-multiline-example.txt (100%) rename docs6/{ => docs/_build/html}/data/flins.csv (100%) rename docs6/{ => docs/_build/html}/data/flins.json (100%) rename docs6/{ => docs/_build/html}/data/for-oosvar-example-0a.txt (100%) rename docs6/{ => docs/_build/html}/data/for-oosvar-example-0b.sh (100%) rename docs6/{ => docs/_build/html}/data/for-oosvar-example-0c.sh (100%) rename docs6/{ => docs/_build/html}/data/for-oosvar-example-0d.sh (100%) rename docs6/{ => docs/_build/html}/data/for-oosvar-example-0e.sh (100%) rename docs6/{ => docs/_build/html}/data/for-srec-example-1.sh (100%) rename docs6/{ => docs/_build/html}/data/for-srec-example-2.sh (100%) rename docs6/{ => docs/_build/html}/data/for-srec-example-3.sh (100%) rename docs6/{ => docs/_build/html}/data/for-srec-example.tbl (100%) rename docs6/{ => docs/_build/html}/data/fraction-example.csv (100%) rename docs6/{ => docs/_build/html}/data/full-reorg.sh (100%) rename docs6/{ => docs/_build/html}/data/headerless.csv (100%) rename docs6/{ => docs/_build/html}/data/het-bool.csv (100%) rename docs6/{ => docs/_build/html}/data/het.csv (100%) rename docs6/{ => docs/_build/html}/data/het.dkvp (100%) rename docs6/{ => docs/_build/html}/data/if-chain.sh (100%) rename docs6/{ => docs/_build/html}/data/inout.csv (100%) rename docs6/{ => docs/_build/html}/data/iqr1.sh (100%) rename docs6/{ => docs/_build/html}/data/iqrn.sh (100%) rename docs6/{ => docs/_build/html}/data/join-left-example.csv (100%) rename docs6/{ => docs/_build/html}/data/join-right-example.csv (100%) rename docs6/{ => docs/_build/html}/data/join-u-left.csv (100%) rename docs6/{ => docs/_build/html}/data/join-u-right.csv (100%) rename docs6/{ => docs/_build/html}/data/json-example-1.json (100%) rename docs6/{ => docs/_build/html}/data/json-example-2.json (100%) rename docs6/{ => docs/_build/html}/data/json-example-3.json (100%) rename docs6/{ => docs/_build/html}/data/keyed-mean-with-oosvars.sh (100%) rename docs6/{ => docs/_build/html}/data/keyed-min-max-with-oosvars.sh (100%) rename docs6/{ => docs/_build/html}/data/label-example.txt (100%) rename {docs6b/docs/_build/html/_images => docs6/docs/_build/html/data}/linreg-example.jpg (100%) rename docs6/{ => docs/_build/html}/data/linreg-example.txt (100%) rename docs6/{ => docs/_build/html}/data/local-example-1.sh (100%) mode change 100755 => 100644 rename docs6/{ => docs/_build/html}/data/map-literal-example-1.sh (100%) mode change 100755 => 100644 rename docs6/{ => docs/_build/html}/data/map-literal-example-2.sh (100%) mode change 100755 => 100644 rename docs6/{ => docs/_build/html}/data/map-literal-example-3.sh (100%) mode change 100755 => 100644 rename docs6/{ => docs/_build/html}/data/maxrows.mlr (100%) rename docs6/{ => docs/_build/html}/data/maxrows.tsv (100%) rename docs6/{ => docs/_build/html}/data/mean-with-oosvars.sh (100%) rename docs6/{ => docs/_build/html}/data/medium (100%) rename docs6/{ => docs/_build/html}/data/medium-squares (100%) rename docs6/{ => docs/_build/html}/data/miss-date-1.sh (100%) rename docs6/{ => docs/_build/html}/data/miss-date-2.sh (100%) rename docs6/{ => docs/_build/html}/data/miss-date.csv (100%) rename docs6/{ => docs/_build/html}/data/mkdat2 (100%) mode change 100755 => 100644 rename docs6/{ => docs/_build/html}/data/multicountdown.dat (100%) rename docs6/{ => docs/_build/html}/data/multicountdown.rb (100%) rename docs6/{ => docs/_build/html}/data/mydata.txt (100%) rename docs6/{ => docs/_build/html}/data/nested.tsv (100%) rename docs6/{ => docs/_build/html}/data/newline-example.txt (100%) rename docs6/{ => docs/_build/html}/data/ping-delta-example.txt (100%) rename docs6/{ => docs/_build/html}/data/previous-to-current.sh (100%) rename docs6/{ => docs/_build/html}/data/previous_counters.csv (100%) rename docs6/{ => docs/_build/html}/data/prevtemp.csv (100%) rename docs6/{ => docs/_build/html}/data/put-gating-example-1.dkvp (100%) rename docs6/{ => docs/_build/html}/data/put-gating-example-2.dkvp (100%) rename docs6/{ => docs/_build/html}/data/put-multiline-example.txt (100%) rename docs6/{ => docs/_build/html}/data/question.dat (100%) rename docs6/{ => docs/_build/html}/data/ragged-csv-2.sh (100%) rename docs6/{ => docs/_build/html}/data/ragged-csv.sh (100%) mode change 100755 => 100644 rename docs6/{ => docs/_build/html}/data/ragged.csv (100%) rename docs6/{ => docs/_build/html}/data/rect-inner.txt (100%) rename docs6/{ => docs/_build/html}/data/rect-middle.txt (100%) rename docs6/{ => docs/_build/html}/data/rect-outer.txt (100%) rename docs6/{ => docs/_build/html}/data/rect.sh (100%) rename docs6/{ => docs/_build/html}/data/rect.txt (100%) rename docs6/{ => docs/_build/html}/data/regex-in-data.dat (100%) rename docs6/{ => docs/_build/html}/data/remove-empty-columns.csv (100%) rename docs6/{ => docs/_build/html}/data/repeat-example.dat (100%) rename docs6/{ => docs/_build/html}/data/repeats.dkvp (100%) rename docs6/{ => docs/_build/html}/data/sample-example.txt (100%) rename docs6/{ => docs/_build/html}/data/sar.csv (100%) rename docs6/{ => docs/_build/html}/data/sar.mlr (100%) rename docs6/{ => docs/_build/html}/data/scan-example-1.tbl (100%) rename docs6/{ => docs/_build/html}/data/scan-example-2.tbl (100%) rename docs6/{ => docs/_build/html}/data/scope-example.dat (100%) rename docs6/{ => docs/_build/html}/data/scope-example.mlr (100%) rename docs6/{ => docs/_build/html}/data/self-join.csv (100%) rename docs6/{ => docs/_build/html}/data/semicolon-example.txt (100%) rename docs6/{ => docs/_build/html}/data/single-for-example-1.sh (100%) mode change 100755 => 100644 rename docs6/{ => docs/_build/html}/data/single-for-example-2.sh (100%) mode change 100755 => 100644 rename docs6/{ => docs/_build/html}/data/single-quote-example.mlr (100%) rename docs6/{ => docs/_build/html}/data/small (100%) rename docs6/{ => docs/_build/html}/data/small.csv (100%) rename docs6/{ => docs/_build/html}/data/small2 (100%) rename docs6/{ => docs/_build/html}/data/sort-het.dkvp (100%) rename docs6/{ => docs/_build/html}/data/sort-missing.dkvp (100%) rename docs6/{ => docs/_build/html}/data/sort-null.dat (100%) rename docs6/{ => docs/_build/html}/data/sort-within-records.json (100%) rename docs6/{ => docs/_build/html}/data/spaces.csv (100%) rename docs6/{ => docs/_build/html}/data/sparse.json (100%) rename docs6/{ => docs/_build/html}/data/subcommand-example.txt (100%) rename docs6/{ => docs/_build/html}/data/subr-example.sh (100%) rename docs6/{ => docs/_build/html}/data/system-file-ojson-example.txt (100%) rename docs6/{ => docs/_build/html}/data/system-file-opprint-example.txt (100%) rename docs6/{ => docs/_build/html}/data/system-file-oxtab-example.txt (100%) rename docs6/{ => docs/_build/html}/data/then-chaining-performance.txt (100%) rename docs6/{ => docs/_build/html}/data/then-example.csv (100%) rename docs6/{ => docs/_build/html}/data/timing-example.txt (100%) rename docs6/{ => docs/_build/html}/data/trailing-commas.sh (100%) mode change 100755 => 100644 rename docs6/{ => docs/_build/html}/data/triple-for-example-1.sh (100%) rename docs6/{ => docs/_build/html}/data/triple-for-example-2.sh (100%) rename docs6/{ => docs/_build/html}/data/trivial-records.csv (100%) rename docs6/{ => docs/_build/html}/data/two-pass-percentage.sh (100%) rename docs6/{ => docs/_build/html}/data/two-pass-record-numbers.sh (100%) rename docs6/{ => docs/_build/html}/data/type-decl-example.mlr (100%) rename docs6/{ => docs/_build/html}/data/unsparsify.mlr (100%) rename docs6/{ => docs/_build/html}/data/weighted-mean.sh (100%) rename docs6/{ => docs/_build/html}/data/while-example-1.sh (100%) rename docs6/{ => docs/_build/html}/data/while-example-2.sh (100%) rename {docs6b => docs6}/docs/_build/html/dates-and-times.html (100%) rename docs6/{ => docs/_build/html}/dates.csv (100%) rename {docs6b => docs6}/docs/_build/html/dkvp-examples.html (100%) rename {docs6b => docs6}/docs/_build/html/etymology.html (100%) rename {docs6b => docs6}/docs/_build/html/ex-fields-not-selected.html (100%) rename {docs6b => docs6}/docs/_build/html/ex-no-output-at-all.html (100%) rename docs6/{ => docs/_build/html}/example.csv (100%) rename docs6/{ => docs/_build/html}/expo-sample.sh (100%) mode change 100755 => 100644 rename {docs6b => docs6}/docs/_build/html/faq.html (100%) rename {docs6b => docs6}/docs/_build/html/feature-comparison.html (100%) rename {docs6b => docs6}/docs/_build/html/features.html (100%) rename {docs6b => docs6}/docs/_build/html/file-formats.html (100%) rename {docs6b => docs6}/docs/_build/html/foo.html (100%) rename {docs6b => docs6}/docs/_build/html/genindex.html (100%) rename {docs6b => docs6}/docs/_build/html/getting-started.html (100%) rename {docs6b => docs6}/docs/_build/html/index.html (100%) rename {docs6b => docs6}/docs/_build/html/install.html (100%) rename {docs6b => docs6}/docs/_build/html/installation.html (100%) rename {docs6b => docs6}/docs/_build/html/internationalization.html (100%) rename {docs6b => docs6}/docs/_build/html/introduction.html (100%) rename {docs6b => docs6}/docs/_build/html/joins.html (100%) rename {docs6b => docs6}/docs/_build/html/keystroke-savers.html (100%) rename {docs6b => docs6}/docs/_build/html/log-processing-examples.html (100%) rename docs6/{ => docs/_build/html}/log.txt (100%) rename docs6/{ => docs/_build/html}/make.bat (100%) rename {docs6b => docs6}/docs/_build/html/manpage.html (100%) rename docs6/{ => docs/_build/html}/manpage.txt (100%) rename {docs6b => docs6}/docs/_build/html/miller-by-example.html (100%) rename {docs6b => docs6}/docs/_build/html/miller-on-windows.html (100%) rename {docs6b => docs6}/docs/_build/html/misc-examples.html (100%) rename docs6/{ => docs/_build/html}/multi-join/input.csv (100%) rename docs6/{ => docs/_build/html}/multi-join/name-lookup.csv (100%) rename docs6/{ => docs/_build/html}/multi-join/status-lookup.csv (100%) rename {docs6b => docs6}/docs/_build/html/new-in-miller-6.html (100%) rename docs6/{ => docs/_build/html}/ngrams/gsl-2000.txt (100%) rename docs6/{ => docs/_build/html}/ngrams/mkv.mlr (100%) mode change 100755 => 100644 rename docs6/{ => docs/_build/html}/ngrams/mkv3.mlr (100%) mode change 100755 => 100644 rename docs6/{ => docs/_build/html}/ngrams/mkv4.mlr (100%) mode change 100755 => 100644 rename docs6/{ => docs/_build/html}/ngrams/mkv5.mlr (100%) mode change 100755 => 100644 rename docs6/{ => docs/_build/html}/ngrams/ng1 (100%) mode change 100755 => 100644 rename docs6/{ => docs/_build/html}/ngrams/ng1.mlr (100%) mode change 100755 => 100644 rename docs6/{ => docs/_build/html}/ngrams/ng1.mlr.txt (100%) mode change 100755 => 100644 rename docs6/{ => docs/_build/html}/ngrams/ng2 (100%) mode change 100755 => 100644 rename docs6/{ => docs/_build/html}/ngrams/ng2.mlr (100%) mode change 100755 => 100644 rename docs6/{ => docs/_build/html}/ngrams/ng2.mlr.txt (100%) mode change 100755 => 100644 rename docs6/{ => docs/_build/html}/ngrams/ng3 (100%) mode change 100755 => 100644 rename docs6/{ => docs/_build/html}/ngrams/ng3.mlr (100%) mode change 100755 => 100644 rename docs6/{ => docs/_build/html}/ngrams/ng3.mlr.txt (100%) mode change 100755 => 100644 rename docs6/{ => docs/_build/html}/ngrams/ng4 (100%) mode change 100755 => 100644 rename docs6/{ => docs/_build/html}/ngrams/ng4.mlr (100%) mode change 100755 => 100644 rename docs6/{ => docs/_build/html}/ngrams/ng4.mlr.txt (100%) mode change 100755 => 100644 rename docs6/{ => docs/_build/html}/ngrams/ng5 (100%) mode change 100755 => 100644 rename docs6/{ => docs/_build/html}/ngrams/ng5.mlr (100%) mode change 100755 => 100644 rename docs6/{ => docs/_build/html}/ngrams/ng5.mlr.txt (100%) mode change 100755 => 100644 rename docs6/{ => docs/_build/html}/ngrams/ngfuncs.mlr (100%) rename docs6/{ => docs/_build/html}/ngrams/ngfuncs.mlr.txt (100%) rename {docs6b => docs6}/docs/_build/html/objects.inv (100%) rename {docs6b => docs6}/docs/_build/html/old-10min.html (100%) rename docs6/{ => docs/_build/html}/oosvar-example-ewma.sh (100%) rename docs6/{ => docs/_build/html}/oosvar-example-sum-grouped.sh (100%) rename docs6/{ => docs/_build/html}/oosvar-example-sum.sh (100%) rename {docs6b => docs6}/docs/_build/html/operating-on-all-fields.html (100%) rename {docs6b => docs6}/docs/_build/html/originality.html (100%) rename {docs6b => docs6}/docs/_build/html/output-colorization.html (100%) rename {docs6b => docs6}/docs/_build/html/performance.html (100%) rename {docs6b/docs/_build/html/_images => docs6/docs/_build/html/pix}/colorization.png (100%) rename docs6/{ => docs/_build/html}/pix/colorization.png.000 (100%) rename {docs6b/docs/_build/html/_images => docs6/docs/_build/html/pix}/colorization2.png (100%) rename docs6/{ => docs/_build/html}/pix/colorization2.png.000 (100%) rename {docs6b/docs/_build/html/_images => docs6/docs/_build/html/pix}/mand.png (100%) rename {docs6b/docs/_build/html/_images => docs6/docs/_build/html/pix}/miller-msys-complex.png (100%) rename {docs6b/docs/_build/html/_images => docs6/docs/_build/html/pix}/miller-msys.png (100%) rename {docs6b/docs/_build/html/_images => docs6/docs/_build/html/pix}/miller-windows-complex-workaround.png (100%) rename {docs6b/docs/_build/html/_images => docs6/docs/_build/html/pix}/miller-windows-complex.png (100%) rename {docs6b/docs/_build/html/_images => docs6/docs/_build/html/pix}/miller-windows-triple-double-quote.png (100%) rename {docs6b/docs/_build/html/_images => docs6/docs/_build/html/pix}/miller-windows.png (100%) rename docs6/{ => docs/_build/html}/pix/mlr-doc-sepia.jpg (100%) rename docs6/{ => docs/_build/html}/pix/mlr.jpg (100%) rename {docs6b/docs/_build/html/_images => docs6/docs/_build/html/pix}/omd.png (100%) rename docs6/{ => docs/_build/html}/pix/sepia-overlay.jpg (100%) rename docs6/{ => docs/_build/html}/polyglot-dkvp-io/dkvp_io.py (100%) rename docs6/{ => docs/_build/html}/polyglot-dkvp-io/dkvp_io.rb (100%) rename docs6/{ => docs/_build/html}/polyglot-dkvp-io/example.py (100%) rename docs6/{ => docs/_build/html}/polyglot-dkvp-io/example.rb (100%) rename {docs6b => docs6}/docs/_build/html/programming-examples.html (100%) rename {docs6b => docs6}/docs/_build/html/programming-language.html (100%) rename docs6/{ => docs/_build/html}/programs/mand.mlr (100%) rename docs6/{ => docs/_build/html}/programs/mand.sh (100%) rename docs6/{ => docs/_build/html}/programs/sieve.mlr (100%) rename {docs6b => docs6}/docs/_build/html/quick-examples.html (100%) rename {docs6b => docs6}/docs/_build/html/randomizing-examples.html (100%) rename {docs6b => docs6}/docs/_build/html/record-heterogeneity.html (100%) rename {docs6b => docs6}/docs/_build/html/reference-dsl-arrays.html (100%) rename {docs6b => docs6}/docs/_build/html/reference-dsl-builtin-functions.html (100%) rename {docs6b => docs6}/docs/_build/html/reference-dsl-complexity.html (100%) rename {docs6b => docs6}/docs/_build/html/reference-dsl-complexlity.html (100%) rename {docs6b => docs6}/docs/_build/html/reference-dsl-control-structures.html (100%) rename {docs6b => docs6}/docs/_build/html/reference-dsl-errors.html (100%) rename {docs6b => docs6}/docs/_build/html/reference-dsl-filter-statements.html (100%) rename {docs6b => docs6}/docs/_build/html/reference-dsl-operators.html (100%) rename {docs6b => docs6}/docs/_build/html/reference-dsl-output-statements.html (100%) rename {docs6b => docs6}/docs/_build/html/reference-dsl-overview.html (100%) rename {docs6b => docs6}/docs/_build/html/reference-dsl-syntax.html (100%) rename {docs6b => docs6}/docs/_build/html/reference-dsl-tbf.html (100%) rename {docs6b => docs6}/docs/_build/html/reference-dsl-unset-statements.html (100%) rename {docs6b => docs6}/docs/_build/html/reference-dsl-user-defined-functions.html (100%) rename {docs6b => docs6}/docs/_build/html/reference-dsl-variables.html (100%) rename {docs6b => docs6}/docs/_build/html/reference-dsl.html (100%) rename {docs6b => docs6}/docs/_build/html/reference-main-arithmetic.html (100%) rename {docs6b => docs6}/docs/_build/html/reference-main-auxiliary-commands.html (100%) rename {docs6b => docs6}/docs/_build/html/reference-main-data-types.html (100%) rename {docs6b => docs6}/docs/_build/html/reference-main-env-vars.html (100%) rename {docs6b => docs6}/docs/_build/html/reference-main-io-options.html (100%) rename {docs6b => docs6}/docs/_build/html/reference-main-null-data.html (100%) rename {docs6b => docs6}/docs/_build/html/reference-main-online-help.html (100%) rename {docs6b => docs6}/docs/_build/html/reference-main-overview.html (100%) rename {docs6b => docs6}/docs/_build/html/reference-main-regular-expressions.html (100%) rename {docs6b => docs6}/docs/_build/html/reference-main-then-chaining.html (100%) rename {docs6b => docs6}/docs/_build/html/reference-verbs.html (100%) rename {docs6b => docs6}/docs/_build/html/reference.html (100%) rename {docs6b => docs6}/docs/_build/html/release-docs.html (100%) rename {docs6b => docs6}/docs/_build/html/repl.html (100%) rename docs6/{ => docs/_build/html}/sample_mlrrc (100%) rename {docs6b => docs6}/docs/_build/html/search.html (100%) rename {docs6b => docs6}/docs/_build/html/searchindex.js (100%) rename {docs6b => docs6}/docs/_build/html/shapes-of-data.html (100%) rename {docs6b => docs6}/docs/_build/html/shell-commands.html (100%) rename {docs6b => docs6}/docs/_build/html/special-symbols-and-formatting.html (100%) rename {docs6b => docs6}/docs/_build/html/sql-examples.html (100%) rename docs6/{ => docs/_build/html}/square.csv (100%) rename {docs6b => docs6}/docs/_build/html/statistics-examples.html (100%) rename {docs6b => docs6}/docs/_build/html/then-chaining.html (100%) rename docs6/{ => docs/_build/html}/triangle.csv (100%) rename {docs6b => docs6}/docs/_build/html/two-pass-algorithms.html (100%) rename docs6/{ => docs/_build/html}/variance.mlr (100%) rename docs6/{ => docs/_build/html}/verb-example-ewma.sh (100%) rename {docs6b => docs6}/docs/_build/html/why.html (100%) rename {docs6b/docs/_build/html => docs6/docs}/_static/basic.css (100%) rename {docs6b/docs/_build/html => docs6/docs}/_static/classic.css (100%) rename {docs6b/docs/_build/html => docs6/docs}/_static/mlr.jpg (100%) rename {docs6b/docs/_build/html => docs6/docs}/_static/pygments.css (100%) rename {docs6b/docs/_build/html => docs6/docs}/_static/scrolls.css (100%) rename {docs6b/docs/_build/html => docs6/docs}/_static/top.png (100%) rename docs6/{ => docs}/absent-example.json (100%) rename {docs6b => docs6}/docs/build-one (100%) rename {docs6b => docs6}/docs/build.md (100%) rename {docs6b => docs6}/docs/build.md.in (100%) rename {docs6b/docs/_build/html => docs6/docs}/circle.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/commas.csv (100%) rename {docs6b => docs6}/docs/community.md (100%) rename {docs6b => docs6}/docs/community.md.in (100%) rename docs6/{ => docs}/context-example.mlr (100%) rename {docs6b => docs6}/docs/contributing.md (100%) rename {docs6b => docs6}/docs/contributing.md.in (100%) rename docs6/{ => docs}/coverart/cover-cat.png (100%) rename {docs6b/docs/_build/html/_images => docs6/docs/coverart}/cover-combined.png (100%) rename docs6/{ => docs}/coverart/cover-filter-to-json.png (100%) rename docs6/{ => docs}/coverart/cover-sort-to-pprint.png (100%) rename docs6/{ => docs}/coverart/coverart.key (100%) rename {docs6b => docs6}/docs/csv-with-and-without-headers.md (100%) rename {docs6b => docs6}/docs/csv-with-and-without-headers.md.in (100%) rename {docs6b => docs6}/docs/customization.md (100%) rename {docs6b => docs6}/docs/customization.md.in (100%) rename {docs6b => docs6}/docs/data-cleaning-examples.md (100%) rename {docs6b => docs6}/docs/data-cleaning-examples.md.in (100%) rename {docs6b => docs6}/docs/data-diving-examples.md (100%) rename {docs6b => docs6}/docs/data-diving-examples.md.in (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/a.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/a.dkvp (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/array-example.json (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/b.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/b.dkvp (100%) rename {docs6b => docs6}/docs/data/begin-end-example-1.sh (100%) rename {docs6b => docs6}/docs/data/begin-end-example-2.sh (100%) rename {docs6b => docs6}/docs/data/begin-end-example-3.sh (100%) rename {docs6b => docs6}/docs/data/begin-end-example-4.sh (100%) rename {docs6b => docs6}/docs/data/begin-end-example-5.sh (100%) rename {docs6b => docs6}/docs/data/begin-end-example-6.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/begin-end-example-6a.sh (100%) rename {docs6b => docs6}/docs/data/begin-end-example-7.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/begin-end-example-7b.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/begin-end-example-8.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/budget.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/bulk-rename-for-loop.mlr (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/clean-whitespace.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/color-codes.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/color-names.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/colored-shapes.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/colored-shapes.dkvp (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/colours.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/current_counters.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/currtemp.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/dollar-sign.txt (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/dynamic-nr.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/emit-lashed.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/english-words.txt (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/factorial-example.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/fe-example-1.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/fe-example-2.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/fe-example-3.mlr (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/fe-example-4.mlr (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/feature-count.mlr (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/features.json (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/fibo-cached.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/fibo-uncached.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/fill-down.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/filter-multiline-example.txt (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/flins.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/flins.json (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/for-oosvar-example-0a.txt (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/for-oosvar-example-0b.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/for-oosvar-example-0c.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/for-oosvar-example-0d.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/for-oosvar-example-0e.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/for-srec-example-1.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/for-srec-example-2.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/for-srec-example-3.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/for-srec-example.tbl (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/fraction-example.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/full-reorg.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/headerless.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/het-bool.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/het.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/het.dkvp (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/if-chain.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/inout.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/iqr1.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/iqrn.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/join-left-example.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/join-right-example.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/join-u-left.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/join-u-right.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/json-example-1.json (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/json-example-2.json (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/json-example-3.json (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/keyed-mean-with-oosvars.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/keyed-min-max-with-oosvars.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/label-example.txt (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/linreg-example.jpg (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/linreg-example.txt (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/local-example-1.sh (100%) mode change 100644 => 100755 rename {docs6b/docs/_build/html => docs6/docs}/data/map-literal-example-1.sh (100%) mode change 100644 => 100755 rename {docs6b/docs/_build/html => docs6/docs}/data/map-literal-example-2.sh (100%) mode change 100644 => 100755 rename {docs6b/docs/_build/html => docs6/docs}/data/map-literal-example-3.sh (100%) mode change 100644 => 100755 rename {docs6b/docs/_build/html => docs6/docs}/data/maxrows.mlr (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/maxrows.tsv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/mean-with-oosvars.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/medium (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/medium-squares (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/miss-date-1.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/miss-date-2.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/miss-date.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/mkdat2 (100%) mode change 100644 => 100755 rename {docs6b/docs/_build/html => docs6/docs}/data/multicountdown.dat (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/multicountdown.rb (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/mydata.txt (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/nested.tsv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/newline-example.txt (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/ping-delta-example.txt (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/previous-to-current.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/previous_counters.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/prevtemp.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/put-gating-example-1.dkvp (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/put-gating-example-2.dkvp (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/put-multiline-example.txt (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/question.dat (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/ragged-csv-2.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/ragged-csv.sh (100%) mode change 100644 => 100755 rename {docs6b/docs/_build/html => docs6/docs}/data/ragged.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/rect-inner.txt (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/rect-middle.txt (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/rect-outer.txt (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/rect.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/rect.txt (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/regex-in-data.dat (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/remove-empty-columns.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/repeat-example.dat (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/repeats.dkvp (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/sample-example.txt (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/sar.csv (100%) rename {docs6b => docs6}/docs/data/sar.mlr (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/scan-example-1.tbl (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/scan-example-2.tbl (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/scope-example.dat (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/scope-example.mlr (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/self-join.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/semicolon-example.txt (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/single-for-example-1.sh (100%) mode change 100644 => 100755 rename {docs6b/docs/_build/html => docs6/docs}/data/single-for-example-2.sh (100%) mode change 100644 => 100755 rename {docs6b/docs/_build/html => docs6/docs}/data/single-quote-example.mlr (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/small (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/small.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/small2 (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/sort-het.dkvp (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/sort-missing.dkvp (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/sort-null.dat (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/sort-within-records.json (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/spaces.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/sparse.json (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/subcommand-example.txt (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/subr-example.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/system-file-ojson-example.txt (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/system-file-opprint-example.txt (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/system-file-oxtab-example.txt (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/then-chaining-performance.txt (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/then-example.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/timing-example.txt (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/trailing-commas.sh (100%) mode change 100644 => 100755 rename {docs6b/docs/_build/html => docs6/docs}/data/triple-for-example-1.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/triple-for-example-2.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/trivial-records.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/two-pass-percentage.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/two-pass-record-numbers.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/type-decl-example.mlr (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/unsparsify.mlr (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/weighted-mean.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/while-example-1.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/data/while-example-2.sh (100%) rename {docs6b => docs6}/docs/dates-and-times.md (100%) rename {docs6b => docs6}/docs/dates-and-times.md.in (100%) rename {docs6b/docs/_build/html => docs6/docs}/dates.csv (100%) rename {docs6b => docs6}/docs/dkvp-examples.md (100%) rename {docs6b => docs6}/docs/dkvp-examples.md.in (100%) rename {docs6b => docs6}/docs/doc-reorg.txt (100%) rename docs6/{ => docs}/dsl-example-multiline.sh (100%) rename docs6/{ => docs}/dsl-example.mlr (100%) rename {docs6b => docs6}/docs/etymology.md (100%) rename {docs6b => docs6}/docs/etymology.md.in (100%) rename {docs6b/docs/_build/html => docs6/docs}/example.csv (100%) rename {docs6b => docs6}/docs/expo-sample.sh (100%) rename {docs6b => docs6}/docs/extra.css (100%) rename docs6/{ => docs}/factorial-example.mlr (100%) rename {docs6b => docs6}/docs/feature-comparison.md (100%) rename {docs6b => docs6}/docs/feature-comparison.md.in (100%) rename {docs6b => docs6}/docs/features.md (100%) rename {docs6b => docs6}/docs/features.md.in (100%) rename {docs6b => docs6}/docs/file-formats.md (100%) rename {docs6b => docs6}/docs/file-formats.md.in (100%) rename docs6/{ => docs}/for-example.mlr (100%) rename {docs6b => docs6}/docs/genmd-filter (100%) rename {docs6b => docs6}/docs/genmds (100%) rename docs6/{ => docs}/h1foo (100%) rename docs6/{ => docs}/h2foo (100%) rename docs6/{ => docs}/h3foo (100%) rename docs6/{ => docs}/if-example.mlr (100%) rename {docs6b => docs6}/docs/index.md (100%) rename {docs6b => docs6}/docs/index.md.in (100%) rename {docs6b => docs6}/docs/installation.md (100%) rename {docs6b => docs6}/docs/installation.md.in (100%) rename {docs6b => docs6}/docs/internationalization.md (100%) rename {docs6b => docs6}/docs/internationalization.md.in (100%) rename {docs6b => docs6}/docs/joins.md (100%) rename {docs6b => docs6}/docs/joins.md.in (100%) rename {docs6b => docs6}/docs/keystroke-savers.md (100%) rename {docs6b => docs6}/docs/keystroke-savers.md.in (100%) rename docs6/{ => docs}/link.txt (100%) rename {docs6b => docs6}/docs/log-processing-examples.md (100%) rename {docs6b => docs6}/docs/log-processing-examples.md.in (100%) rename {docs6b/docs/_build/html => docs6/docs}/log.txt (100%) rename {docs6b/docs/_build/html => docs6/docs}/make.bat (100%) rename {docs6b => docs6}/docs/manpage.md (100%) rename {docs6b => docs6}/docs/manpage.md.in (100%) rename {docs6b/docs/_build/html => docs6/docs}/manpage.txt (100%) rename {docs6b => docs6}/docs/miller-on-windows.md (100%) rename {docs6b => docs6}/docs/miller-on-windows.md.in (100%) rename {docs6b => docs6}/docs/misc-examples.md (100%) rename {docs6b => docs6}/docs/misc-examples.md.in (100%) rename {docs6b => docs6}/docs/mk-func-h2s.sh (100%) rename docs6/{ => docs}/mk-func-table.rb (100%) rename docs6/{ => docs}/mlr.1 (100%) rename {docs6b => docs6}/docs/morph (100%) rename {docs6b => docs6}/docs/morphs (100%) rename {docs6b/docs/_build/html => docs6/docs}/multi-join/input.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/multi-join/name-lookup.csv (100%) rename {docs6b/docs/_build/html => docs6/docs}/multi-join/status-lookup.csv (100%) rename {docs6b => docs6}/docs/new-in-miller-6.md (100%) rename {docs6b => docs6}/docs/new-in-miller-6.md.in (100%) rename {docs6b/docs/_build/html => docs6/docs}/ngrams/gsl-2000.txt (100%) rename {docs6b/docs/_build/html => docs6/docs}/ngrams/mkv.mlr (100%) mode change 100644 => 100755 rename {docs6b/docs/_build/html => docs6/docs}/ngrams/mkv3.mlr (100%) mode change 100644 => 100755 rename {docs6b/docs/_build/html => docs6/docs}/ngrams/mkv4.mlr (100%) mode change 100644 => 100755 rename {docs6b/docs/_build/html => docs6/docs}/ngrams/mkv5.mlr (100%) mode change 100644 => 100755 rename {docs6b/docs/_build/html => docs6/docs}/ngrams/ng1 (100%) mode change 100644 => 100755 rename {docs6b/docs/_build/html => docs6/docs}/ngrams/ng1.mlr (100%) mode change 100644 => 100755 rename {docs6b/docs/_build/html => docs6/docs}/ngrams/ng1.mlr.txt (100%) mode change 100644 => 100755 rename {docs6b/docs/_build/html => docs6/docs}/ngrams/ng2 (100%) mode change 100644 => 100755 rename {docs6b/docs/_build/html => docs6/docs}/ngrams/ng2.mlr (100%) mode change 100644 => 100755 rename {docs6b/docs/_build/html => docs6/docs}/ngrams/ng2.mlr.txt (100%) mode change 100644 => 100755 rename {docs6b/docs/_build/html => docs6/docs}/ngrams/ng3 (100%) mode change 100644 => 100755 rename {docs6b/docs/_build/html => docs6/docs}/ngrams/ng3.mlr (100%) mode change 100644 => 100755 rename {docs6b/docs/_build/html => docs6/docs}/ngrams/ng3.mlr.txt (100%) mode change 100644 => 100755 rename {docs6b/docs/_build/html => docs6/docs}/ngrams/ng4 (100%) mode change 100644 => 100755 rename {docs6b/docs/_build/html => docs6/docs}/ngrams/ng4.mlr (100%) mode change 100644 => 100755 rename {docs6b/docs/_build/html => docs6/docs}/ngrams/ng4.mlr.txt (100%) mode change 100644 => 100755 rename {docs6b/docs/_build/html => docs6/docs}/ngrams/ng5 (100%) mode change 100644 => 100755 rename {docs6b/docs/_build/html => docs6/docs}/ngrams/ng5.mlr (100%) mode change 100644 => 100755 rename {docs6b/docs/_build/html => docs6/docs}/ngrams/ng5.mlr.txt (100%) mode change 100644 => 100755 rename {docs6b/docs/_build/html => docs6/docs}/ngrams/ngfuncs.mlr (100%) rename {docs6b/docs/_build/html => docs6/docs}/ngrams/ngfuncs.mlr.txt (100%) rename {docs6b/docs/_build/html => docs6/docs}/oosvar-example-ewma.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/oosvar-example-sum-grouped.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/oosvar-example-sum.sh (100%) rename {docs6b => docs6}/docs/operating-on-all-fields.md (100%) rename {docs6b => docs6}/docs/operating-on-all-fields.md.in (100%) rename {docs6b => docs6}/docs/originality.md (100%) rename {docs6b => docs6}/docs/originality.md.in (100%) rename {docs6b => docs6}/docs/output-colorization.md (100%) rename {docs6b => docs6}/docs/output-colorization.md.in (100%) rename {docs6b => docs6}/docs/performance.md (100%) rename {docs6b => docs6}/docs/performance.md.in (100%) rename {docs6b/docs/_build/html => docs6/docs}/pix/colorization.png (100%) rename {docs6b/docs/_build/html => docs6/docs}/pix/colorization.png.000 (100%) rename {docs6b/docs/_build/html => docs6/docs}/pix/colorization2.png (100%) rename {docs6b/docs/_build/html => docs6/docs}/pix/colorization2.png.000 (100%) rename {docs6b/docs/_build/html => docs6/docs}/pix/mand.png (100%) rename {docs6b/docs/_build/html => docs6/docs}/pix/miller-msys-complex.png (100%) rename {docs6b/docs/_build/html => docs6/docs}/pix/miller-msys.png (100%) rename {docs6b/docs/_build/html => docs6/docs}/pix/miller-windows-complex-workaround.png (100%) rename {docs6b/docs/_build/html => docs6/docs}/pix/miller-windows-complex.png (100%) rename {docs6b/docs/_build/html => docs6/docs}/pix/miller-windows-triple-double-quote.png (100%) rename {docs6b/docs/_build/html => docs6/docs}/pix/miller-windows.png (100%) rename {docs6b/docs/_build/html => docs6/docs}/pix/mlr-doc-sepia.jpg (100%) rename {docs6b/docs/_build/html => docs6/docs}/pix/mlr.jpg (100%) rename {docs6b/docs/_build/html => docs6/docs}/pix/omd.png (100%) rename {docs6b/docs/_build/html => docs6/docs}/pix/sepia-overlay.jpg (100%) rename {docs6b/docs/_build/html => docs6/docs}/polyglot-dkvp-io/dkvp_io.py (100%) rename {docs6b/docs/_build/html => docs6/docs}/polyglot-dkvp-io/dkvp_io.rb (100%) rename {docs6b/docs/_build/html => docs6/docs}/polyglot-dkvp-io/example.py (100%) rename {docs6b/docs/_build/html => docs6/docs}/polyglot-dkvp-io/example.rb (100%) rename {docs6b => docs6}/docs/programming-examples.md (100%) rename {docs6b => docs6}/docs/programming-examples.md.in (100%) rename {docs6b => docs6}/docs/programming-language.md (100%) rename {docs6b => docs6}/docs/programming-language.md.in (100%) rename {docs6b/docs/_build/html => docs6/docs}/programs/mand.mlr (100%) rename {docs6b/docs/_build/html => docs6/docs}/programs/mand.sh (100%) rename {docs6b/docs/_build/html => docs6/docs}/programs/sieve.mlr (100%) rename {docs6b => docs6}/docs/randomizing-examples.md (100%) rename {docs6b => docs6}/docs/randomizing-examples.md.in (100%) rename {docs6b => docs6}/docs/record-heterogeneity.md (100%) rename {docs6b => docs6}/docs/record-heterogeneity.md.in (100%) rename {docs6b => docs6}/docs/reference-dsl-arrays.md (100%) rename {docs6b => docs6}/docs/reference-dsl-arrays.md.in (100%) rename {docs6b => docs6}/docs/reference-dsl-builtin-functions.md (100%) rename {docs6b => docs6}/docs/reference-dsl-builtin-functions.md.in (100%) rename {docs6b => docs6}/docs/reference-dsl-complexity.md (100%) rename {docs6b => docs6}/docs/reference-dsl-complexity.md.in (100%) rename {docs6b => docs6}/docs/reference-dsl-control-structures.md (98%) rename {docs6b => docs6}/docs/reference-dsl-control-structures.md.in (100%) rename {docs6b => docs6}/docs/reference-dsl-errors.md (100%) rename {docs6b => docs6}/docs/reference-dsl-errors.md.in (100%) rename {docs6b => docs6}/docs/reference-dsl-filter-statements.md (100%) rename {docs6b => docs6}/docs/reference-dsl-filter-statements.md.in (100%) rename {docs6b => docs6}/docs/reference-dsl-operators.md (100%) rename {docs6b => docs6}/docs/reference-dsl-operators.md.in (100%) rename {docs6b => docs6}/docs/reference-dsl-output-statements.md (100%) rename {docs6b => docs6}/docs/reference-dsl-output-statements.md.in (100%) rename {docs6b => docs6}/docs/reference-dsl-syntax.md (100%) rename {docs6b => docs6}/docs/reference-dsl-syntax.md.in (100%) rename {docs6b => docs6}/docs/reference-dsl-unset-statements.md (100%) rename {docs6b => docs6}/docs/reference-dsl-unset-statements.md.in (100%) rename {docs6b => docs6}/docs/reference-dsl-user-defined-functions.md (100%) rename {docs6b => docs6}/docs/reference-dsl-user-defined-functions.md.in (100%) rename {docs6b => docs6}/docs/reference-dsl-variables.md (100%) rename {docs6b => docs6}/docs/reference-dsl-variables.md.in (100%) rename {docs6b => docs6}/docs/reference-dsl.md (100%) rename {docs6b => docs6}/docs/reference-dsl.md.in (100%) rename {docs6b => docs6}/docs/reference-main-arithmetic.md (100%) rename {docs6b => docs6}/docs/reference-main-arithmetic.md.in (100%) rename {docs6b => docs6}/docs/reference-main-auxiliary-commands.md (100%) rename {docs6b => docs6}/docs/reference-main-auxiliary-commands.md.in (100%) rename {docs6b => docs6}/docs/reference-main-data-types.md (100%) rename {docs6b => docs6}/docs/reference-main-data-types.md.in (100%) rename {docs6b => docs6}/docs/reference-main-env-vars.md (100%) rename {docs6b => docs6}/docs/reference-main-env-vars.md.in (100%) rename {docs6b => docs6}/docs/reference-main-io-options.md (100%) rename {docs6b => docs6}/docs/reference-main-io-options.md.in (100%) rename {docs6b => docs6}/docs/reference-main-null-data.md (100%) rename {docs6b => docs6}/docs/reference-main-null-data.md.in (100%) rename {docs6b => docs6}/docs/reference-main-online-help.md (100%) rename {docs6b => docs6}/docs/reference-main-online-help.md.in (100%) rename {docs6b => docs6}/docs/reference-main-overview.md (100%) rename {docs6b => docs6}/docs/reference-main-overview.md.in (100%) rename {docs6b => docs6}/docs/reference-main-regular-expressions.md (100%) rename {docs6b => docs6}/docs/reference-main-regular-expressions.md.in (100%) rename {docs6b => docs6}/docs/reference-main-then-chaining.md (100%) rename {docs6b => docs6}/docs/reference-main-then-chaining.md.in (100%) rename {docs6b => docs6}/docs/reference-verbs.md (100%) rename {docs6b => docs6}/docs/reference-verbs.md.in (100%) rename {docs6b => docs6}/docs/release-docs.md (100%) rename {docs6b => docs6}/docs/release-docs.md.in (100%) rename {docs6b => docs6}/docs/repl.md (100%) rename {docs6b => docs6}/docs/repl.md.in (100%) rename {docs6b/docs/_build/html => docs6/docs}/sample_mlrrc (100%) rename {docs6b => docs6}/docs/shapes-of-data.md (100%) rename {docs6b => docs6}/docs/shapes-of-data.md.in (100%) rename {docs6b => docs6}/docs/shell-commands.md (100%) rename {docs6b => docs6}/docs/shell-commands.md.in (100%) rename {docs6b => docs6}/docs/special-symbols-and-formatting.md (100%) rename {docs6b => docs6}/docs/special-symbols-and-formatting.md.in (100%) rename {docs => docs6/docs}/sphinx-hack/data (100%) rename docs6/{ => docs}/sphinx-hack/multi-join (100%) rename docs6/{ => docs}/sphinx-hack/ngrams (100%) rename docs6/{ => docs}/sphinx-hack/pix (100%) rename docs6/{ => docs}/sphinx-hack/polyglot-dkvp-io (100%) rename {docs => docs6/docs}/sphinx-hack/programs (100%) rename {docs6b => docs6}/docs/sql-examples.md (100%) rename {docs6b => docs6}/docs/sql-examples.md.in (100%) rename {docs6b/docs/_build/html => docs6/docs}/square.csv (100%) rename {docs6b => docs6}/docs/statistics-examples.md (100%) rename {docs6b => docs6}/docs/statistics-examples.md.in (100%) rename {docs6b => docs6}/docs/then-chaining.md (100%) rename {docs6b => docs6}/docs/then-chaining.md.in (100%) rename {docs6b/docs/_build/html => docs6/docs}/triangle.csv (100%) rename {docs6b => docs6}/docs/two-pass-algorithms.md (100%) rename {docs6b => docs6}/docs/two-pass-algorithms.md.in (100%) rename {docs6b/docs/_build/html => docs6/docs}/variance.mlr (100%) rename {docs6b/docs/_build/html => docs6/docs}/verb-example-ewma.sh (100%) rename {docs6b => docs6}/docs/why.md (100%) rename {docs6b => docs6}/docs/why.md.in (100%) rename {docs6b => docs6}/docs/x (100%) delete mode 100644 docs6/etymology.rst delete mode 100644 docs6/etymology.rst.in delete mode 100644 docs6/feature-comparison.rst delete mode 100644 docs6/feature-comparison.rst.in delete mode 100644 docs6/features.rst delete mode 100644 docs6/features.rst.in delete mode 100644 docs6/file-formats.rst delete mode 100644 docs6/file-formats.rst.in delete mode 100755 docs6/genrst-filter delete mode 100755 docs6/genrsts delete mode 100644 docs6/index.rst delete mode 100644 docs6/installation.rst delete mode 100644 docs6/installation.rst.in delete mode 100644 docs6/internationalization.rst delete mode 100644 docs6/internationalization.rst.in delete mode 100644 docs6/introduction.rst delete mode 100644 docs6/introduction.rst.in delete mode 100644 docs6/joins.rst delete mode 100644 docs6/joins.rst.in delete mode 100644 docs6/keystroke-savers.rst delete mode 100644 docs6/keystroke-savers.rst.in delete mode 100644 docs6/log-processing-examples.rst delete mode 100644 docs6/log-processing-examples.rst.in delete mode 100644 docs6/manpage.rst delete mode 100644 docs6/manpage.rst.in delete mode 100644 docs6/miller-on-windows.rst delete mode 100644 docs6/miller-on-windows.rst.in delete mode 100644 docs6/misc-examples.rst delete mode 100644 docs6/misc-examples.rst.in delete mode 100755 docs6/mk-func-h2s.sh rename {docs6b => docs6}/mkdocs.yml (100%) delete mode 100755 docs6/morph delete mode 100755 docs6/morphs delete mode 100644 docs6/new-in-miller-6.rst delete mode 100644 docs6/new-in-miller-6.rst.in delete mode 100644 docs6/operating-on-all-fields.rst delete mode 100644 docs6/operating-on-all-fields.rst.in delete mode 100644 docs6/originality.rst delete mode 100644 docs6/originality.rst.in delete mode 100644 docs6/output-colorization.rst delete mode 100644 docs6/output-colorization.rst.in delete mode 100644 docs6/performance.rst delete mode 100644 docs6/performance.rst.in delete mode 100644 docs6/programming-examples.rst delete mode 100644 docs6/programming-examples.rst.in delete mode 100644 docs6/programming-language.rst delete mode 100644 docs6/programming-language.rst.in delete mode 100644 docs6/randomizing-examples.rst delete mode 100644 docs6/randomizing-examples.rst.in delete mode 100644 docs6/record-heterogeneity.rst delete mode 100644 docs6/record-heterogeneity.rst.in delete mode 100644 docs6/reference-dsl-arrays.rst delete mode 100644 docs6/reference-dsl-arrays.rst.in delete mode 100644 docs6/reference-dsl-builtin-functions.rst delete mode 100644 docs6/reference-dsl-builtin-functions.rst.in delete mode 100644 docs6/reference-dsl-complexity.rst delete mode 100644 docs6/reference-dsl-complexity.rst.in delete mode 100644 docs6/reference-dsl-control-structures.rst delete mode 100644 docs6/reference-dsl-control-structures.rst.in delete mode 100644 docs6/reference-dsl-errors.rst delete mode 100644 docs6/reference-dsl-errors.rst.in delete mode 100644 docs6/reference-dsl-filter-statements.rst delete mode 100644 docs6/reference-dsl-filter-statements.rst.in delete mode 100644 docs6/reference-dsl-operators.rst delete mode 100644 docs6/reference-dsl-operators.rst.in delete mode 100644 docs6/reference-dsl-output-statements.rst delete mode 100644 docs6/reference-dsl-output-statements.rst.in delete mode 100644 docs6/reference-dsl-syntax.rst delete mode 100644 docs6/reference-dsl-syntax.rst.in delete mode 100644 docs6/reference-dsl-unset-statements.rst delete mode 100644 docs6/reference-dsl-unset-statements.rst.in delete mode 100644 docs6/reference-dsl-user-defined-functions.rst delete mode 100644 docs6/reference-dsl-user-defined-functions.rst.in delete mode 100644 docs6/reference-dsl-variables.rst delete mode 100644 docs6/reference-dsl-variables.rst.in delete mode 100644 docs6/reference-dsl.rst delete mode 100644 docs6/reference-dsl.rst.in delete mode 100644 docs6/reference-main-arithmetic.rst delete mode 100644 docs6/reference-main-arithmetic.rst.in delete mode 100644 docs6/reference-main-auxiliary-commands.rst delete mode 100644 docs6/reference-main-auxiliary-commands.rst.in delete mode 100644 docs6/reference-main-data-types.rst delete mode 100644 docs6/reference-main-data-types.rst.in delete mode 100644 docs6/reference-main-env-vars.rst delete mode 100644 docs6/reference-main-env-vars.rst.in delete mode 100644 docs6/reference-main-io-options.rst delete mode 100644 docs6/reference-main-io-options.rst.in delete mode 100644 docs6/reference-main-null-data.rst delete mode 100644 docs6/reference-main-null-data.rst.in delete mode 100644 docs6/reference-main-online-help.rst delete mode 100644 docs6/reference-main-online-help.rst.in delete mode 100644 docs6/reference-main-overview.rst delete mode 100644 docs6/reference-main-overview.rst.in delete mode 100644 docs6/reference-main-regular-expressions.rst delete mode 100644 docs6/reference-main-regular-expressions.rst.in delete mode 100644 docs6/reference-main-then-chaining.rst delete mode 100644 docs6/reference-main-then-chaining.rst.in delete mode 100644 docs6/reference-verbs.rst delete mode 100644 docs6/reference-verbs.rst.in delete mode 100644 docs6/release-docs.rst delete mode 100644 docs6/release-docs.rst.in delete mode 100644 docs6/repl.rst delete mode 100644 docs6/repl.rst.in delete mode 100644 docs6/rework.txt delete mode 100644 docs6/shapes-of-data.rst delete mode 100644 docs6/shapes-of-data.rst.in delete mode 100644 docs6/shell-commands.rst delete mode 100644 docs6/shell-commands.rst.in delete mode 100644 docs6/special-symbols-and-formatting.rst delete mode 100644 docs6/special-symbols-and-formatting.rst.in delete mode 120000 docs6/sphinx-hack/data delete mode 120000 docs6/sphinx-hack/programs delete mode 100644 docs6/sql-examples.rst delete mode 100644 docs6/sql-examples.rst.in delete mode 100644 docs6/statistics-examples.rst delete mode 100644 docs6/statistics-examples.rst.in delete mode 100644 docs6/then-chaining.rst delete mode 100644 docs6/then-chaining.rst.in delete mode 100644 docs6/two-pass-algorithms.rst delete mode 100644 docs6/two-pass-algorithms.rst.in delete mode 100644 docs6/why.rst delete mode 100644 docs6/why.rst.in delete mode 100644 docs6b/README.md delete mode 100644 docs6b/docs/_build/html/10-1.sh delete mode 100644 docs6b/docs/_build/html/10-2.sh delete mode 100644 docs6b/docs/_build/html/data/begin-end-example-1.sh delete mode 100644 docs6b/docs/_build/html/data/begin-end-example-2.sh delete mode 100644 docs6b/docs/_build/html/data/begin-end-example-3.sh delete mode 100644 docs6b/docs/_build/html/data/begin-end-example-4.sh delete mode 100644 docs6b/docs/_build/html/data/begin-end-example-5.sh delete mode 100644 docs6b/docs/_build/html/data/begin-end-example-6.sh delete mode 100644 docs6b/docs/_build/html/data/begin-end-example-7.sh delete mode 100644 docs6b/docs/_build/html/data/sar.mlr delete mode 100644 docs6b/docs/_build/html/expo-sample.sh delete mode 100644 docs6b/docs/_static/basic.css delete mode 100644 docs6b/docs/_static/classic.css delete mode 100644 docs6b/docs/_static/mlr.jpg delete mode 100644 docs6b/docs/_static/pygments.css delete mode 100644 docs6b/docs/_static/scrolls.css delete mode 100644 docs6b/docs/_static/top.png delete mode 100644 docs6b/docs/absent-example.json delete mode 100644 docs6b/docs/circle.csv delete mode 100644 docs6b/docs/commas.csv delete mode 100644 docs6b/docs/context-example.mlr delete mode 100644 docs6b/docs/coverart/cover-cat.png delete mode 100644 docs6b/docs/coverart/cover-combined.png delete mode 100644 docs6b/docs/coverart/cover-filter-to-json.png delete mode 100644 docs6b/docs/coverart/cover-sort-to-pprint.png delete mode 100755 docs6b/docs/coverart/coverart.key delete mode 100644 docs6b/docs/data/a.csv delete mode 100644 docs6b/docs/data/a.dkvp delete mode 100644 docs6b/docs/data/array-example.json delete mode 100644 docs6b/docs/data/b.csv delete mode 100644 docs6b/docs/data/b.dkvp delete mode 100644 docs6b/docs/data/begin-end-example-6a.sh delete mode 100644 docs6b/docs/data/begin-end-example-7b.sh delete mode 100644 docs6b/docs/data/begin-end-example-8.sh delete mode 100644 docs6b/docs/data/budget.csv delete mode 100644 docs6b/docs/data/bulk-rename-for-loop.mlr delete mode 100644 docs6b/docs/data/clean-whitespace.csv delete mode 100644 docs6b/docs/data/color-codes.csv delete mode 100644 docs6b/docs/data/color-names.csv delete mode 100644 docs6b/docs/data/colored-shapes.csv delete mode 100644 docs6b/docs/data/colored-shapes.dkvp delete mode 100644 docs6b/docs/data/colours.csv delete mode 100644 docs6b/docs/data/current_counters.csv delete mode 100644 docs6b/docs/data/currtemp.csv delete mode 100644 docs6b/docs/data/dollar-sign.txt delete mode 100644 docs6b/docs/data/dynamic-nr.sh delete mode 100644 docs6b/docs/data/emit-lashed.sh delete mode 100644 docs6b/docs/data/english-words.txt delete mode 100644 docs6b/docs/data/factorial-example.sh delete mode 100644 docs6b/docs/data/fe-example-1.sh delete mode 100644 docs6b/docs/data/fe-example-2.sh delete mode 100644 docs6b/docs/data/fe-example-3.mlr delete mode 100644 docs6b/docs/data/fe-example-4.mlr delete mode 100644 docs6b/docs/data/feature-count.mlr delete mode 100644 docs6b/docs/data/features.json delete mode 100644 docs6b/docs/data/fibo-cached.sh delete mode 100644 docs6b/docs/data/fibo-uncached.sh delete mode 100644 docs6b/docs/data/fill-down.csv delete mode 100644 docs6b/docs/data/filter-multiline-example.txt delete mode 100644 docs6b/docs/data/flins.csv delete mode 100644 docs6b/docs/data/flins.json delete mode 100644 docs6b/docs/data/for-oosvar-example-0a.txt delete mode 100644 docs6b/docs/data/for-oosvar-example-0b.sh delete mode 100644 docs6b/docs/data/for-oosvar-example-0c.sh delete mode 100644 docs6b/docs/data/for-oosvar-example-0d.sh delete mode 100644 docs6b/docs/data/for-oosvar-example-0e.sh delete mode 100644 docs6b/docs/data/for-srec-example-1.sh delete mode 100644 docs6b/docs/data/for-srec-example-2.sh delete mode 100644 docs6b/docs/data/for-srec-example-3.sh delete mode 100644 docs6b/docs/data/for-srec-example.tbl delete mode 100644 docs6b/docs/data/fraction-example.csv delete mode 100644 docs6b/docs/data/full-reorg.sh delete mode 100644 docs6b/docs/data/headerless.csv delete mode 100644 docs6b/docs/data/het-bool.csv delete mode 100644 docs6b/docs/data/het.csv delete mode 100644 docs6b/docs/data/het.dkvp delete mode 100644 docs6b/docs/data/if-chain.sh delete mode 100644 docs6b/docs/data/inout.csv delete mode 100644 docs6b/docs/data/iqr1.sh delete mode 100644 docs6b/docs/data/iqrn.sh delete mode 100644 docs6b/docs/data/join-left-example.csv delete mode 100644 docs6b/docs/data/join-right-example.csv delete mode 100644 docs6b/docs/data/join-u-left.csv delete mode 100644 docs6b/docs/data/join-u-right.csv delete mode 100644 docs6b/docs/data/json-example-1.json delete mode 100644 docs6b/docs/data/json-example-2.json delete mode 100644 docs6b/docs/data/json-example-3.json delete mode 100644 docs6b/docs/data/keyed-mean-with-oosvars.sh delete mode 100644 docs6b/docs/data/keyed-min-max-with-oosvars.sh delete mode 100644 docs6b/docs/data/label-example.txt delete mode 100644 docs6b/docs/data/linreg-example.jpg delete mode 100644 docs6b/docs/data/linreg-example.txt delete mode 100755 docs6b/docs/data/local-example-1.sh delete mode 100755 docs6b/docs/data/map-literal-example-1.sh delete mode 100755 docs6b/docs/data/map-literal-example-2.sh delete mode 100755 docs6b/docs/data/map-literal-example-3.sh delete mode 100644 docs6b/docs/data/maxrows.mlr delete mode 100644 docs6b/docs/data/maxrows.tsv delete mode 100644 docs6b/docs/data/mean-with-oosvars.sh delete mode 100644 docs6b/docs/data/medium delete mode 100644 docs6b/docs/data/medium-squares delete mode 100644 docs6b/docs/data/miss-date-1.sh delete mode 100644 docs6b/docs/data/miss-date-2.sh delete mode 100644 docs6b/docs/data/miss-date.csv delete mode 100755 docs6b/docs/data/mkdat2 delete mode 100644 docs6b/docs/data/multicountdown.dat delete mode 100644 docs6b/docs/data/multicountdown.rb delete mode 100644 docs6b/docs/data/mydata.txt delete mode 100644 docs6b/docs/data/nested.tsv delete mode 100644 docs6b/docs/data/newline-example.txt delete mode 100644 docs6b/docs/data/ping-delta-example.txt delete mode 100644 docs6b/docs/data/previous-to-current.sh delete mode 100644 docs6b/docs/data/previous_counters.csv delete mode 100644 docs6b/docs/data/prevtemp.csv delete mode 100644 docs6b/docs/data/put-gating-example-1.dkvp delete mode 100644 docs6b/docs/data/put-gating-example-2.dkvp delete mode 100644 docs6b/docs/data/put-multiline-example.txt delete mode 100644 docs6b/docs/data/question.dat delete mode 100644 docs6b/docs/data/ragged-csv-2.sh delete mode 100755 docs6b/docs/data/ragged-csv.sh delete mode 100644 docs6b/docs/data/ragged.csv delete mode 100644 docs6b/docs/data/rect-inner.txt delete mode 100644 docs6b/docs/data/rect-middle.txt delete mode 100644 docs6b/docs/data/rect-outer.txt delete mode 100644 docs6b/docs/data/rect.sh delete mode 100644 docs6b/docs/data/rect.txt delete mode 100644 docs6b/docs/data/regex-in-data.dat delete mode 100644 docs6b/docs/data/remove-empty-columns.csv delete mode 100644 docs6b/docs/data/repeat-example.dat delete mode 100644 docs6b/docs/data/repeats.dkvp delete mode 100644 docs6b/docs/data/sample-example.txt delete mode 100644 docs6b/docs/data/sar.csv delete mode 100644 docs6b/docs/data/scan-example-1.tbl delete mode 100644 docs6b/docs/data/scan-example-2.tbl delete mode 100644 docs6b/docs/data/scope-example.dat delete mode 100644 docs6b/docs/data/scope-example.mlr delete mode 100644 docs6b/docs/data/self-join.csv delete mode 100644 docs6b/docs/data/semicolon-example.txt delete mode 100755 docs6b/docs/data/single-for-example-1.sh delete mode 100755 docs6b/docs/data/single-for-example-2.sh delete mode 100644 docs6b/docs/data/single-quote-example.mlr delete mode 100644 docs6b/docs/data/small delete mode 100644 docs6b/docs/data/small.csv delete mode 100644 docs6b/docs/data/small2 delete mode 100644 docs6b/docs/data/sort-het.dkvp delete mode 100644 docs6b/docs/data/sort-missing.dkvp delete mode 100644 docs6b/docs/data/sort-null.dat delete mode 100644 docs6b/docs/data/sort-within-records.json delete mode 100644 docs6b/docs/data/spaces.csv delete mode 100644 docs6b/docs/data/sparse.json delete mode 100644 docs6b/docs/data/subcommand-example.txt delete mode 100644 docs6b/docs/data/subr-example.sh delete mode 100644 docs6b/docs/data/system-file-ojson-example.txt delete mode 100644 docs6b/docs/data/system-file-opprint-example.txt delete mode 100644 docs6b/docs/data/system-file-oxtab-example.txt delete mode 100644 docs6b/docs/data/then-chaining-performance.txt delete mode 100644 docs6b/docs/data/then-example.csv delete mode 100644 docs6b/docs/data/timing-example.txt delete mode 100755 docs6b/docs/data/trailing-commas.sh delete mode 100644 docs6b/docs/data/triple-for-example-1.sh delete mode 100644 docs6b/docs/data/triple-for-example-2.sh delete mode 100644 docs6b/docs/data/trivial-records.csv delete mode 100644 docs6b/docs/data/two-pass-percentage.sh delete mode 100644 docs6b/docs/data/two-pass-record-numbers.sh delete mode 100644 docs6b/docs/data/type-decl-example.mlr delete mode 100644 docs6b/docs/data/unsparsify.mlr delete mode 100644 docs6b/docs/data/weighted-mean.sh delete mode 100644 docs6b/docs/data/while-example-1.sh delete mode 100644 docs6b/docs/data/while-example-2.sh delete mode 100644 docs6b/docs/dates.csv delete mode 100644 docs6b/docs/dsl-example-multiline.sh delete mode 100644 docs6b/docs/dsl-example.mlr delete mode 100644 docs6b/docs/example.csv delete mode 100644 docs6b/docs/factorial-example.mlr delete mode 100644 docs6b/docs/for-example.mlr delete mode 100755 docs6b/docs/h1foo delete mode 100755 docs6b/docs/h2foo delete mode 100755 docs6b/docs/h3foo delete mode 100644 docs6b/docs/if-example.mlr delete mode 100644 docs6b/docs/link.txt delete mode 100644 docs6b/docs/log.txt delete mode 100644 docs6b/docs/make.bat delete mode 100644 docs6b/docs/manpage.txt delete mode 100755 docs6b/docs/mk-func-table.rb delete mode 100644 docs6b/docs/mlr.1 delete mode 100644 docs6b/docs/multi-join/input.csv delete mode 100644 docs6b/docs/multi-join/name-lookup.csv delete mode 100644 docs6b/docs/multi-join/status-lookup.csv delete mode 100644 docs6b/docs/ngrams/gsl-2000.txt delete mode 100755 docs6b/docs/ngrams/mkv.mlr delete mode 100755 docs6b/docs/ngrams/mkv3.mlr delete mode 100755 docs6b/docs/ngrams/mkv4.mlr delete mode 100755 docs6b/docs/ngrams/mkv5.mlr delete mode 100755 docs6b/docs/ngrams/ng1 delete mode 100755 docs6b/docs/ngrams/ng1.mlr delete mode 100755 docs6b/docs/ngrams/ng1.mlr.txt delete mode 100755 docs6b/docs/ngrams/ng2 delete mode 100755 docs6b/docs/ngrams/ng2.mlr delete mode 100755 docs6b/docs/ngrams/ng2.mlr.txt delete mode 100755 docs6b/docs/ngrams/ng3 delete mode 100755 docs6b/docs/ngrams/ng3.mlr delete mode 100755 docs6b/docs/ngrams/ng3.mlr.txt delete mode 100755 docs6b/docs/ngrams/ng4 delete mode 100755 docs6b/docs/ngrams/ng4.mlr delete mode 100755 docs6b/docs/ngrams/ng4.mlr.txt delete mode 100755 docs6b/docs/ngrams/ng5 delete mode 100755 docs6b/docs/ngrams/ng5.mlr delete mode 100755 docs6b/docs/ngrams/ng5.mlr.txt delete mode 100644 docs6b/docs/ngrams/ngfuncs.mlr delete mode 100644 docs6b/docs/ngrams/ngfuncs.mlr.txt delete mode 100644 docs6b/docs/oosvar-example-ewma.sh delete mode 100644 docs6b/docs/oosvar-example-sum-grouped.sh delete mode 100644 docs6b/docs/oosvar-example-sum.sh delete mode 100644 docs6b/docs/pix/colorization.png delete mode 100644 docs6b/docs/pix/colorization.png.000 delete mode 100644 docs6b/docs/pix/colorization2.png delete mode 100644 docs6b/docs/pix/colorization2.png.000 delete mode 100644 docs6b/docs/pix/mand.png delete mode 100644 docs6b/docs/pix/miller-msys-complex.png delete mode 100644 docs6b/docs/pix/miller-msys.png delete mode 100644 docs6b/docs/pix/miller-windows-complex-workaround.png delete mode 100644 docs6b/docs/pix/miller-windows-complex.png delete mode 100644 docs6b/docs/pix/miller-windows-triple-double-quote.png delete mode 100644 docs6b/docs/pix/miller-windows.png delete mode 100644 docs6b/docs/pix/mlr-doc-sepia.jpg delete mode 100644 docs6b/docs/pix/mlr.jpg delete mode 100644 docs6b/docs/pix/omd.png delete mode 100644 docs6b/docs/pix/sepia-overlay.jpg delete mode 100644 docs6b/docs/polyglot-dkvp-io/dkvp_io.py delete mode 100644 docs6b/docs/polyglot-dkvp-io/dkvp_io.rb delete mode 100644 docs6b/docs/polyglot-dkvp-io/example.py delete mode 100644 docs6b/docs/polyglot-dkvp-io/example.rb delete mode 100644 docs6b/docs/programs/mand.mlr delete mode 100644 docs6b/docs/programs/mand.sh delete mode 100644 docs6b/docs/programs/sieve.mlr delete mode 100644 docs6b/docs/sample_mlrrc delete mode 120000 docs6b/docs/sphinx-hack/data delete mode 120000 docs6b/docs/sphinx-hack/multi-join delete mode 120000 docs6b/docs/sphinx-hack/ngrams delete mode 120000 docs6b/docs/sphinx-hack/pix delete mode 120000 docs6b/docs/sphinx-hack/polyglot-dkvp-io delete mode 120000 docs6b/docs/sphinx-hack/programs delete mode 100644 docs6b/docs/square.csv delete mode 100644 docs6b/docs/triangle.csv delete mode 100644 docs6b/docs/variance.mlr delete mode 100644 docs6b/docs/verb-example-ewma.sh delete mode 100644 docs6b/wishlist.txt diff --git a/.gitignore b/.gitignore index 76a561e72..bd29c297b 100644 --- a/.gitignore +++ b/.gitignore @@ -120,4 +120,4 @@ experiments/dsl-parser/two/main experiments/cli-parser/cliparse experiments/cli-parser/cliparse.exe -docs6b/site/ +docs6/site/ diff --git a/docs/sphinx-hack/multi-join b/docs/sphinx-hack/multi-join deleted file mode 120000 index 7cb002ebb..000000000 --- a/docs/sphinx-hack/multi-join +++ /dev/null @@ -1 +0,0 @@ -../multi-join \ No newline at end of file diff --git a/docs/sphinx-hack/ngrams b/docs/sphinx-hack/ngrams deleted file mode 120000 index 9bc8fb86d..000000000 --- a/docs/sphinx-hack/ngrams +++ /dev/null @@ -1 +0,0 @@ -../ngrams \ No newline at end of file diff --git a/docs/sphinx-hack/polyglot-dkvp-io b/docs/sphinx-hack/polyglot-dkvp-io deleted file mode 120000 index 911f19c4a..000000000 --- a/docs/sphinx-hack/polyglot-dkvp-io +++ /dev/null @@ -1 +0,0 @@ -../polyglot-dkvp-io \ No newline at end of file diff --git a/docs6/.vimrc b/docs6/.vimrc deleted file mode 100644 index 3c9b75a7a..000000000 --- a/docs6/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -map \d :w:!clear;build-one % -map \f :w:!clear;make html diff --git a/docs6/10min.rst b/docs6/10min.rst deleted file mode 100644 index b59011406..000000000 --- a/docs6/10min.rst +++ /dev/null @@ -1,653 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Miller in 10 minutes -==================== - -Obtaining Miller -^^^^^^^^^^^^^^^^ - -You can install Miller for various platforms as follows: - -* Linux: ``yum install miller`` or ``apt-get install miller`` depending on your flavor of Linux -* MacOS: ``brew install miller`` or ``port install miller`` depending on your preference of `Homebrew `_ or `MacPorts `_. -* Windows: ``choco install miller`` using `Chocolatey `_. -* You can get latest builds for Linux, MacOS, and Windows by visiting https://github.com/johnkerl/miller/actions, selecting the latest build, and clicking _Artifacts_. (These are retained for 5 days after each commit.) -* See also :doc:`build` if you prefer -- in particular, if your platform's package manager doesn't have the latest release. - -As a first check, you should be able to run ``mlr --version`` at your system's command prompt and see something like the following: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --version - Miller v6.0.0-dev - -As a second check, given (`example.csv <./example.csv>`_) you should be able to do - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv cat example.csv - color,shape,flag,index,quantity,rate - yellow,triangle,true,11,43.6498,9.8870 - red,square,true,15,79.2778,0.0130 - red,circle,true,16,13.8103,2.9010 - red,square,false,48,77.5542,7.4670 - purple,triangle,false,51,81.2290,8.5910 - red,square,false,64,77.1991,9.5310 - purple,triangle,false,65,80.1405,5.8240 - yellow,circle,true,73,63.9785,4.2370 - yellow,circle,true,87,63.5058,8.3350 - purple,square,false,91,72.3735,8.2430 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --opprint cat example.csv - color shape flag index quantity rate - yellow triangle true 11 43.6498 9.8870 - red square true 15 79.2778 0.0130 - red circle true 16 13.8103 2.9010 - red square false 48 77.5542 7.4670 - purple triangle false 51 81.2290 8.5910 - red square false 64 77.1991 9.5310 - purple triangle false 65 80.1405 5.8240 - yellow circle true 73 63.9785 4.2370 - yellow circle true 87 63.5058 8.3350 - purple square false 91 72.3735 8.2430 - -If you run into issues on these checks, please check out the resources on the :doc:`community` page for help. - -Miller verbs -^^^^^^^^^^^^ - -Let's take a quick look at some of the most useful Miller verbs -- file-format-aware, name-index-empowered equivalents of standard system commands. - -``mlr cat`` is like system ``cat`` (or ``type`` on Windows) -- it passes the data through unmodified: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv cat example.csv - color,shape,flag,index,quantity,rate - yellow,triangle,true,11,43.6498,9.8870 - red,square,true,15,79.2778,0.0130 - red,circle,true,16,13.8103,2.9010 - red,square,false,48,77.5542,7.4670 - purple,triangle,false,51,81.2290,8.5910 - red,square,false,64,77.1991,9.5310 - purple,triangle,false,65,80.1405,5.8240 - yellow,circle,true,73,63.9785,4.2370 - yellow,circle,true,87,63.5058,8.3350 - purple,square,false,91,72.3735,8.2430 - -But ``mlr cat`` can also do format conversion -- for example, you can pretty-print in tabular format: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --opprint cat example.csv - color shape flag index quantity rate - yellow triangle true 11 43.6498 9.8870 - red square true 15 79.2778 0.0130 - red circle true 16 13.8103 2.9010 - red square false 48 77.5542 7.4670 - purple triangle false 51 81.2290 8.5910 - red square false 64 77.1991 9.5310 - purple triangle false 65 80.1405 5.8240 - yellow circle true 73 63.9785 4.2370 - yellow circle true 87 63.5058 8.3350 - purple square false 91 72.3735 8.2430 - -``mlr head`` and ``mlr tail`` count records rather than lines. Whether you're getting the first few records or the last few, the CSV header is included either way: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv head -n 4 example.csv - color,shape,flag,index,quantity,rate - yellow,triangle,true,11,43.6498,9.8870 - red,square,true,15,79.2778,0.0130 - red,circle,true,16,13.8103,2.9010 - red,square,false,48,77.5542,7.4670 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv tail -n 4 example.csv - color,shape,flag,index,quantity,rate - purple,triangle,false,65,80.1405,5.8240 - yellow,circle,true,73,63.9785,4.2370 - yellow,circle,true,87,63.5058,8.3350 - purple,square,false,91,72.3735,8.2430 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --ojson tail -n 2 example.csv - { - "color": "yellow", - "shape": "circle", - "flag": true, - "index": 87, - "quantity": 63.5058, - "rate": 8.3350 - } - { - "color": "purple", - "shape": "square", - "flag": false, - "index": 91, - "quantity": 72.3735, - "rate": 8.2430 - } - -You can sort on a single field: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --opprint sort -f shape example.csv - color shape flag index quantity rate - red circle true 16 13.8103 2.9010 - yellow circle true 73 63.9785 4.2370 - yellow circle true 87 63.5058 8.3350 - red square true 15 79.2778 0.0130 - red square false 48 77.5542 7.4670 - red square false 64 77.1991 9.5310 - purple square false 91 72.3735 8.2430 - yellow triangle true 11 43.6498 9.8870 - purple triangle false 51 81.2290 8.5910 - purple triangle false 65 80.1405 5.8240 - -Or, you can sort primarily alphabetically on one field, then secondarily numerically descending on another field, and so on: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --opprint sort -f shape -nr index example.csv - color shape flag index quantity rate - yellow circle true 87 63.5058 8.3350 - yellow circle true 73 63.9785 4.2370 - red circle true 16 13.8103 2.9010 - purple square false 91 72.3735 8.2430 - red square false 64 77.1991 9.5310 - red square false 48 77.5542 7.4670 - red square true 15 79.2778 0.0130 - purple triangle false 65 80.1405 5.8240 - purple triangle false 51 81.2290 8.5910 - yellow triangle true 11 43.6498 9.8870 - -If there are fields you don't want to see in your data, you can use ``cut`` to keep only the ones you want, in the same order they appeared in the input data: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --opprint cut -f flag,shape example.csv - shape flag - triangle true - square true - circle true - square false - triangle false - square false - triangle false - circle true - circle true - square false - -You can also use ``cut -o`` to keep specified fields, but in your preferred order: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --opprint cut -o -f flag,shape example.csv - flag shape - true triangle - true square - true circle - false square - false triangle - false square - false triangle - true circle - true circle - false square - -You can use ``cut -x`` to omit fields you don't care about: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --opprint cut -x -f flag,shape example.csv - color index quantity rate - yellow 11 43.6498 9.8870 - red 15 79.2778 0.0130 - red 16 13.8103 2.9010 - red 48 77.5542 7.4670 - purple 51 81.2290 8.5910 - red 64 77.1991 9.5310 - purple 65 80.1405 5.8240 - yellow 73 63.9785 4.2370 - yellow 87 63.5058 8.3350 - purple 91 72.3735 8.2430 - -You can use ``filter`` to keep only records you care about: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --opprint filter '$color == "red"' example.csv - color shape flag index quantity rate - red square true 15 79.2778 0.0130 - red circle true 16 13.8103 2.9010 - red square false 48 77.5542 7.4670 - red square false 64 77.1991 9.5310 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --opprint filter '$color == "red" && $flag == true' example.csv - color shape flag index quantity rate - red square true 15 79.2778 0.0130 - red circle true 16 13.8103 2.9010 - -You can use ``put`` to create new fields which are computed from other fields: - -.. code-block:: none - :emphasize-lines: 1-4 - - mlr --icsv --opprint put ' - $ratio = $quantity / $rate; - $color_shape = $color . "_" . $shape - ' example.csv - color shape flag index quantity rate ratio color_shape - yellow triangle true 11 43.6498 9.8870 4.414868008496004 yellow_triangle - red square true 15 79.2778 0.0130 6098.292307692308 red_square - red circle true 16 13.8103 2.9010 4.760530851430541 red_circle - red square false 48 77.5542 7.4670 10.386259541984733 red_square - purple triangle false 51 81.2290 8.5910 9.455127458968688 purple_triangle - red square false 64 77.1991 9.5310 8.099790158430384 red_square - purple triangle false 65 80.1405 5.8240 13.760388049450551 purple_triangle - yellow circle true 73 63.9785 4.2370 15.09995279679018 yellow_circle - yellow circle true 87 63.5058 8.3350 7.619172165566886 yellow_circle - purple square false 91 72.3735 8.2430 8.779995147397793 purple_square - -Even though Miller's main selling point is name-indexing, sometimes you really want to refer to a field name by its positional index. Use ``$[[3]]`` to access the name of field 3 or ``$[[[3]]]`` to access the value of field 3: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --opprint put '$[[3]] = "NEW"' example.csv - color shape NEW index quantity rate - yellow triangle true 11 43.6498 9.8870 - red square true 15 79.2778 0.0130 - red circle true 16 13.8103 2.9010 - red square false 48 77.5542 7.4670 - purple triangle false 51 81.2290 8.5910 - red square false 64 77.1991 9.5310 - purple triangle false 65 80.1405 5.8240 - yellow circle true 73 63.9785 4.2370 - yellow circle true 87 63.5058 8.3350 - purple square false 91 72.3735 8.2430 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --opprint put '$[[[3]]] = "NEW"' example.csv - color shape flag index quantity rate - yellow triangle NEW 11 43.6498 9.8870 - red square NEW 15 79.2778 0.0130 - red circle NEW 16 13.8103 2.9010 - red square NEW 48 77.5542 7.4670 - purple triangle NEW 51 81.2290 8.5910 - red square NEW 64 77.1991 9.5310 - purple triangle NEW 65 80.1405 5.8240 - yellow circle NEW 73 63.9785 4.2370 - yellow circle NEW 87 63.5058 8.3350 - purple square NEW 91 72.3735 8.2430 - -You can find the full list of verbs at the :doc:`reference-verbs` page. - -Multiple input files -^^^^^^^^^^^^^^^^^^^^ - -Miller takes all the files from the command line as an input stream. But it's format-aware, so it doesn't repeat CSV header lines. For example, with input files (`data/a.csv `_) and (`data/b.csv `_), the system ``cat`` command will repeat header lines: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/a.csv - a,b,c - 1,2,3 - 4,5,6 - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/b.csv - a,b,c - 7,8,9 - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/a.csv data/b.csv - a,b,c - 1,2,3 - 4,5,6 - a,b,c - 7,8,9 - -However, ``mlr cat`` will not: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv cat data/a.csv data/b.csv - a,b,c - 1,2,3 - 4,5,6 - 7,8,9 - -Chaining verbs together -^^^^^^^^^^^^^^^^^^^^^^^ - -Often we want to chain queries together -- for example, sorting by a field and taking the top few values. We can do this using pipes: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv sort -nr index example.csv | mlr --icsv --opprint head -n 3 - color shape flag index quantity rate - purple square false 91 72.3735 8.2430 - yellow circle true 87 63.5058 8.3350 - yellow circle true 73 63.9785 4.2370 - -This works fine -- but Miller also lets you chain verbs together using the word ``then``. Think of this as a Miller-internal pipe that lets you use fewer keystrokes: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --opprint sort -nr index then head -n 3 example.csv - color shape flag index quantity rate - purple square false 91 72.3735 8.2430 - yellow circle true 87 63.5058 8.3350 - yellow circle true 73 63.9785 4.2370 - -As another convenience, you can put the filename first using ``--from``. When you're interacting with your data at the command line, this makes it easier to up-arrow and append to the previous command: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --opprint --from example.csv sort -nr index then head -n 3 - color shape flag index quantity rate - purple square false 91 72.3735 8.2430 - yellow circle true 87 63.5058 8.3350 - yellow circle true 73 63.9785 4.2370 - -.. code-block:: none - :emphasize-lines: 1-4 - - mlr --icsv --opprint --from example.csv \ - sort -nr index \ - then head -n 3 \ - then cut -f shape,quantity - shape quantity - square 72.3735 - circle 63.5058 - circle 63.9785 - -Sorts and stats -^^^^^^^^^^^^^^^ - -Now suppose you want to sort the data on a given column, *and then* take the top few in that ordering. You can use Miller's ``then`` feature to pipe commands together. - -Here are the records with the top three ``index`` values: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --opprint sort -nr index then head -n 3 example.csv - color shape flag index quantity rate - purple square false 91 72.3735 8.2430 - yellow circle true 87 63.5058 8.3350 - yellow circle true 73 63.9785 4.2370 - -Lots of Miller commands take a ``-g`` option for group-by: here, ``head -n 1 -g shape`` outputs the first record for each distinct value of the ``shape`` field. This means we're finding the record with highest ``index`` field for each distinct ``shape`` field: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --opprint sort -f shape -nr index then head -n 1 -g shape example.csv - color shape flag index quantity rate - yellow circle true 87 63.5058 8.3350 - purple square false 91 72.3735 8.2430 - purple triangle false 65 80.1405 5.8240 - -Statistics can be computed with or without group-by field(s): - -.. code-block:: none - :emphasize-lines: 1-2 - - mlr --icsv --opprint --from example.csv \ - stats1 -a count,min,mean,max -f quantity -g shape - shape quantity_count quantity_min quantity_mean quantity_max - triangle 3 43.6498 68.33976666666666 81.229 - square 4 72.3735 76.60114999999999 79.2778 - circle 3 13.8103 47.0982 63.9785 - -.. code-block:: none - :emphasize-lines: 1-2 - - mlr --icsv --opprint --from example.csv \ - stats1 -a count,min,mean,max -f quantity -g shape,color - shape color quantity_count quantity_min quantity_mean quantity_max - triangle yellow 1 43.6498 43.6498 43.6498 - square red 3 77.1991 78.01036666666666 79.2778 - circle red 1 13.8103 13.8103 13.8103 - triangle purple 2 80.1405 80.68475000000001 81.229 - circle yellow 2 63.5058 63.742149999999995 63.9785 - square purple 1 72.3735 72.3735 72.3735 - -If your output has a lot of columns, you can use XTAB format to line things up vertically for you instead: - -.. code-block:: none - :emphasize-lines: 1-2 - - mlr --icsv --oxtab --from example.csv \ - stats1 -a p0,p10,p25,p50,p75,p90,p99,p100 -f rate - rate_p0 0.0130 - rate_p10 2.9010 - rate_p25 4.2370 - rate_p50 8.2430 - rate_p75 8.5910 - rate_p90 9.8870 - rate_p99 9.8870 - rate_p100 9.8870 - - -File formats and format conversion -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Miller supports the following formats: - -* CSV (comma-separared values) -* TSV (tab-separated values) -* JSON (JavaScript Object Notation) -* PPRINT (pretty-printed tabular) -* XTAB (vertical-tabular or sideways-tabular) -* NIDX (numerically indexed, label-free, with implicit labels ``"1"``, ``"2"``, etc.) -* DKVP (delimited key-value pairs). - -What's a CSV file, really? It's an array of rows, or *records*, each being a list of key-value pairs, or *fields*: for CSV it so happens that all the keys are shared in the header line and the values vary from one data line to another. - -For example, if you have: - -.. code-block:: none - - shape,flag,index - circle,1,24 - square,0,36 - -then that's a way of saying: - -.. code-block:: none - - shape=circle,flag=1,index=24 - shape=square,flag=0,index=36 - -Other ways to write the same data: - -.. code-block:: none - - CSV PPRINT - shape,flag,index shape flag index - circle,1,24 circle 1 24 - square,0,36 square 0 36 - - JSON XTAB - { shape circle - "shape": "circle", flag 1 - "flag": 1, index 24 - "index": 24 . - } shape square - { flag 0 - "shape": "square", index 36 - "flag": 0, - "index": 36 - } - - DKVP - shape=circle,flag=1,index=24 - shape=square,flag=0,index=36 - -Anything we can do with CSV input data, we can do with any other format input data. And you can read from one format, do any record-processing, and output to the same format as the input, or to a different output format. - -How to specify these to Miller: - -* If you use ``--csv`` or ``--json`` or ``--pprint``, etc., then Miller will use that format for input and output. -* If you use ``--icsv`` and ``--ojson`` (note the extra ``i`` and ``o``) then Miller will use CSV for input and JSON for output, etc. See also :doc:`keystroke-savers` for even shorter options like ``--c2j``. - -You can read more about this at the :doc:`file-formats` page. - -.. _10min-choices-for-printing-to-files: - -Choices for printing to files -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Often we want to print output to the screen. Miller does this by default, as we've seen in the previous examples. - -Sometimes, though, we want to print output to another file. Just use **> outputfilenamegoeshere** at the end of your command: - -.. code-block:: none - :emphasize-lines: 1,1 - - mlr --icsv --opprint cat example.csv > newfile.csv - # Output goes to the new file; - # nothing is printed to the screen. - -.. code-block:: none - :emphasize-lines: 1,1 - - cat newfile.csv - color shape flag index quantity rate - yellow triangle true 11 43.6498 9.8870 - red square true 15 79.2778 0.0130 - red circle true 16 13.8103 2.9010 - red square false 48 77.5542 7.4670 - purple triangle false 51 81.2290 8.5910 - red square false 64 77.1991 9.5310 - purple triangle false 65 80.1405 5.8240 - yellow circle true 73 63.9785 4.2370 - yellow circle true 87 63.5058 8.3350 - purple square false 91 72.3735 8.2430 - -Other times we just want our files to be **changed in-place**: just use **mlr -I**: - -.. code-block:: none - :emphasize-lines: 1,1 - - cp example.csv newfile.txt - -.. code-block:: none - :emphasize-lines: 1,1 - - cat newfile.txt - color,shape,flag,index,quantity,rate - yellow,triangle,true,11,43.6498,9.8870 - red,square,true,15,79.2778,0.0130 - red,circle,true,16,13.8103,2.9010 - red,square,false,48,77.5542,7.4670 - purple,triangle,false,51,81.2290,8.5910 - red,square,false,64,77.1991,9.5310 - purple,triangle,false,65,80.1405,5.8240 - yellow,circle,true,73,63.9785,4.2370 - yellow,circle,true,87,63.5058,8.3350 - purple,square,false,91,72.3735,8.2430 - -.. code-block:: none - :emphasize-lines: 1,1 - - mlr -I --csv sort -f shape newfile.txt - -.. code-block:: none - :emphasize-lines: 1,1 - - cat newfile.txt - color,shape,flag,index,quantity,rate - red,circle,true,16,13.8103,2.9010 - yellow,circle,true,73,63.9785,4.2370 - yellow,circle,true,87,63.5058,8.3350 - red,square,true,15,79.2778,0.0130 - red,square,false,48,77.5542,7.4670 - red,square,false,64,77.1991,9.5310 - purple,square,false,91,72.3735,8.2430 - yellow,triangle,true,11,43.6498,9.8870 - purple,triangle,false,51,81.2290,8.5910 - purple,triangle,false,65,80.1405,5.8240 - -Also using ``mlr -I`` you can bulk-operate on lots of files: e.g.: - -.. code-block:: none - :emphasize-lines: 1,1 - - mlr -I --csv cut -x -f unwanted_column_name *.csv - -If you like, you can first copy off your original data somewhere else, before doing in-place operations. - -Lastly, using ``tee`` within ``put``, you can split your input data into separate files per one or more field names: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv --from example.csv put -q 'tee > $shape.".csv", $*' - -.. code-block:: none - :emphasize-lines: 1-1 - - cat circle.csv - color,shape,flag,index,quantity,rate - red,circle,true,16,13.8103,2.9010 - yellow,circle,true,73,63.9785,4.2370 - yellow,circle,true,87,63.5058,8.3350 - -.. code-block:: none - :emphasize-lines: 1-1 - - cat square.csv - color,shape,flag,index,quantity,rate - red,square,true,15,79.2778,0.0130 - red,square,false,48,77.5542,7.4670 - red,square,false,64,77.1991,9.5310 - purple,square,false,91,72.3735,8.2430 - -.. code-block:: none - :emphasize-lines: 1-1 - - cat triangle.csv - color,shape,flag,index,quantity,rate - yellow,triangle,true,11,43.6498,9.8870 - purple,triangle,false,51,81.2290,8.5910 - purple,triangle,false,65,80.1405,5.8240 diff --git a/docs6/10min.rst.in b/docs6/10min.rst.in deleted file mode 100644 index 6ac64c9e5..000000000 --- a/docs6/10min.rst.in +++ /dev/null @@ -1,378 +0,0 @@ -Miller in 10 minutes -==================== - -Obtaining Miller -^^^^^^^^^^^^^^^^ - -You can install Miller for various platforms as follows: - -* Linux: ``yum install miller`` or ``apt-get install miller`` depending on your flavor of Linux -* MacOS: ``brew install miller`` or ``port install miller`` depending on your preference of `Homebrew `_ or `MacPorts `_. -* Windows: ``choco install miller`` using `Chocolatey `_. -* You can get latest builds for Linux, MacOS, and Windows by visiting https://github.com/johnkerl/miller/actions, selecting the latest build, and clicking _Artifacts_. (These are retained for 5 days after each commit.) -* See also :doc:`build` if you prefer -- in particular, if your platform's package manager doesn't have the latest release. - -As a first check, you should be able to run ``mlr --version`` at your system's command prompt and see something like the following: - -GENRST_RUN_COMMAND -mlr --version -GENRST_EOF - -As a second check, given (`example.csv <./example.csv>`_) you should be able to do - -GENRST_RUN_COMMAND -mlr --csv cat example.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --icsv --opprint cat example.csv -GENRST_EOF - -If you run into issues on these checks, please check out the resources on the :doc:`community` page for help. - -Miller verbs -^^^^^^^^^^^^ - -Let's take a quick look at some of the most useful Miller verbs -- file-format-aware, name-index-empowered equivalents of standard system commands. - -``mlr cat`` is like system ``cat`` (or ``type`` on Windows) -- it passes the data through unmodified: - -GENRST_RUN_COMMAND -mlr --csv cat example.csv -GENRST_EOF - -But ``mlr cat`` can also do format conversion -- for example, you can pretty-print in tabular format: - -GENRST_RUN_COMMAND -mlr --icsv --opprint cat example.csv -GENRST_EOF - -``mlr head`` and ``mlr tail`` count records rather than lines. Whether you're getting the first few records or the last few, the CSV header is included either way: - -GENRST_RUN_COMMAND -mlr --csv head -n 4 example.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --csv tail -n 4 example.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --icsv --ojson tail -n 2 example.csv -GENRST_EOF - -You can sort on a single field: - -GENRST_RUN_COMMAND -mlr --icsv --opprint sort -f shape example.csv -GENRST_EOF - -Or, you can sort primarily alphabetically on one field, then secondarily numerically descending on another field, and so on: - -GENRST_RUN_COMMAND -mlr --icsv --opprint sort -f shape -nr index example.csv -GENRST_EOF - -If there are fields you don't want to see in your data, you can use ``cut`` to keep only the ones you want, in the same order they appeared in the input data: - -GENRST_RUN_COMMAND -mlr --icsv --opprint cut -f flag,shape example.csv -GENRST_EOF - -You can also use ``cut -o`` to keep specified fields, but in your preferred order: - -GENRST_RUN_COMMAND -mlr --icsv --opprint cut -o -f flag,shape example.csv -GENRST_EOF - -You can use ``cut -x`` to omit fields you don't care about: - -GENRST_RUN_COMMAND -mlr --icsv --opprint cut -x -f flag,shape example.csv -GENRST_EOF - -You can use ``filter`` to keep only records you care about: - -GENRST_RUN_COMMAND -mlr --icsv --opprint filter '$color == "red"' example.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --icsv --opprint filter '$color == "red" && $flag == true' example.csv -GENRST_EOF - -You can use ``put`` to create new fields which are computed from other fields: - -GENRST_RUN_COMMAND -mlr --icsv --opprint put ' - $ratio = $quantity / $rate; - $color_shape = $color . "_" . $shape -' example.csv -GENRST_EOF - -Even though Miller's main selling point is name-indexing, sometimes you really want to refer to a field name by its positional index. Use ``$[[3]]`` to access the name of field 3 or ``$[[[3]]]`` to access the value of field 3: - -GENRST_RUN_COMMAND -mlr --icsv --opprint put '$[[3]] = "NEW"' example.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --icsv --opprint put '$[[[3]]] = "NEW"' example.csv -GENRST_EOF - -You can find the full list of verbs at the :doc:`reference-verbs` page. - -Multiple input files -^^^^^^^^^^^^^^^^^^^^ - -Miller takes all the files from the command line as an input stream. But it's format-aware, so it doesn't repeat CSV header lines. For example, with input files (`data/a.csv `_) and (`data/b.csv `_), the system ``cat`` command will repeat header lines: - -GENRST_RUN_COMMAND -cat data/a.csv -GENRST_EOF - -GENRST_RUN_COMMAND -cat data/b.csv -GENRST_EOF - -GENRST_RUN_COMMAND -cat data/a.csv data/b.csv -GENRST_EOF - -However, ``mlr cat`` will not: - -GENRST_RUN_COMMAND -mlr --csv cat data/a.csv data/b.csv -GENRST_EOF - -Chaining verbs together -^^^^^^^^^^^^^^^^^^^^^^^ - -Often we want to chain queries together -- for example, sorting by a field and taking the top few values. We can do this using pipes: - -GENRST_RUN_COMMAND -mlr --csv sort -nr index example.csv | mlr --icsv --opprint head -n 3 -GENRST_EOF - -This works fine -- but Miller also lets you chain verbs together using the word ``then``. Think of this as a Miller-internal pipe that lets you use fewer keystrokes: - -GENRST_RUN_COMMAND -mlr --icsv --opprint sort -nr index then head -n 3 example.csv -GENRST_EOF - -As another convenience, you can put the filename first using ``--from``. When you're interacting with your data at the command line, this makes it easier to up-arrow and append to the previous command: - -GENRST_RUN_COMMAND -mlr --icsv --opprint --from example.csv sort -nr index then head -n 3 -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --icsv --opprint --from example.csv \ - sort -nr index \ - then head -n 3 \ - then cut -f shape,quantity -GENRST_EOF - -Sorts and stats -^^^^^^^^^^^^^^^ - -Now suppose you want to sort the data on a given column, *and then* take the top few in that ordering. You can use Miller's ``then`` feature to pipe commands together. - -Here are the records with the top three ``index`` values: - -GENRST_RUN_COMMAND -mlr --icsv --opprint sort -nr index then head -n 3 example.csv -GENRST_EOF - -Lots of Miller commands take a ``-g`` option for group-by: here, ``head -n 1 -g shape`` outputs the first record for each distinct value of the ``shape`` field. This means we're finding the record with highest ``index`` field for each distinct ``shape`` field: - -GENRST_RUN_COMMAND -mlr --icsv --opprint sort -f shape -nr index then head -n 1 -g shape example.csv -GENRST_EOF - -Statistics can be computed with or without group-by field(s): - -GENRST_RUN_COMMAND -mlr --icsv --opprint --from example.csv \ - stats1 -a count,min,mean,max -f quantity -g shape -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --icsv --opprint --from example.csv \ - stats1 -a count,min,mean,max -f quantity -g shape,color -GENRST_EOF - -If your output has a lot of columns, you can use XTAB format to line things up vertically for you instead: - -GENRST_RUN_COMMAND -mlr --icsv --oxtab --from example.csv \ - stats1 -a p0,p10,p25,p50,p75,p90,p99,p100 -f rate -GENRST_EOF - - -File formats and format conversion -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Miller supports the following formats: - -* CSV (comma-separared values) -* TSV (tab-separated values) -* JSON (JavaScript Object Notation) -* PPRINT (pretty-printed tabular) -* XTAB (vertical-tabular or sideways-tabular) -* NIDX (numerically indexed, label-free, with implicit labels ``"1"``, ``"2"``, etc.) -* DKVP (delimited key-value pairs). - -What's a CSV file, really? It's an array of rows, or *records*, each being a list of key-value pairs, or *fields*: for CSV it so happens that all the keys are shared in the header line and the values vary from one data line to another. - -For example, if you have: - -GENRST_CARDIFY -shape,flag,index -circle,1,24 -square,0,36 -GENRST_EOF - -then that's a way of saying: - -GENRST_CARDIFY -shape=circle,flag=1,index=24 -shape=square,flag=0,index=36 -GENRST_EOF - -Other ways to write the same data: - -GENRST_CARDIFY -CSV PPRINT -shape,flag,index shape flag index -circle,1,24 circle 1 24 -square,0,36 square 0 36 - -JSON XTAB -{ shape circle - "shape": "circle", flag 1 - "flag": 1, index 24 - "index": 24 . -} shape square -{ flag 0 - "shape": "square", index 36 - "flag": 0, - "index": 36 -} - -DKVP -shape=circle,flag=1,index=24 -shape=square,flag=0,index=36 -GENRST_EOF - -Anything we can do with CSV input data, we can do with any other format input data. And you can read from one format, do any record-processing, and output to the same format as the input, or to a different output format. - -How to specify these to Miller: - -* If you use ``--csv`` or ``--json`` or ``--pprint``, etc., then Miller will use that format for input and output. -* If you use ``--icsv`` and ``--ojson`` (note the extra ``i`` and ``o``) then Miller will use CSV for input and JSON for output, etc. See also :doc:`keystroke-savers` for even shorter options like ``--c2j``. - -You can read more about this at the :doc:`file-formats` page. - -.. _10min-choices-for-printing-to-files: - -Choices for printing to files -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Often we want to print output to the screen. Miller does this by default, as we've seen in the previous examples. - -Sometimes, though, we want to print output to another file. Just use **> outputfilenamegoeshere** at the end of your command: - -.. code-block:: none - :emphasize-lines: 1,1 - - mlr --icsv --opprint cat example.csv > newfile.csv - # Output goes to the new file; - # nothing is printed to the screen. - -.. code-block:: none - :emphasize-lines: 1,1 - - cat newfile.csv - color shape flag index quantity rate - yellow triangle true 11 43.6498 9.8870 - red square true 15 79.2778 0.0130 - red circle true 16 13.8103 2.9010 - red square false 48 77.5542 7.4670 - purple triangle false 51 81.2290 8.5910 - red square false 64 77.1991 9.5310 - purple triangle false 65 80.1405 5.8240 - yellow circle true 73 63.9785 4.2370 - yellow circle true 87 63.5058 8.3350 - purple square false 91 72.3735 8.2430 - -Other times we just want our files to be **changed in-place**: just use **mlr -I**: - -.. code-block:: none - :emphasize-lines: 1,1 - - cp example.csv newfile.txt - -.. code-block:: none - :emphasize-lines: 1,1 - - cat newfile.txt - color,shape,flag,index,quantity,rate - yellow,triangle,true,11,43.6498,9.8870 - red,square,true,15,79.2778,0.0130 - red,circle,true,16,13.8103,2.9010 - red,square,false,48,77.5542,7.4670 - purple,triangle,false,51,81.2290,8.5910 - red,square,false,64,77.1991,9.5310 - purple,triangle,false,65,80.1405,5.8240 - yellow,circle,true,73,63.9785,4.2370 - yellow,circle,true,87,63.5058,8.3350 - purple,square,false,91,72.3735,8.2430 - -.. code-block:: none - :emphasize-lines: 1,1 - - mlr -I --csv sort -f shape newfile.txt - -.. code-block:: none - :emphasize-lines: 1,1 - - cat newfile.txt - color,shape,flag,index,quantity,rate - red,circle,true,16,13.8103,2.9010 - yellow,circle,true,73,63.9785,4.2370 - yellow,circle,true,87,63.5058,8.3350 - red,square,true,15,79.2778,0.0130 - red,square,false,48,77.5542,7.4670 - red,square,false,64,77.1991,9.5310 - purple,square,false,91,72.3735,8.2430 - yellow,triangle,true,11,43.6498,9.8870 - purple,triangle,false,51,81.2290,8.5910 - purple,triangle,false,65,80.1405,5.8240 - -Also using ``mlr -I`` you can bulk-operate on lots of files: e.g.: - -.. code-block:: none - :emphasize-lines: 1,1 - - mlr -I --csv cut -x -f unwanted_column_name *.csv - -If you like, you can first copy off your original data somewhere else, before doing in-place operations. - -Lastly, using ``tee`` within ``put``, you can split your input data into separate files per one or more field names: - -GENRST_RUN_COMMAND -mlr --csv --from example.csv put -q 'tee > $shape.".csv", $*' -GENRST_EOF - -GENRST_RUN_COMMAND -cat circle.csv -GENRST_EOF - -GENRST_RUN_COMMAND -cat square.csv -GENRST_EOF - -GENRST_RUN_COMMAND -cat triangle.csv -GENRST_EOF diff --git a/docs6/Makefile b/docs6/Makefile deleted file mode 100644 index d0b16cfe3..000000000 --- a/docs6/Makefile +++ /dev/null @@ -1,28 +0,0 @@ -# Minimal makefile for Sphinx documentation -# -# Note: run this after make in the ../c directory and make in the ../man directory -# since ../c/mlr is used to autogenerate ../man/manpage.txt which is used in this directory. -# See also https://miller.readthedocs.io/en/latest/build.html#creating-a-new-release-for-developers - -# You can set these variables from the command line, and also -# from the environment for the first two. -SPHINXOPTS ?= -SPHINXBUILD ?= sphinx-build -SOURCEDIR = . -BUILDDIR = _build - -# Respective MANPATH entries would include /usr/local/share/man or $HOME/man. -INSTALLDIR=/usr/local/share/man/man1 -INSTALLHOME=$(HOME)/man/man1 - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - ./genrsts - $(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs6/README.md b/docs6/README.md index 3234ec102..0ddf9cc1a 100644 --- a/docs6/README.md +++ b/docs6/README.md @@ -1,40 +1,44 @@ -# Miller Sphinx docs +# Miller docs -## Why use Sphinx +## Why use Mkdocs * Connects to https://miller.readthedocs.io so people can get their docmods onto the web instead of the self-hosted https://johnkerl.org/miller/doc. Thanks to @pabloab for the great advice! -* More standard look and feel -- lots of people use readthedocs for other things so this should feel familiar -* We get a Search feature for free +* More standard look and feel -- lots of people use readthedocs for other things so this should feel familiar. +* We get a Search feature for free. +* Mkdocs vs Sphinx: these are similar tools, but I find that I more easily get better desktop+mobile formatting using Mkdocs. ## Contributing -* You need `pip install sphinx` (or `pip3 install sphinx`) -* The docs include lots of live code examples which will be invoked using `mlr` which must be somewhere in your `$PATH` -* Clone https://github.com/johnkerl/miller and cd into `docs/` within your clone -* Editing loop: - * Edit `*.rst.in` - * Run `make html` - * Either `open _build/html/index.html` (MacOS) or point your browser to `file:///path/to/your/clone/of/miller/docs/_build/html/index.html` +* You need `pip install mkdocs` (or `pip3 install mkdocs`). +* The docs include lots of live code examples which will be invoked using `mlr` which must be somewhere in your `$PATH`. +* Clone https://github.com/johnkerl/miller and cd into `docs/` within your clone. +* Quick-editing loop: + * In one terminal, cd to this directory and leave `mkdocs serve` running. + * In another terminal, cd to the `docs` subdirectory and edit `*.md.in`. + * Run `genmds` to re-create all the `*.md` files, or `genmds foo.md.in` to just re-create the `foo.md.in` file you just edited. + * In your browser, visit http://127.0.0.1:8000 +* Alternate editing loop: + * Leave one terminal open as a place you will run `mkdocs build` + * In one terminal, cd to the `docs` subdirectory and edit `*.md.in`. + * Run `genmds` to re-create all the `*.md` files, or `genmds foo.md.in` to just re-create the `foo.md.in` file you just edited. + * In the first terminal, run `mkdocs build` which will populate the `site` directory. + * In your browser, visit `file:///your/path/to/miller/docs/site/index.html` + * Link-checking: + * `sudo pip3 install git+https://github.com/linkchecker/linkchecker.git` + * `cd site` and `linkchecker .` * Submitting: - * `git add` your modified files, `git commit`, `git push`, and submit a PR at https://github.com/johnkerl/miller -* A nice markup reference: https://www.sphinx-doc.org/en/1.8/usage/restructuredtext/basics.html + * `git add` your modified files, `git commit`, `git push`, and submit a PR at https://github.com/johnkerl/miller. ## Notes * CSS: - * I used the Sphinx Classic theme which I like a lot except the colors -- it's a blue scheme and Miller has never been blue. - * Files are in `docs/_static/*.css` where I marked my mods with `/* CHANGE ME */`. - * If you modify the CSS you must run `make clean html` (not just `make html`) then reload in your browser. + * I used the Mkdocs Readthedocs theme which I like a lot. I customized `docs/extra.css` for Miller coloring/branding. * Live code: - * I didn't find a way to include non-Python live-code examples within Sphinx so I adapted the pre-Sphinx Miller-doc strategy which is to have a generator script read a template file (here, `foo.rst.in`), run the marked lines, and generate the output file (`foo.rst`). - * Edit the `*.rst.in` files, not `*.rst` directly. - * Within the `*.rst.in` files are lines like `GENRST_RUN_COMMAND`. These will be run, and their output included, by `make html` which calls the `genrsts` script for you. + * I didn't find a way to include non-Python live-code examples within Mkdocs so I adapted the pre-Mkdocs Miller-doc strategy which is to have a generator script read a template file (here, `foo.md.in`), run the marked lines, and generate the output file (`foo.md`). This is `genmds`. + * Edit the `*.md.in` files, not `*.md` directly. + * Within the `*.md.in` files are lines like `GENMD_RUN_COMMAND`. These will be run, and their output included, by `genmds` which calls the `genmds` script for you. * readthedocs: * https://readthedocs.org/ * https://readthedocs.org/projects/miller/ * https://readthedocs.org/projects/miller/builds/ * https://miller.readthedocs.io/en/latest/ - -## To do - -* Let's all discuss if/how we want the v2 docs to be structured better than the v1 docs. diff --git a/docs6/build-one b/docs6/build-one deleted file mode 100755 index a3ab5eb1a..000000000 --- a/docs6/build-one +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -set -euo pipefail - -if [ $# -ge 1 ]; then - for name; do - if [[ $name == *.rst.in ]]; then - genrsts $name; - fi - done -else - for rstin in *.rst.in; do genrsts $rstin; done -fi -sphinx-build -M html . _build diff --git a/docs6/build.rst b/docs6/build.rst deleted file mode 100644 index 771c7363d..000000000 --- a/docs6/build.rst +++ /dev/null @@ -1,121 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Building from source -================================================================ - -Please also see :doc:`installation` for information about pre-built executables. - -Miller license ----------------------------------------------------------------- - -Two-clause BSD license https://github.com/johnkerl/miller/blob/master/LICENSE.txt. - -From release tarball ----------------------------------------------------------------- - -* Obtain ``mlr-i.j.k.tar.gz`` from https://github.com/johnkerl/miller/tags, replacing ``i.j.k`` with the desired release, e.g. ``6.1.0``. -* ``tar zxvf mlr-i.j.k.tar.gz`` -* ``cd mlr-i.j.k`` -* ``cd go`` -* ``./build`` creates the ``go/mlr`` executable and runs regression tests -* ``go build mlr.go`` creates the ``go/mlr`` executable without running regression tests - -From git clone ----------------------------------------------------------------- - -* ``git clone https://github.com/johnkerl/miller`` -* ``cd miller/go`` -* ``./build`` creates the ``go/mlr`` executable and runs regression tests -* ``go build mlr.go`` creates the ``go/mlr`` executable without running regression tests - -In case of problems ----------------------------------------------------------------- - -If you have any build errors, feel free to open an issue with "New Issue" at https://github.com/johnkerl/miller/issues. - -Dependencies ----------------------------------------------------------------- - -Required external dependencies -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -These are necessary to produce the ``mlr`` executable. - -* Go version 1.16 or higher -* Others packaged within ``go.mod`` and ``go.sum`` which you don't need to deal with manually -- the Go build process handles them for us - -Optional external dependencies -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -This documentation pageset is built using Sphinx. Please see https://github.com/johnkerl/miller/blob/main/docs6/README.md for details. - -Creating a new release: for developers ----------------------------------------------------------------- - -At present I'm the primary developer so this is just my checklist for making new releases. - -In this example I am using version 6.1.0 to 6.2.0; of course that will change for subsequent revisions. - -* Update version found in ``mlr --version`` and ``man mlr``: - - * Edit ``go/src/version/version.go`` from ``6.1.0-dev`` to ``6.2.0``. - * Likewise ``docs6/conf.py`` - * ``cd ../docs6`` - * ``export PATH=../go:$PATH`` - * ``make html`` - * The ordering is important: the first build creates ``mlr``; the second runs ``mlr`` to create ``manpage.txt``; the third includes ``manpage.txt`` into one of its outputs. - * Commit and push. - -* Create the release tarball and SRPM: - - * TBD for the Go port ... - * Linux/MacOS/Windows binaries from GitHub Actions ... - * Pull back release tarball ``mlr-6.2.0.tar.gz`` from buildbox, and ``mlr.{arch}`` binaries from whatever buildboxes. - -* Create the Github release tag: - - * Don't forget the ``v`` in ``v6.2.0`` - * Write the release notes - * Attach the release tarball and binaries. Double-check assets were successfully uploaded. - * Publish the release - -* Check the release-specific docs: - - * Look at https://miller.readthedocs.io for new-version docs, after a few minutes' propagation time. - -* Notify: - - * Submit ``brew`` pull request; notify any other distros which don't appear to have autoupdated since the previous release (notes below) - * Similarly for ``macports``: https://github.com/macports/macports-ports/blob/master/textproc/miller/Portfile. - * Social-media updates. - -.. code-block:: none - - git remote add upstream https://github.com/Homebrew/homebrew-core # one-time setup only - git fetch upstream - git rebase upstream/master - git checkout -b miller-6.1.0 - shasum -a 256 /path/to/mlr-6.1.0.tar.gz - edit Formula/miller.rb - # Test the URL from the line like - # url "https://github.com/johnkerl/miller/releases/download/v6.1.0/mlr-6.1.0.tar.gz" - # in a browser for typos - # A '@BrewTestBot Test this please' comment within the homebrew-core pull request will restart the homebrew travis build - git add Formula/miller.rb - git commit -m 'miller 6.1.0' - git push -u origin miller-6.1.0 - (submit the pull request) - -* Afterwork: - - * Edit ``go/src/version/version.go`` and ``docs6/conf.py`` to change version from ``6.2.0`` to ``6.2.0-dev``. - * ``cd go`` - * ``./build`` - * Commit and push. - - -Misc. development notes ----------------------------------------------------------------- - -I use terminal width 120 and tabwidth 4. diff --git a/docs6/build.rst.in b/docs6/build.rst.in deleted file mode 100644 index 1f2c3bfea..000000000 --- a/docs6/build.rst.in +++ /dev/null @@ -1,118 +0,0 @@ -Building from source -================================================================ - -Please also see :doc:`installation` for information about pre-built executables. - -Miller license ----------------------------------------------------------------- - -Two-clause BSD license https://github.com/johnkerl/miller/blob/master/LICENSE.txt. - -From release tarball ----------------------------------------------------------------- - -* Obtain ``mlr-i.j.k.tar.gz`` from https://github.com/johnkerl/miller/tags, replacing ``i.j.k`` with the desired release, e.g. ``6.1.0``. -* ``tar zxvf mlr-i.j.k.tar.gz`` -* ``cd mlr-i.j.k`` -* ``cd go`` -* ``./build`` creates the ``go/mlr`` executable and runs regression tests -* ``go build mlr.go`` creates the ``go/mlr`` executable without running regression tests - -From git clone ----------------------------------------------------------------- - -* ``git clone https://github.com/johnkerl/miller`` -* ``cd miller/go`` -* ``./build`` creates the ``go/mlr`` executable and runs regression tests -* ``go build mlr.go`` creates the ``go/mlr`` executable without running regression tests - -In case of problems ----------------------------------------------------------------- - -If you have any build errors, feel free to open an issue with "New Issue" at https://github.com/johnkerl/miller/issues. - -Dependencies ----------------------------------------------------------------- - -Required external dependencies -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -These are necessary to produce the ``mlr`` executable. - -* Go version 1.16 or higher -* Others packaged within ``go.mod`` and ``go.sum`` which you don't need to deal with manually -- the Go build process handles them for us - -Optional external dependencies -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -This documentation pageset is built using Sphinx. Please see https://github.com/johnkerl/miller/blob/main/docs6/README.md for details. - -Creating a new release: for developers ----------------------------------------------------------------- - -At present I'm the primary developer so this is just my checklist for making new releases. - -In this example I am using version 6.1.0 to 6.2.0; of course that will change for subsequent revisions. - -* Update version found in ``mlr --version`` and ``man mlr``: - - * Edit ``go/src/version/version.go`` from ``6.1.0-dev`` to ``6.2.0``. - * Likewise ``docs6/conf.py`` - * ``cd ../docs6`` - * ``export PATH=../go:$PATH`` - * ``make html`` - * The ordering is important: the first build creates ``mlr``; the second runs ``mlr`` to create ``manpage.txt``; the third includes ``manpage.txt`` into one of its outputs. - * Commit and push. - -* Create the release tarball and SRPM: - - * TBD for the Go port ... - * Linux/MacOS/Windows binaries from GitHub Actions ... - * Pull back release tarball ``mlr-6.2.0.tar.gz`` from buildbox, and ``mlr.{arch}`` binaries from whatever buildboxes. - -* Create the Github release tag: - - * Don't forget the ``v`` in ``v6.2.0`` - * Write the release notes - * Attach the release tarball and binaries. Double-check assets were successfully uploaded. - * Publish the release - -* Check the release-specific docs: - - * Look at https://miller.readthedocs.io for new-version docs, after a few minutes' propagation time. - -* Notify: - - * Submit ``brew`` pull request; notify any other distros which don't appear to have autoupdated since the previous release (notes below) - * Similarly for ``macports``: https://github.com/macports/macports-ports/blob/master/textproc/miller/Portfile. - * Social-media updates. - -GENRST_CARDIFY -git remote add upstream https://github.com/Homebrew/homebrew-core # one-time setup only -git fetch upstream -git rebase upstream/master -git checkout -b miller-6.1.0 -shasum -a 256 /path/to/mlr-6.1.0.tar.gz -edit Formula/miller.rb -# Test the URL from the line like -# url "https://github.com/johnkerl/miller/releases/download/v6.1.0/mlr-6.1.0.tar.gz" -# in a browser for typos -# A '@BrewTestBot Test this please' comment within the homebrew-core pull request will restart the homebrew travis build -git add Formula/miller.rb -git commit -m 'miller 6.1.0' -git push -u origin miller-6.1.0 -(submit the pull request) -GENRST_EOF - -* Afterwork: - - * Edit ``go/src/version/version.go`` and ``docs6/conf.py`` to change version from ``6.2.0`` to ``6.2.0-dev``. - * ``cd go`` - * ``./build`` - * Commit and push. - - -Misc. development notes ----------------------------------------------------------------- - -I use terminal width 120 and tabwidth 4. diff --git a/docs6/community.rst b/docs6/community.rst deleted file mode 100644 index 5ad687ed6..000000000 --- a/docs6/community.rst +++ /dev/null @@ -1,10 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Community -========= - -* See `Miller GitHub Discussions `_ for general Q&A, advice, sharing success stories, etc. -* See also `Miller-tagged questions on Stack Overflow `_ -* See `Miller GitHub Issues `_ for bug reports and feature requests -* Other correspondence: mailto:kerl.john.r+miller@gmail.com diff --git a/docs6/community.rst.in b/docs6/community.rst.in deleted file mode 100644 index b03822c8b..000000000 --- a/docs6/community.rst.in +++ /dev/null @@ -1,7 +0,0 @@ -Community -========= - -* See `Miller GitHub Discussions `_ for general Q&A, advice, sharing success stories, etc. -* See also `Miller-tagged questions on Stack Overflow `_ -* See `Miller GitHub Issues `_ for bug reports and feature requests -* Other correspondence: mailto:kerl.john.r+miller@gmail.com diff --git a/docs6/conf.py b/docs6/conf.py deleted file mode 100644 index f1695c807..000000000 --- a/docs6/conf.py +++ /dev/null @@ -1,112 +0,0 @@ -# Configuration file for the Sphinx documentation builder. -# -# This file only contains a selection of the most common options. For a full -# list see the documentation: -# https://www.sphinx-doc.org/en/master/usage/configuration.html - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -# import os -# import sys -# sys.path.insert(0, os.path.abspath('.')) - - -# -- Project information ----------------------------------------------------- - -project = 'Miller' -copyright = '2021, John Kerl' -author = 'John Kerl' - -# The full version, including alpha/beta/rc tags -release = '6.0.0-alpha' - -# -- General configuration --------------------------------------------------- -master_doc = 'index' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ -] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -#html_theme = 'alabaster' -#html_theme = 'classic' -#html_theme = 'sphinxdoc' -#html_theme = 'nature' -html_theme = 'scrolls' - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -# ---------------------------------------------------------------- -# Include code-sample files in the Sphinx build tree. -# See also https://github.com/johnkerl/miller/issues/560. -# -# There is a problem, and an opportunity for a hack. -# -# * Our data files are in ./data/* (and a few other subdirs of .). -# -# * We want them copied to ./_build/data/* so that we can symlink from our doc -# files (written in ./*.rst. autogenned to HTML in ./_build/html/*.html) to -# relative paths like ./data/a.csv. -# -# * If we use html_extra_path = ['data'] then the files like ./data/a.csv -# are copied to _build/html/a.csv -- one directory 'down'. This means that -# example Miller commands are shown in the generated HTML using 'mlr --csv -# cat data/a.csv' but 'data/a.csv' doesn't exist relative to _build/html. -# This is bad enough for local Sphinx builds but worse for readthedocs -# (https://miller.readthedocs.io) since *only* _build/html files are put into -# readthedocs. -# -# * In our Makefile it's easy enough to do some cp -a commands from ./data -# to ./_build_html/data etc. for local Sphinx builds -- however, readthedocs -# doesn't use the Makefile at all, only this conf.py file. -# -# * Hence the hack: we have a subdir ./sphinx-hack which has a symlink -# ./sphinx-hack/data pointing to ./data. So when the Sphinx build executes -# html_extra_path and removes one directory level, it's an 'extra' level we -# can do without. -# -# * This all relies on symlinks being propagated through GitHub version -# control, readthedocs, and Sphinx build at readthedocs. - -html_extra_path = [ - 'sphinx-hack', - '10-1.sh', - '10-2.sh', - 'circle.csv', - 'commas.csv', - 'dates.csv', - 'example.csv', - 'expo-sample.sh', - 'log.txt', - 'make.bat', - 'manpage.txt', - 'oosvar-example-ewma.sh', - 'oosvar-example-sum-grouped.sh', - 'oosvar-example-sum.sh', - 'sample_mlrrc', - 'square.csv', - 'triangle.csv', - 'variance.mlr', - 'verb-example-ewma.sh', -] diff --git a/docs6/contributing.rst b/docs6/contributing.rst deleted file mode 100644 index 836423ac3..000000000 --- a/docs6/contributing.rst +++ /dev/null @@ -1,47 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -How to contribute -================================================================ - -Community ----------------------------------------------------------------- - -You can ask questions -- or answer them! -- following the links at :doc:`community`. - -Documentation improvements ----------------------------------------------------------------- - -Pre-release Miller documentation is at https://github.com/johnkerl/miller/tree/main/docs6. - -Clone https://github.com/johnkerl/miller and `cd` into `docs6`. - -After ``sudo pip install sphinx`` (or ``pip3``) you should be able to do ``make html``. - -Edit ``*.rst.in`` files, then ``make html`` to generate ``*.rst``, then run the Sphinx document-generator. - -Open ``_build/html/index.html`` in your browser, e.g. ``file:////Users/yourname/git/miller/docs6/_build/html/contributing.html``, to verify. - -PRs are welcome at https://github.com/johnkerl/miller. - -Once PRs are merged, readthedocs creates https://miller.readthedocs.io using the following configs: - -* https://readthedocs.org/projects/miller/ -* https://readthedocs.org/projects/miller/builds/ -* https://github.com/johnkerl/miller/settings/hooks - -Testing ----------------------------------------------------------------- - -As of Miller-6's current pre-release status, the best way to test is to either build from source via :doc:`build`, or by getting a recent binary at https://github.com/johnkerl/miller/actions, then click latest build, then *Artifacts*. Then simply use Miller for whatever you do, and create an issue at https://github.com/johnkerl/miller/issues. - -Do note that as of 2021-06-17 a few things have not been ported to Miller 6 -- most notably, including regex captures and localtime DSL functions. - -Feature development ----------------------------------------------------------------- - -Issues: https://github.com/johnkerl/miller/issues - -Developer notes: https://github.com/johnkerl/miller/blob/main/go/README.md - -PRs which pass regression test (https://github.com/johnkerl/miller/blob/main/go/regtest/README.md) are always welcome! diff --git a/docs6/contributing.rst.in b/docs6/contributing.rst.in deleted file mode 100644 index 61632b5ab..000000000 --- a/docs6/contributing.rst.in +++ /dev/null @@ -1,44 +0,0 @@ -How to contribute -================================================================ - -Community ----------------------------------------------------------------- - -You can ask questions -- or answer them! -- following the links at :doc:`community`. - -Documentation improvements ----------------------------------------------------------------- - -Pre-release Miller documentation is at https://github.com/johnkerl/miller/tree/main/docs6. - -Clone https://github.com/johnkerl/miller and `cd` into `docs6`. - -After ``sudo pip install sphinx`` (or ``pip3``) you should be able to do ``make html``. - -Edit ``*.rst.in`` files, then ``make html`` to generate ``*.rst``, then run the Sphinx document-generator. - -Open ``_build/html/index.html`` in your browser, e.g. ``file:////Users/yourname/git/miller/docs6/_build/html/contributing.html``, to verify. - -PRs are welcome at https://github.com/johnkerl/miller. - -Once PRs are merged, readthedocs creates https://miller.readthedocs.io using the following configs: - -* https://readthedocs.org/projects/miller/ -* https://readthedocs.org/projects/miller/builds/ -* https://github.com/johnkerl/miller/settings/hooks - -Testing ----------------------------------------------------------------- - -As of Miller-6's current pre-release status, the best way to test is to either build from source via :doc:`build`, or by getting a recent binary at https://github.com/johnkerl/miller/actions, then click latest build, then *Artifacts*. Then simply use Miller for whatever you do, and create an issue at https://github.com/johnkerl/miller/issues. - -Do note that as of 2021-06-17 a few things have not been ported to Miller 6 -- most notably, including regex captures and localtime DSL functions. - -Feature development ----------------------------------------------------------------- - -Issues: https://github.com/johnkerl/miller/issues - -Developer notes: https://github.com/johnkerl/miller/blob/main/go/README.md - -PRs which pass regression test (https://github.com/johnkerl/miller/blob/main/go/regtest/README.md) are always welcome! diff --git a/docs6/csv-with-and-without-headers.rst b/docs6/csv-with-and-without-headers.rst deleted file mode 100644 index 930529e41..000000000 --- a/docs6/csv-with-and-without-headers.rst +++ /dev/null @@ -1,149 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -CSV, with and without headers -============================= - -Headerless CSV on input or output ----------------------------------------------------------------- - -Sometimes we get CSV files which lack a header. For example (`data/headerless.csv <./data/headerless.csv>`_): - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/headerless.csv - John,23,present - Fred,34,present - Alice,56,missing - Carol,45,present - -You can use Miller to add a header. The ``--implicit-csv-header`` applies positionally indexed labels: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv --implicit-csv-header cat data/headerless.csv - 1,2,3 - John,23,present - Fred,34,present - Alice,56,missing - Carol,45,present - -Following that, you can rename the positionally indexed labels to names with meaning for your context. For example: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv --implicit-csv-header label name,age,status data/headerless.csv - name,age,status - John,23,present - Fred,34,present - Alice,56,missing - Carol,45,present - -Likewise, if you need to produce CSV which is lacking its header, you can pipe Miller's output to the system command ``sed 1d``, or you can use Miller's ``--headerless-csv-output`` option: - -.. code-block:: none - :emphasize-lines: 1-1 - - head -5 data/colored-shapes.dkvp | mlr --ocsv cat - color,shape,flag,i,u,v,w,x - yellow,triangle,1,11,0.6321695890307647,0.9887207810889004,0.4364983936735774,5.7981881667050565 - red,square,1,15,0.21966833570651523,0.001257332190235938,0.7927778364718627,2.944117399716207 - red,circle,1,16,0.20901671281497636,0.29005231936593445,0.13810280912907674,5.065034003400998 - red,square,0,48,0.9562743938458542,0.7467203085342884,0.7755423050923582,7.117831369597269 - purple,triangle,0,51,0.4355354501763202,0.8591292672156728,0.8122903963006748,5.753094629505863 - -.. code-block:: none - :emphasize-lines: 1-1 - - head -5 data/colored-shapes.dkvp | mlr --ocsv --headerless-csv-output cat - yellow,triangle,1,11,0.6321695890307647,0.9887207810889004,0.4364983936735774,5.7981881667050565 - red,square,1,15,0.21966833570651523,0.001257332190235938,0.7927778364718627,2.944117399716207 - red,circle,1,16,0.20901671281497636,0.29005231936593445,0.13810280912907674,5.065034003400998 - red,square,0,48,0.9562743938458542,0.7467203085342884,0.7755423050923582,7.117831369597269 - purple,triangle,0,51,0.4355354501763202,0.8591292672156728,0.8122903963006748,5.753094629505863 - -Lastly, often we say "CSV" or "TSV" when we have positionally indexed data in columns which are separated by commas or tabs, respectively. In this case it's perhaps simpler to **just use NIDX format** which was designed for this purpose. (See also :doc:`file-formats`.) For example: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --inidx --ifs comma --oxtab cut -f 1,3 data/headerless.csv - 1 John - 3 present - - 1 Fred - 3 present - - 1 Alice - 3 missing - - 1 Carol - 3 present - -Headerless CSV with duplicate field values ------------------------------------------- - -Miller is (by central design) a mapping from name to value, rather than integer position to value as in most tools in the Unix toolkit such as ``sort``, ``cut``, ``awk``, etc. So given input ``Yea=1,Yea=2`` on the same input line, first ``Yea=1`` is stored, then updated with ``Yea=2``. This is in the input-parser and the value ``Yea=1`` is unavailable to any further processing. The following example line comes from a headerless CSV file and includes 5 times the string (value) ``'NA'``: - -.. code-block:: none - :emphasize-lines: 1-1 - - ag '0.9' nas.csv | head -1 - 2:-349801.10097848,4537221.43295653,2,1,NA,NA,NA,NA,NA - -The repeated ``'NA'`` strings (values) in the same line will be treated as fields (columns) with same name, thus only one is kept in the output. - -This can be worked around by telling ``mlr`` that there is no header row by using ``--implicit-csv-header`` or changing the input format by using ``nidx`` like so: - -.. code-block:: none - - ag '0.9' nas.csv | mlr --n2c --fs "," label xsn,ysn,x,y,t,a,e29,e31,e32 then head - -Regularizing ragged CSV ----------------------------------------------------------------- - -Miller handles compliant CSV: in particular, it's an error if the number of data fields in a given data line don't match the number of header lines. But in the event that you have a CSV file in which some lines have less than the full number of fields, you can use Miller to pad them out. The trick is to use NIDX format, for which each line stands on its own without respect to a header line. - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/ragged.csv - a,b,c - 1,2,3 - 4,5 - 6,7,8,9 - -.. code-block:: none - :emphasize-lines: 1-8 - - mlr --from data/ragged.csv --fs comma --nidx put ' - @maxnf = max(@maxnf, NF); - @nf = NF; - while(@nf < @maxnf) { - @nf += 1; - $[@nf] = "" - } - ' - a,b,c - 1,2,3 - 4,5 - 6,7,8,9 - -or, more simply, - -.. code-block:: none - :emphasize-lines: 1-6 - - mlr --from data/ragged.csv --fs comma --nidx put ' - @maxnf = max(@maxnf, NF); - while(NF < @maxnf) { - $[NF+1] = ""; - } - ' - a,b,c - 1,2,3 - 4,5 - 6,7,8,9 diff --git a/docs6/csv-with-and-without-headers.rst.in b/docs6/csv-with-and-without-headers.rst.in deleted file mode 100644 index 7d77c8b4a..000000000 --- a/docs6/csv-with-and-without-headers.rst.in +++ /dev/null @@ -1,72 +0,0 @@ -CSV, with and without headers -============================= - -Headerless CSV on input or output ----------------------------------------------------------------- - -Sometimes we get CSV files which lack a header. For example (`data/headerless.csv <./data/headerless.csv>`_): - -GENRST_RUN_COMMAND -cat data/headerless.csv -GENRST_EOF - -You can use Miller to add a header. The ``--implicit-csv-header`` applies positionally indexed labels: - -GENRST_RUN_COMMAND -mlr --csv --implicit-csv-header cat data/headerless.csv -GENRST_EOF - -Following that, you can rename the positionally indexed labels to names with meaning for your context. For example: - -GENRST_RUN_COMMAND -mlr --csv --implicit-csv-header label name,age,status data/headerless.csv -GENRST_EOF - -Likewise, if you need to produce CSV which is lacking its header, you can pipe Miller's output to the system command ``sed 1d``, or you can use Miller's ``--headerless-csv-output`` option: - -GENRST_RUN_COMMAND -head -5 data/colored-shapes.dkvp | mlr --ocsv cat -GENRST_EOF - -GENRST_RUN_COMMAND -head -5 data/colored-shapes.dkvp | mlr --ocsv --headerless-csv-output cat -GENRST_EOF - -Lastly, often we say "CSV" or "TSV" when we have positionally indexed data in columns which are separated by commas or tabs, respectively. In this case it's perhaps simpler to **just use NIDX format** which was designed for this purpose. (See also :doc:`file-formats`.) For example: - -GENRST_RUN_COMMAND -mlr --inidx --ifs comma --oxtab cut -f 1,3 data/headerless.csv -GENRST_EOF - -Headerless CSV with duplicate field values ------------------------------------------- - -Miller is (by central design) a mapping from name to value, rather than integer position to value as in most tools in the Unix toolkit such as ``sort``, ``cut``, ``awk``, etc. So given input ``Yea=1,Yea=2`` on the same input line, first ``Yea=1`` is stored, then updated with ``Yea=2``. This is in the input-parser and the value ``Yea=1`` is unavailable to any further processing. The following example line comes from a headerless CSV file and includes 5 times the string (value) ``'NA'``: - -GENRST_CARDIFY_HIGHLIGHT_ONE -ag '0.9' nas.csv | head -1 -2:-349801.10097848,4537221.43295653,2,1,NA,NA,NA,NA,NA -GENRST_EOF - -The repeated ``'NA'`` strings (values) in the same line will be treated as fields (columns) with same name, thus only one is kept in the output. - -This can be worked around by telling ``mlr`` that there is no header row by using ``--implicit-csv-header`` or changing the input format by using ``nidx`` like so: - -GENRST_CARDIFY -ag '0.9' nas.csv | mlr --n2c --fs "," label xsn,ysn,x,y,t,a,e29,e31,e32 then head -GENRST_EOF - -Regularizing ragged CSV ----------------------------------------------------------------- - -Miller handles compliant CSV: in particular, it's an error if the number of data fields in a given data line don't match the number of header lines. But in the event that you have a CSV file in which some lines have less than the full number of fields, you can use Miller to pad them out. The trick is to use NIDX format, for which each line stands on its own without respect to a header line. - -GENRST_RUN_COMMAND -cat data/ragged.csv -GENRST_EOF - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/ragged-csv.sh) - -or, more simply, - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/ragged-csv-2.sh) diff --git a/docs6/customization.rst b/docs6/customization.rst deleted file mode 100644 index 0ad89e8a5..000000000 --- a/docs6/customization.rst +++ /dev/null @@ -1,96 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Customization: .mlrrc -================================================================ - -How to use .mlrrc ----------------------------------------------------------------- - -Suppose you always use CSV files. Then instead of always having to type ``--csv`` as in - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv cut -x -f extra mydata.csv - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv sort -n id mydata.csv - -and so on, you can instead put the following into your ``$HOME/.mlrrc``: - -.. code-block:: none - - --csv - -Then you can just type things like - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr cut -x -f extra mydata.csv - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr sort -n id mydata.csv - -and the ``--csv`` part will automatically be understood. (If you do want to process, say, a JSON file then ``mlr --json ...`` at the command line will override the default from your ``.mlrrc``.) - -What you can put in your .mlrrc ----------------------------------------------------------------- - -* You can include any command-line flags, except the "terminal" ones such as ``--help``. - -* The ``--prepipe``, ``--load``, and ``--mload`` flags aren't allowed in ``.mlrrc`` as they control code execution, and could result in your scripts running things you don't expect if you receive data from someone with a ``.mlrrc`` in it. - -* The formatting rule is you need to put one flag beginning with ``--`` per line: for example, ``--csv`` on one line and ``--nr-progress-mod 1000`` on a separate line. - -* Since every line starts with a ``--`` option, you can leave off the initial ``--`` if you want. For example, ``ojson`` is the same as ``--ojson``, and ``nr-progress-mod 1000`` is the same as ``--nr-progress-mod 1000``. - -* Comments are from a ``#`` to the end of the line. - -* Empty lines are ignored -- including lines which are empty after comments are removed. - -Here is an example ``.mlrrc`` file: - -.. code-block:: none - - # Input and output formats are CSV by default (unless otherwise specified - # on the mlr command line): - csv - - # If a data line has fewer fields than the header line, instead of erroring - # (which is the default), just insert empty values for the missing ones: - allow-ragged-csv-input - - # These are no-ops for CSV, but when I do use JSON output, I want these - # pretty-printing options to be used: - jvstack - jlistwrap - - # Use "@", rather than "#", for comments within data files: - skip-comments-with @ - -Where to put your .mlrrc ----------------------------------------------------------------- - -If the environment variable ``MLRRC`` is set: - -* If its value is ``__none__`` then no ``.mlrrc`` files are processed. (This is nice for things like regression testing.) - -* Otherwise, its value (as a filename) is loaded and processed. If there are syntax errors, they abort ``mlr`` with a usage message (as if you had mistyped something on the command line). If the file can't be loaded at all, though, it is silently skipped. - -* Any ``.mlrrc`` in your home directory or current directory is ignored whenever ``MLRRC`` is set in the environment. - -* Example line in your shell's rc file: ``export MLRRC=/path/to/my/mlrrc`` - -Otherwise: - -* If ``$HOME/.mlrrc`` exists, it's processed as above. - -* If ``./.mlrrc`` exists, it's then also processed as above. - -* The idea is you can have all your settings in your ``$HOME/.mlrrc``, then override maybe one or two for your current directory if you like. diff --git a/docs6/customization.rst.in b/docs6/customization.rst.in deleted file mode 100644 index ea701d655..000000000 --- a/docs6/customization.rst.in +++ /dev/null @@ -1,73 +0,0 @@ -Customization: .mlrrc -================================================================ - -How to use .mlrrc ----------------------------------------------------------------- - -Suppose you always use CSV files. Then instead of always having to type ``--csv`` as in - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr --csv cut -x -f extra mydata.csv -GENRST_EOF - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr --csv sort -n id mydata.csv -GENRST_EOF - -and so on, you can instead put the following into your ``$HOME/.mlrrc``: - -GENRST_CARDIFY - --csv -GENRST_EOF - -Then you can just type things like - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr cut -x -f extra mydata.csv -GENRST_EOF - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr sort -n id mydata.csv -GENRST_EOF - -and the ``--csv`` part will automatically be understood. (If you do want to process, say, a JSON file then ``mlr --json ...`` at the command line will override the default from your ``.mlrrc``.) - -What you can put in your .mlrrc ----------------------------------------------------------------- - -* You can include any command-line flags, except the "terminal" ones such as ``--help``. - -* The ``--prepipe``, ``--load``, and ``--mload`` flags aren't allowed in ``.mlrrc`` as they control code execution, and could result in your scripts running things you don't expect if you receive data from someone with a ``.mlrrc`` in it. - -* The formatting rule is you need to put one flag beginning with ``--`` per line: for example, ``--csv`` on one line and ``--nr-progress-mod 1000`` on a separate line. - -* Since every line starts with a ``--`` option, you can leave off the initial ``--`` if you want. For example, ``ojson`` is the same as ``--ojson``, and ``nr-progress-mod 1000`` is the same as ``--nr-progress-mod 1000``. - -* Comments are from a ``#`` to the end of the line. - -* Empty lines are ignored -- including lines which are empty after comments are removed. - -Here is an example ``.mlrrc`` file: - -GENRST_INCLUDE_ESCAPED(sample_mlrrc) - -Where to put your .mlrrc ----------------------------------------------------------------- - -If the environment variable ``MLRRC`` is set: - -* If its value is ``__none__`` then no ``.mlrrc`` files are processed. (This is nice for things like regression testing.) - -* Otherwise, its value (as a filename) is loaded and processed. If there are syntax errors, they abort ``mlr`` with a usage message (as if you had mistyped something on the command line). If the file can't be loaded at all, though, it is silently skipped. - -* Any ``.mlrrc`` in your home directory or current directory is ignored whenever ``MLRRC`` is set in the environment. - -* Example line in your shell's rc file: ``export MLRRC=/path/to/my/mlrrc`` - -Otherwise: - -* If ``$HOME/.mlrrc`` exists, it's processed as above. - -* If ``./.mlrrc`` exists, it's then also processed as above. - -* The idea is you can have all your settings in your ``$HOME/.mlrrc``, then override maybe one or two for your current directory if you like. diff --git a/docs6/data-cleaning-examples.rst b/docs6/data-cleaning-examples.rst deleted file mode 100644 index 4e4638bdc..000000000 --- a/docs6/data-cleaning-examples.rst +++ /dev/null @@ -1,77 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Data-cleaning examples -================================================================ - -Here are some ways to use the type-checking options as described in :ref:`reference-dsl-type-tests-and-assertions` Suppose you have the following data file, with inconsistent typing for boolean. (Also imagine that, for the sake of discussion, we have a million-line file rather than a four-line file, so we can't see it all at once and some automation is called for.) - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/het-bool.csv - name,reachable - barney,false - betty,true - fred,true - wilma,1 - -One option is to coerce everything to boolean, or integer: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --opprint put '$reachable = boolean($reachable)' data/het-bool.csv - name reachable - barney false - betty true - fred true - wilma true - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --opprint put '$reachable = int(boolean($reachable))' data/het-bool.csv - name reachable - barney 0 - betty 1 - fred 1 - wilma 1 - -A second option is to flag badly formatted data within the output stream: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --opprint put '$format_ok = is_string($reachable)' data/het-bool.csv - name reachable format_ok - barney false false - betty true false - fred true false - wilma 1 false - -Or perhaps to flag badly formatted data outside the output stream: - -.. code-block:: none - :emphasize-lines: 1-3 - - mlr --icsv --opprint put ' - if (!is_string($reachable)) {eprint "Malformed at NR=".NR} - ' data/het-bool.csv - Malformed at NR=1 - Malformed at NR=2 - Malformed at NR=3 - Malformed at NR=4 - name reachable - barney false - betty true - fred true - wilma 1 - -A third way is to abort the process on first instance of bad data: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv put '$reachable = asserting_string($reachable)' data/het-bool.csv - Miller: is_string type-assertion failed at NR=1 FNR=1 FILENAME=data/het-bool.csv diff --git a/docs6/data-cleaning-examples.rst.in b/docs6/data-cleaning-examples.rst.in deleted file mode 100644 index a1e55f9a0..000000000 --- a/docs6/data-cleaning-examples.rst.in +++ /dev/null @@ -1,38 +0,0 @@ -Data-cleaning examples -================================================================ - -Here are some ways to use the type-checking options as described in :ref:`reference-dsl-type-tests-and-assertions` Suppose you have the following data file, with inconsistent typing for boolean. (Also imagine that, for the sake of discussion, we have a million-line file rather than a four-line file, so we can't see it all at once and some automation is called for.) - -GENRST_RUN_COMMAND -cat data/het-bool.csv -GENRST_EOF - -One option is to coerce everything to boolean, or integer: - -GENRST_RUN_COMMAND -mlr --icsv --opprint put '$reachable = boolean($reachable)' data/het-bool.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --icsv --opprint put '$reachable = int(boolean($reachable))' data/het-bool.csv -GENRST_EOF - -A second option is to flag badly formatted data within the output stream: - -GENRST_RUN_COMMAND -mlr --icsv --opprint put '$format_ok = is_string($reachable)' data/het-bool.csv -GENRST_EOF - -Or perhaps to flag badly formatted data outside the output stream: - -GENRST_RUN_COMMAND -mlr --icsv --opprint put ' - if (!is_string($reachable)) {eprint "Malformed at NR=".NR} -' data/het-bool.csv -GENRST_EOF - -A third way is to abort the process on first instance of bad data: - -GENRST_RUN_COMMAND_TOLERATING_ERROR -mlr --csv put '$reachable = asserting_string($reachable)' data/het-bool.csv -GENRST_EOF diff --git a/docs6/data-diving-examples.rst b/docs6/data-diving-examples.rst deleted file mode 100644 index 83ec92760..000000000 --- a/docs6/data-diving-examples.rst +++ /dev/null @@ -1,234 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Data-diving examples -================================================================ - -flins data ----------------------------------------------------------------- - -The `flins.csv `_ file is some sample data obtained from https://support.spatialkey.com/spatialkey-sample-csv-data. - -Vertical-tabular format is good for a quick look at CSV data layout -- seeing what columns you have to work with: - -.. code-block:: none - :emphasize-lines: 1-1 - - head -n 2 data/flins.csv | mlr --icsv --oxtab cat - county Seminole - tiv_2011 22890.55 - tiv_2012 20848.71 - line Residential - -A few simple queries: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --from data/flins.csv --icsv --opprint count-distinct -f county | head - county count - Seminole 1 - Miami Dade 2 - Palm Beach 1 - Highlands 2 - Duval 1 - St. Johns 1 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --from data/flins.csv --icsv --opprint count-distinct -f construction,line - -Categorization of total insured value: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --from data/flins.csv --icsv --opprint stats1 -a min,mean,max -f tiv_2012 - tiv_2012_min tiv_2012_mean tiv_2012_max - 19757.91 1061531.4637499999 2785551.63 - -.. code-block:: none - :emphasize-lines: 1-2 - - mlr --from data/flins.csv --icsv --opprint \ - stats1 -a min,mean,max -f tiv_2012 -g construction,line - -.. code-block:: none - :emphasize-lines: 1-2 - - mlr --from data/flins.csv --icsv --oxtab \ - stats1 -a p0,p10,p50,p90,p95,p99,p100 -f hu_site_deductible - -.. code-block:: none - :emphasize-lines: 1-3 - - mlr --from data/flins.csv --icsv --opprint \ - stats1 -a p95,p99,p100 -f hu_site_deductible -g county \ - then sort -f county | head - county - Duval - Highlands - Miami Dade - Palm Beach - Seminole - St. Johns - -.. code-block:: none - :emphasize-lines: 1-2 - - mlr --from data/flins.csv --icsv --oxtab \ - stats2 -a corr,linreg-ols,r2 -f tiv_2011,tiv_2012 - tiv_2011_tiv_2012_corr 0.9353629581411828 - tiv_2011_tiv_2012_ols_m 1.0890905877734807 - tiv_2011_tiv_2012_ols_b 103095.52335638746 - tiv_2011_tiv_2012_ols_n 8 - tiv_2011_tiv_2012_r2 0.8749038634626236 - -.. code-block:: none - :emphasize-lines: 1-2 - - mlr --from data/flins.csv --icsv --opprint \ - stats2 -a corr,linreg-ols,r2 -f tiv_2011,tiv_2012 -g county - county tiv_2011_tiv_2012_corr tiv_2011_tiv_2012_ols_m tiv_2011_tiv_2012_ols_b tiv_2011_tiv_2012_ols_n tiv_2011_tiv_2012_r2 - Seminole - - - 1 - - Miami Dade 1 0.9306426512386247 -2311.1543275160047 2 0.9999999999999999 - Palm Beach - - - 1 - - Highlands 0.9999999999999997 1.055692910750992 -4529.7939388307705 2 0.9999999999999992 - Duval - - - 1 - - St. Johns - - - 1 - - -Color/shape data ----------------------------------------------------------------- - -The `colored-shapes.dkvp `_ file is some sample data produced by the `mkdat2 `_ script. The idea is: - -* Produce some data with known distributions and correlations, and verify that Miller recovers those properties empirically. -* Each record is labeled with one of a few colors and one of a few shapes. -* The ``flag`` field is 0 or 1, with probability dependent on color -* The ``u`` field is plain uniform on the unit interval. -* The ``v`` field is the same, except tightly correlated with ``u`` for red circles. -* The ``w`` field is autocorrelated for each color/shape pair. -* The ``x`` field is boring Gaussian with mean 5 and standard deviation about 1.2, with no dependence on color or shape. - -Peek at the data: - -.. code-block:: none - :emphasize-lines: 1-1 - - wc -l data/colored-shapes.dkvp - 10078 data/colored-shapes.dkvp - -.. code-block:: none - :emphasize-lines: 1-1 - - head -n 6 data/colored-shapes.dkvp | mlr --opprint cat - color shape flag i u v w x - yellow triangle 1 11 0.6321695890307647 0.9887207810889004 0.4364983936735774 5.7981881667050565 - red square 1 15 0.21966833570651523 0.001257332190235938 0.7927778364718627 2.944117399716207 - red circle 1 16 0.20901671281497636 0.29005231936593445 0.13810280912907674 5.065034003400998 - red square 0 48 0.9562743938458542 0.7467203085342884 0.7755423050923582 7.117831369597269 - purple triangle 0 51 0.4355354501763202 0.8591292672156728 0.8122903963006748 5.753094629505863 - red square 0 64 0.2015510269821953 0.9531098083420033 0.7719912015786777 5.612050466474166 - -Look at uncategorized stats (using `creach `_ for spacing). - -Here it looks reasonable that ``u`` is unit-uniform; something's up with ``v`` but we can't yet see what: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --oxtab stats1 -a min,mean,max -f flag,u,v data/colored-shapes.dkvp | creach 3 - flag_min 0 - flag_mean 0.39888866838658465 - flag_max 1 - - u_min 0.000043912454007477564 - u_mean 0.4983263438118866 - u_max 0.9999687954968421 - - v_min -0.09270905318501277 - v_mean 0.49778696527477023 - v_max 1.0724998185026013 - -The histogram shows the different distribution of 0/1 flags: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint histogram -f flag,u,v --lo -0.1 --hi 1.1 --nbins 12 data/colored-shapes.dkvp - bin_lo bin_hi flag_count u_count v_count - -0.010000000000000002 0.09000000000000002 6058 0 36 - 0.09000000000000002 0.19000000000000003 0 1062 988 - 0.19000000000000003 0.29000000000000004 0 985 1003 - 0.29000000000000004 0.39000000000000007 0 1024 1014 - 0.39000000000000007 0.4900000000000001 0 1002 991 - 0.4900000000000001 0.5900000000000002 0 989 1041 - 0.5900000000000002 0.6900000000000002 0 1001 1016 - 0.6900000000000002 0.7900000000000001 0 972 962 - 0.7900000000000001 0.8900000000000002 0 1035 1070 - 0.8900000000000002 0.9900000000000002 0 995 993 - 0.9900000000000002 1.0900000000000003 4020 1013 939 - 1.0900000000000003 1.1900000000000002 0 0 25 - -Look at univariate stats by color and shape. In particular, color-dependent flag probabilities pop out, aligning with their original Bernoulli probablities from the data-generator script: - -.. code-block:: none - :emphasize-lines: 1-3 - - mlr --opprint stats1 -a min,mean,max -f flag,u,v -g color \ - then sort -f color \ - data/colored-shapes.dkvp - color flag_min flag_mean flag_max u_min u_mean u_max v_min v_mean v_max - blue 0 0.5843537414965987 1 0.000043912454007477564 0.517717155039078 0.9999687954968421 0.0014886830387470518 0.49105642841387653 0.9995761761685742 - green 0 0.20919747520288548 1 0.00048750676198217047 0.5048610622924616 0.9999361779701204 0.0005012669003675585 0.49908475928072205 0.9996764373885353 - orange 0 0.5214521452145214 1 0.00123537823160913 0.49053241689014415 0.9988853487546249 0.0024486660337188493 0.4877637745987629 0.998475130432018 - purple 0 0.09019264448336252 1 0.0002655214518428872 0.4940049543793683 0.9996465731736793 0.0003641137096487279 0.497050699948439 0.9999751864255598 - red 0 0.3031674208144796 1 0.0006711367180041172 0.49255964831571375 0.9998822102016469 -0.09270905318501277 0.4965350959465078 1.0724998185026013 - yellow 0 0.8924274593064402 1 0.001300228762057487 0.49712912165196765 0.99992313390574 0.0007109695568577878 0.510626599360317 0.9999189897724752 - -.. code-block:: none - :emphasize-lines: 1-3 - - mlr --opprint stats1 -a min,mean,max -f flag,u,v -g shape \ - then sort -f shape \ - data/colored-shapes.dkvp - shape flag_min flag_mean flag_max u_min u_mean u_max v_min v_mean v_max - circle 0 0.3998456194519491 1 0.000043912454007477564 0.49855450951394115 0.99992313390574 -0.09270905318501277 0.49552415740048406 1.0724998185026013 - square 0 0.39611178614823817 1 0.0001881939925673093 0.499385458061097 0.9999687954968421 0.00008930277299445954 0.49653825501903986 0.9999751864255598 - triangle 0 0.4015421115065243 1 0.000881025170573424 0.4968585405884252 0.9996614910922645 0.000716883409890845 0.501049532862137 0.9999946837499262 - -Look at bivariate stats by color and shape. In particular, ``u,v`` pairwise correlation for red circles pops out: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint --right stats2 -a corr -f u,v,w,x data/colored-shapes.dkvp - u_v_corr w_x_corr - 0.13341803768384553 -0.011319938208638764 - -.. code-block:: none - :emphasize-lines: 1-3 - - mlr --opprint --right \ - stats2 -a corr -f u,v,w,x -g color,shape then sort -nr u_v_corr \ - data/colored-shapes.dkvp - color shape u_v_corr w_x_corr - red circle 0.9807984157534667 -0.018565046320623148 - orange square 0.17685846147882145 -0.07104374629148885 - green circle 0.05764430126828069 0.011795210176784067 - red square 0.055744791559722166 -0.0006802175149145207 - yellow triangle 0.04457267106380469 0.02460476240108526 - yellow square 0.04379171794446621 -0.04462267239937856 - purple circle 0.03587354791796681 0.13411247530136805 - blue square 0.03241156493114544 -0.05350791240143263 - blue triangle 0.015356295190464324 -0.0006084778850362686 - orange circle 0.01051866723398945 -0.1627949723421722 - red triangle 0.00809781003735548 0.012485753551391776 - purple triangle 0.005155038421780437 -0.04505792148014131 - purple square -0.02568020549187632 0.05769444883779078 - green square -0.025775985300150128 -0.003265248022084335 - orange triangle -0.030456930370361554 -0.131870019629393 - yellow circle -0.06477338560056926 0.07369474300245252 - blue circle -0.1023476302678634 -0.030529007506883508 - green triangle -0.10901830007460846 -0.0484881707807228 diff --git a/docs6/data-diving-examples.rst.in b/docs6/data-diving-examples.rst.in deleted file mode 100644 index 40d157615..000000000 --- a/docs6/data-diving-examples.rst.in +++ /dev/null @@ -1,118 +0,0 @@ -Data-diving examples -================================================================ - -flins data ----------------------------------------------------------------- - -The `flins.csv `_ file is some sample data obtained from https://support.spatialkey.com/spatialkey-sample-csv-data. - -Vertical-tabular format is good for a quick look at CSV data layout -- seeing what columns you have to work with: - -GENRST_RUN_COMMAND -head -n 2 data/flins.csv | mlr --icsv --oxtab cat -GENRST_EOF - -A few simple queries: - -GENRST_RUN_COMMAND -mlr --from data/flins.csv --icsv --opprint count-distinct -f county | head -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --from data/flins.csv --icsv --opprint count-distinct -f construction,line -GENRST_EOF - -Categorization of total insured value: - -GENRST_RUN_COMMAND -mlr --from data/flins.csv --icsv --opprint stats1 -a min,mean,max -f tiv_2012 -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --from data/flins.csv --icsv --opprint \ - stats1 -a min,mean,max -f tiv_2012 -g construction,line -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --from data/flins.csv --icsv --oxtab \ - stats1 -a p0,p10,p50,p90,p95,p99,p100 -f hu_site_deductible -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --from data/flins.csv --icsv --opprint \ - stats1 -a p95,p99,p100 -f hu_site_deductible -g county \ - then sort -f county | head -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --from data/flins.csv --icsv --oxtab \ - stats2 -a corr,linreg-ols,r2 -f tiv_2011,tiv_2012 -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --from data/flins.csv --icsv --opprint \ - stats2 -a corr,linreg-ols,r2 -f tiv_2011,tiv_2012 -g county -GENRST_EOF - -Color/shape data ----------------------------------------------------------------- - -The `colored-shapes.dkvp `_ file is some sample data produced by the `mkdat2 `_ script. The idea is: - -* Produce some data with known distributions and correlations, and verify that Miller recovers those properties empirically. -* Each record is labeled with one of a few colors and one of a few shapes. -* The ``flag`` field is 0 or 1, with probability dependent on color -* The ``u`` field is plain uniform on the unit interval. -* The ``v`` field is the same, except tightly correlated with ``u`` for red circles. -* The ``w`` field is autocorrelated for each color/shape pair. -* The ``x`` field is boring Gaussian with mean 5 and standard deviation about 1.2, with no dependence on color or shape. - -Peek at the data: - -GENRST_RUN_COMMAND -wc -l data/colored-shapes.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -head -n 6 data/colored-shapes.dkvp | mlr --opprint cat -GENRST_EOF - -Look at uncategorized stats (using `creach `_ for spacing). - -Here it looks reasonable that ``u`` is unit-uniform; something's up with ``v`` but we can't yet see what: - -GENRST_RUN_COMMAND -mlr --oxtab stats1 -a min,mean,max -f flag,u,v data/colored-shapes.dkvp | creach 3 -GENRST_EOF - -The histogram shows the different distribution of 0/1 flags: - -GENRST_RUN_COMMAND -mlr --opprint histogram -f flag,u,v --lo -0.1 --hi 1.1 --nbins 12 data/colored-shapes.dkvp -GENRST_EOF - -Look at univariate stats by color and shape. In particular, color-dependent flag probabilities pop out, aligning with their original Bernoulli probablities from the data-generator script: - -GENRST_RUN_COMMAND -mlr --opprint stats1 -a min,mean,max -f flag,u,v -g color \ - then sort -f color \ - data/colored-shapes.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint stats1 -a min,mean,max -f flag,u,v -g shape \ - then sort -f shape \ - data/colored-shapes.dkvp -GENRST_EOF - -Look at bivariate stats by color and shape. In particular, ``u,v`` pairwise correlation for red circles pops out: - -GENRST_RUN_COMMAND -mlr --opprint --right stats2 -a corr -f u,v,w,x data/colored-shapes.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint --right \ - stats2 -a corr -f u,v,w,x -g color,shape then sort -nr u_v_corr \ - data/colored-shapes.dkvp -GENRST_EOF diff --git a/docs6/dates-and-times.rst b/docs6/dates-and-times.rst deleted file mode 100644 index 3c4caa90e..000000000 --- a/docs6/dates-and-times.rst +++ /dev/null @@ -1,126 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Dates and times -=============== - -How can I filter by date? ----------------------------------------------------------------- - -Given input like - -.. code-block:: none - :emphasize-lines: 1-1 - - cat dates.csv - date,event - 2018-02-03,initialization - 2018-03-07,discovery - 2018-02-03,allocation - -we can use ``strptime`` to parse the date field into seconds-since-epoch and then do numeric comparisons. Simply match your input dataset's date-formatting to the :ref:`reference-dsl-strptime` format-string. For example: - -.. code-block:: none - :emphasize-lines: 1-3 - - mlr --csv filter ' - strptime($date, "%Y-%m-%d") > strptime("2018-03-03", "%Y-%m-%d") - ' dates.csv - date,event - 2018-03-07,discovery - -Caveat: localtime-handling in timezones with DST is still a work in progress; see https://github.com/johnkerl/miller/issues/170. See also https://github.com/johnkerl/miller/issues/208 -- thanks @aborruso! - -Finding missing dates ----------------------------------------------------------------- - -Suppose you have some date-stamped data which may (or may not) be missing entries for one or more dates: - -.. code-block:: none - :emphasize-lines: 1-1 - - head -n 10 data/miss-date.csv - date,qoh - 2012-03-05,10055 - 2012-03-06,10486 - 2012-03-07,10430 - 2012-03-08,10674 - 2012-03-09,10880 - 2012-03-10,10718 - 2012-03-11,10795 - 2012-03-12,11043 - 2012-03-13,11177 - -.. code-block:: none - :emphasize-lines: 1-1 - - wc -l data/miss-date.csv - 1372 data/miss-date.csv - -Since there are 1372 lines in the data file, some automation is called for. To find the missing dates, you can convert the dates to seconds since the epoch using ``strptime``, then compute adjacent differences (the ``cat -n`` simply inserts record-counters): - -.. code-block:: none - :emphasize-lines: 1-5 - - mlr --from data/miss-date.csv --icsv \ - cat -n \ - then put '$datestamp = strptime($date, "%Y-%m-%d")' \ - then step -a delta -f datestamp \ - | head - n=1,date=2012-03-05,qoh=10055,datestamp=1330905600,datestamp_delta=0 - n=2,date=2012-03-06,qoh=10486,datestamp=1330992000,datestamp_delta=86400 - n=3,date=2012-03-07,qoh=10430,datestamp=1331078400,datestamp_delta=86400 - n=4,date=2012-03-08,qoh=10674,datestamp=1331164800,datestamp_delta=86400 - n=5,date=2012-03-09,qoh=10880,datestamp=1331251200,datestamp_delta=86400 - n=6,date=2012-03-10,qoh=10718,datestamp=1331337600,datestamp_delta=86400 - n=7,date=2012-03-11,qoh=10795,datestamp=1331424000,datestamp_delta=86400 - n=8,date=2012-03-12,qoh=11043,datestamp=1331510400,datestamp_delta=86400 - n=9,date=2012-03-13,qoh=11177,datestamp=1331596800,datestamp_delta=86400 - n=10,date=2012-03-14,qoh=11498,datestamp=1331683200,datestamp_delta=86400 - -Then, filter for adjacent difference not being 86400 (the number of seconds in a day): - -.. code-block:: none - :emphasize-lines: 1-5 - - mlr --from data/miss-date.csv --icsv \ - cat -n \ - then put '$datestamp = strptime($date, "%Y-%m-%d")' \ - then step -a delta -f datestamp \ - then filter '$datestamp_delta != 86400 && $n != 1' - n=774,date=2014-04-19,qoh=130140,datestamp=1397865600,datestamp_delta=259200 - n=1119,date=2015-03-31,qoh=181625,datestamp=1427760000,datestamp_delta=172800 - -Given this, it's now easy to see where the gaps are: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr cat -n then filter '$n >= 770 && $n <= 780' data/miss-date.csv - n=770,1=2014-04-12,2=129435 - n=771,1=2014-04-13,2=129868 - n=772,1=2014-04-14,2=129797 - n=773,1=2014-04-15,2=129919 - n=774,1=2014-04-16,2=130181 - n=775,1=2014-04-19,2=130140 - n=776,1=2014-04-20,2=130271 - n=777,1=2014-04-21,2=130368 - n=778,1=2014-04-22,2=130368 - n=779,1=2014-04-23,2=130849 - n=780,1=2014-04-24,2=131026 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr cat -n then filter '$n >= 1115 && $n <= 1125' data/miss-date.csv - n=1115,1=2015-03-25,2=181006 - n=1116,1=2015-03-26,2=180995 - n=1117,1=2015-03-27,2=181043 - n=1118,1=2015-03-28,2=181112 - n=1119,1=2015-03-29,2=181306 - n=1120,1=2015-03-31,2=181625 - n=1121,1=2015-04-01,2=181494 - n=1122,1=2015-04-02,2=181718 - n=1123,1=2015-04-03,2=181835 - n=1124,1=2015-04-04,2=182104 - n=1125,1=2015-04-05,2=182528 diff --git a/docs6/dates-and-times.rst.in b/docs6/dates-and-times.rst.in deleted file mode 100644 index 23df8586f..000000000 --- a/docs6/dates-and-times.rst.in +++ /dev/null @@ -1,52 +0,0 @@ -Dates and times -=============== - -How can I filter by date? ----------------------------------------------------------------- - -Given input like - -GENRST_RUN_COMMAND -cat dates.csv -GENRST_EOF - -we can use ``strptime`` to parse the date field into seconds-since-epoch and then do numeric comparisons. Simply match your input dataset's date-formatting to the :ref:`reference-dsl-strptime` format-string. For example: - -GENRST_RUN_COMMAND -mlr --csv filter ' - strptime($date, "%Y-%m-%d") > strptime("2018-03-03", "%Y-%m-%d") -' dates.csv -GENRST_EOF - -Caveat: localtime-handling in timezones with DST is still a work in progress; see https://github.com/johnkerl/miller/issues/170. See also https://github.com/johnkerl/miller/issues/208 -- thanks @aborruso! - -Finding missing dates ----------------------------------------------------------------- - -Suppose you have some date-stamped data which may (or may not) be missing entries for one or more dates: - -GENRST_RUN_COMMAND -head -n 10 data/miss-date.csv -GENRST_EOF - -GENRST_RUN_COMMAND -wc -l data/miss-date.csv -GENRST_EOF - -Since there are 1372 lines in the data file, some automation is called for. To find the missing dates, you can convert the dates to seconds since the epoch using ``strptime``, then compute adjacent differences (the ``cat -n`` simply inserts record-counters): - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/miss-date-1.sh) - -Then, filter for adjacent difference not being 86400 (the number of seconds in a day): - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/miss-date-2.sh) - -Given this, it's now easy to see where the gaps are: - -GENRST_RUN_COMMAND -mlr cat -n then filter '$n >= 770 && $n <= 780' data/miss-date.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr cat -n then filter '$n >= 1115 && $n <= 1125' data/miss-date.csv -GENRST_EOF diff --git a/docs6/dkvp-examples.rst b/docs6/dkvp-examples.rst deleted file mode 100644 index 840e84d07..000000000 --- a/docs6/dkvp-examples.rst +++ /dev/null @@ -1,253 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -DKVP I/O examples -====================== - -DKVP I/O in Python -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Here are the I/O routines: - -.. code-block:: none - - #!/usr/bin/env python - - # ================================================================ - # Example of DKVP I/O using Python. - # - # Key point: Use Miller for what it's good at; pass data into/out of tools in - # other languages to do what they're good at. - # - # bash$ python -i dkvp_io.py - # - # # READ - # >>> map = dkvpline2map('x=1,y=2', '=', ',') - # >>> map - # OrderedDict([('x', '1'), ('y', '2')]) - # - # # MODIFY - # >>> map['z'] = map['x'] + map['y'] - # >>> map - # OrderedDict([('x', '1'), ('y', '2'), ('z', 3)]) - # - # # WRITE - # >>> line = map2dkvpline(map, '=', ',') - # >>> line - # 'x=1,y=2,z=3' - # - # ================================================================ - - import re - import collections - - # ---------------------------------------------------------------- - # ips and ifs (input pair separator and input field separator) are nominally '=' and ','. - def dkvpline2map(line, ips, ifs): - pairs = re.split(ifs, line) - map = collections.OrderedDict() - for pair in pairs: - key, value = re.split(ips, pair, 1) - - # Type inference: - try: - value = int(value) - except: - try: - value = float(value) - except: - pass - - map[key] = value - return map - - # ---------------------------------------------------------------- - # ops and ofs (output pair separator and output field separator) are nominally '=' and ','. - def map2dkvpline(map , ops, ofs): - line = '' - pairs = [] - for key in map: - pairs.append(str(key) + ops + str(map[key])) - return str.join(ofs, pairs) - -And here is an example using them: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat polyglot-dkvp-io/example.py - #!/usr/bin/env python - - import sys - import re - import copy - import dkvp_io - - while True: - # Read the original record: - line = sys.stdin.readline().strip() - if line == '': - break - map = dkvp_io.dkvpline2map(line, '=', ',') - - # Drop a field: - map.pop('x') - - # Compute some new fields: - map['ab'] = map['a'] + map['b'] - map['iy'] = map['i'] + map['y'] - - # Add new fields which show type of each already-existing field: - omap = copy.copy(map) # since otherwise the for-loop will modify what it loops over - keys = omap.keys() - for key in keys: - # Convert "" to just "int", etc.: - type_string = str(map[key].__class__) - type_string = re.sub("", "", type_string) - map['t'+key] = type_string - - # Write the modified record: - print(dkvp_io.map2dkvpline(map, '=', ',')) - -Run as-is: - -.. code-block:: none - :emphasize-lines: 1-1 - - python polyglot-dkvp-io/example.py < data/small - a=pan,b=pan,i=1,y=0.7268028627434533,ab=panpan,iy=1.7268028627434533,ta=str,tb=str,ti=int,ty=float,tab=str,tiy=float - a=eks,b=pan,i=2,y=0.5221511083334797,ab=ekspan,iy=2.5221511083334796,ta=str,tb=str,ti=int,ty=float,tab=str,tiy=float - a=wye,b=wye,i=3,y=0.33831852551664776,ab=wyewye,iy=3.3383185255166477,ta=str,tb=str,ti=int,ty=float,tab=str,tiy=float - a=eks,b=wye,i=4,y=0.13418874328430463,ab=ekswye,iy=4.134188743284304,ta=str,tb=str,ti=int,ty=float,tab=str,tiy=float - a=wye,b=pan,i=5,y=0.8636244699032729,ab=wyepan,iy=5.863624469903273,ta=str,tb=str,ti=int,ty=float,tab=str,tiy=float - -Run as-is, then pipe to Miller for pretty-printing: - -.. code-block:: none - :emphasize-lines: 1-1 - - python polyglot-dkvp-io/example.py < data/small | mlr --opprint cat - a b i y ab iy ta tb ti ty tab tiy - pan pan 1 0.7268028627434533 panpan 1.7268028627434533 str str int float str float - eks pan 2 0.5221511083334797 ekspan 2.5221511083334796 str str int float str float - wye wye 3 0.33831852551664776 wyewye 3.3383185255166477 str str int float str float - eks wye 4 0.13418874328430463 ekswye 4.134188743284304 str str int float str float - wye pan 5 0.8636244699032729 wyepan 5.863624469903273 str str int float str float - -DKVP I/O in Ruby -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Here are the I/O routines: - -.. code-block:: none - - #!/usr/bin/env ruby - - # ================================================================ - # Example of DKVP I/O using Ruby. - # - # Key point: Use Miller for what it's good at; pass data into/out of tools in - # other languages to do what they're good at. - # - # bash$ irb -I. -r dkvp_io.rb - # - # # READ - # irb(main):001:0> map = dkvpline2map('x=1,y=2', '=', ',') - # => {"x"=>"1", "y"=>"2"} - # - # # MODIFY - # irb(main):001:0> map['z'] = map['x'] + map['y'] - # => 3 - # - # # WRITE - # irb(main):002:0> line = map2dkvpline(map, '=', ',') - # => "x=1,y=2,z=3" - # - # ================================================================ - - # ---------------------------------------------------------------- - # ips and ifs (input pair separator and input field separator) are nominally '=' and ','. - def dkvpline2map(line, ips, ifs) - map = {} - line.split(ifs).each do |pair| - (k, v) = pair.split(ips, 2) - - # Type inference: - begin - v = Integer(v) - rescue ArgumentError - begin - v = Float(v) - rescue ArgumentError - # Leave as string - end - end - - map[k] = v - end - map - end - - # ---------------------------------------------------------------- - # ops and ofs (output pair separator and output field separator) are nominally '=' and ','. - def map2dkvpline(map, ops, ofs) - map.collect{|k,v| k.to_s + ops + v.to_s}.join(ofs) - end - -And here is an example using them: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat polyglot-dkvp-io/example.rb - #!/usr/bin/env ruby - - require 'dkvp_io' - - ARGF.each do |line| - # Read the original record: - map = dkvpline2map(line.chomp, '=', ',') - - # Drop a field: - map.delete('x') - - # Compute some new fields: - map['ab'] = map['a'] + map['b'] - map['iy'] = map['i'] + map['y'] - - # Add new fields which show type of each already-existing field: - keys = map.keys - keys.each do |key| - map['t'+key] = map[key].class - end - - # Write the modified record: - puts map2dkvpline(map, '=', ',') - end - -Run as-is: - -.. code-block:: none - :emphasize-lines: 1-1 - - ruby -I./polyglot-dkvp-io polyglot-dkvp-io/example.rb data/small - a=pan,b=pan,i=1,y=0.7268028627434533,ab=panpan,iy=1.7268028627434533,ta=String,tb=String,ti=Integer,ty=Float,tab=String,tiy=Float - a=eks,b=pan,i=2,y=0.5221511083334797,ab=ekspan,iy=2.5221511083334796,ta=String,tb=String,ti=Integer,ty=Float,tab=String,tiy=Float - a=wye,b=wye,i=3,y=0.33831852551664776,ab=wyewye,iy=3.3383185255166477,ta=String,tb=String,ti=Integer,ty=Float,tab=String,tiy=Float - a=eks,b=wye,i=4,y=0.13418874328430463,ab=ekswye,iy=4.134188743284304,ta=String,tb=String,ti=Integer,ty=Float,tab=String,tiy=Float - a=wye,b=pan,i=5,y=0.8636244699032729,ab=wyepan,iy=5.863624469903273,ta=String,tb=String,ti=Integer,ty=Float,tab=String,tiy=Float - -Run as-is, then pipe to Miller for pretty-printing: - -.. code-block:: none - :emphasize-lines: 1-1 - - ruby -I./polyglot-dkvp-io polyglot-dkvp-io/example.rb data/small | mlr --opprint cat - a b i y ab iy ta tb ti ty tab tiy - pan pan 1 0.7268028627434533 panpan 1.7268028627434533 String String Integer Float String Float - eks pan 2 0.5221511083334797 ekspan 2.5221511083334796 String String Integer Float String Float - wye wye 3 0.33831852551664776 wyewye 3.3383185255166477 String String Integer Float String Float - eks wye 4 0.13418874328430463 ekswye 4.134188743284304 String String Integer Float String Float - wye pan 5 0.8636244699032729 wyepan 5.863624469903273 String String Integer Float String Float diff --git a/docs6/dkvp-examples.rst.in b/docs6/dkvp-examples.rst.in deleted file mode 100644 index 29777205f..000000000 --- a/docs6/dkvp-examples.rst.in +++ /dev/null @@ -1,52 +0,0 @@ -DKVP I/O examples -====================== - -DKVP I/O in Python -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Here are the I/O routines: - -GENRST_INCLUDE_ESCAPED(polyglot-dkvp-io/dkvp_io.py) - -And here is an example using them: - -GENRST_RUN_COMMAND -cat polyglot-dkvp-io/example.py -GENRST_EOF - -Run as-is: - -GENRST_RUN_COMMAND -python polyglot-dkvp-io/example.py < data/small -GENRST_EOF - -Run as-is, then pipe to Miller for pretty-printing: - -GENRST_RUN_COMMAND -python polyglot-dkvp-io/example.py < data/small | mlr --opprint cat -GENRST_EOF - -DKVP I/O in Ruby -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Here are the I/O routines: - -GENRST_INCLUDE_ESCAPED(polyglot-dkvp-io/dkvp_io.rb) - -And here is an example using them: - -GENRST_RUN_COMMAND -cat polyglot-dkvp-io/example.rb -GENRST_EOF - -Run as-is: - -GENRST_RUN_COMMAND -ruby -I./polyglot-dkvp-io polyglot-dkvp-io/example.rb data/small -GENRST_EOF - -Run as-is, then pipe to Miller for pretty-printing: - -GENRST_RUN_COMMAND -ruby -I./polyglot-dkvp-io polyglot-dkvp-io/example.rb data/small | mlr --opprint cat -GENRST_EOF diff --git a/docs6/doc-reorg.txt b/docs6/doc-reorg.txt deleted file mode 100644 index 0be6cd646..000000000 --- a/docs6/doc-reorg.txt +++ /dev/null @@ -1,7 +0,0 @@ - -linkify introduction.rst.in? too much too soon? - -quicklinks maybe? redundant w/ TOC? - -so i didn't want to pop out to R just to compute that 'one last thing'; hence covar/linreg/etc - diff --git a/docs6b/docs/.vimrc b/docs6/docs/.vimrc similarity index 100% rename from docs6b/docs/.vimrc rename to docs6/docs/.vimrc diff --git a/docs6/10-1.sh b/docs6/docs/10-1.sh similarity index 100% rename from docs6/10-1.sh rename to docs6/docs/10-1.sh diff --git a/docs6/10-2.sh b/docs6/docs/10-2.sh similarity index 100% rename from docs6/10-2.sh rename to docs6/docs/10-2.sh diff --git a/docs6b/docs/10min.md b/docs6/docs/10min.md similarity index 100% rename from docs6b/docs/10min.md rename to docs6/docs/10min.md diff --git a/docs6b/docs/10min.md.in b/docs6/docs/10min.md.in similarity index 100% rename from docs6b/docs/10min.md.in rename to docs6/docs/10min.md.in diff --git a/docs6b/docs/Makefile b/docs6/docs/Makefile similarity index 100% rename from docs6b/docs/Makefile rename to docs6/docs/Makefile diff --git a/docs6b/docs/_build/doctrees/10min.doctree b/docs6/docs/_build/doctrees/10min.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/10min.doctree rename to docs6/docs/_build/doctrees/10min.doctree diff --git a/docs6b/docs/_build/doctrees/build.doctree b/docs6/docs/_build/doctrees/build.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/build.doctree rename to docs6/docs/_build/doctrees/build.doctree diff --git a/docs6b/docs/_build/doctrees/community.doctree b/docs6/docs/_build/doctrees/community.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/community.doctree rename to docs6/docs/_build/doctrees/community.doctree diff --git a/docs6b/docs/_build/doctrees/contact.doctree b/docs6/docs/_build/doctrees/contact.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/contact.doctree rename to docs6/docs/_build/doctrees/contact.doctree diff --git a/docs6b/docs/_build/doctrees/contributing.doctree b/docs6/docs/_build/doctrees/contributing.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/contributing.doctree rename to docs6/docs/_build/doctrees/contributing.doctree diff --git a/docs6b/docs/_build/doctrees/cookbook.doctree b/docs6/docs/_build/doctrees/cookbook.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/cookbook.doctree rename to docs6/docs/_build/doctrees/cookbook.doctree diff --git a/docs6b/docs/_build/doctrees/cookbook2.doctree b/docs6/docs/_build/doctrees/cookbook2.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/cookbook2.doctree rename to docs6/docs/_build/doctrees/cookbook2.doctree diff --git a/docs6b/docs/_build/doctrees/cookbook3.doctree b/docs6/docs/_build/doctrees/cookbook3.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/cookbook3.doctree rename to docs6/docs/_build/doctrees/cookbook3.doctree diff --git a/docs6b/docs/_build/doctrees/cookbook4.doctree b/docs6/docs/_build/doctrees/cookbook4.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/cookbook4.doctree rename to docs6/docs/_build/doctrees/cookbook4.doctree diff --git a/docs6b/docs/_build/doctrees/csv-with-and-without-headers.doctree b/docs6/docs/_build/doctrees/csv-with-and-without-headers.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/csv-with-and-without-headers.doctree rename to docs6/docs/_build/doctrees/csv-with-and-without-headers.doctree diff --git a/docs6b/docs/_build/doctrees/customization.doctree b/docs6/docs/_build/doctrees/customization.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/customization.doctree rename to docs6/docs/_build/doctrees/customization.doctree diff --git a/docs6b/docs/_build/doctrees/data-cleaning-examples.doctree b/docs6/docs/_build/doctrees/data-cleaning-examples.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/data-cleaning-examples.doctree rename to docs6/docs/_build/doctrees/data-cleaning-examples.doctree diff --git a/docs6b/docs/_build/doctrees/data-diving-examples.doctree b/docs6/docs/_build/doctrees/data-diving-examples.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/data-diving-examples.doctree rename to docs6/docs/_build/doctrees/data-diving-examples.doctree diff --git a/docs6b/docs/_build/doctrees/data-examples.doctree b/docs6/docs/_build/doctrees/data-examples.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/data-examples.doctree rename to docs6/docs/_build/doctrees/data-examples.doctree diff --git a/docs6b/docs/_build/doctrees/data-sharing.doctree b/docs6/docs/_build/doctrees/data-sharing.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/data-sharing.doctree rename to docs6/docs/_build/doctrees/data-sharing.doctree diff --git a/docs6b/docs/_build/doctrees/dates-and-times.doctree b/docs6/docs/_build/doctrees/dates-and-times.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/dates-and-times.doctree rename to docs6/docs/_build/doctrees/dates-and-times.doctree diff --git a/docs6b/docs/_build/doctrees/dkvp-examples.doctree b/docs6/docs/_build/doctrees/dkvp-examples.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/dkvp-examples.doctree rename to docs6/docs/_build/doctrees/dkvp-examples.doctree diff --git a/docs6b/docs/_build/doctrees/environment.pickle b/docs6/docs/_build/doctrees/environment.pickle similarity index 100% rename from docs6b/docs/_build/doctrees/environment.pickle rename to docs6/docs/_build/doctrees/environment.pickle diff --git a/docs6b/docs/_build/doctrees/etymology.doctree b/docs6/docs/_build/doctrees/etymology.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/etymology.doctree rename to docs6/docs/_build/doctrees/etymology.doctree diff --git a/docs6b/docs/_build/doctrees/ex-fields-not-selected.doctree b/docs6/docs/_build/doctrees/ex-fields-not-selected.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/ex-fields-not-selected.doctree rename to docs6/docs/_build/doctrees/ex-fields-not-selected.doctree diff --git a/docs6b/docs/_build/doctrees/ex-no-output-at-all.doctree b/docs6/docs/_build/doctrees/ex-no-output-at-all.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/ex-no-output-at-all.doctree rename to docs6/docs/_build/doctrees/ex-no-output-at-all.doctree diff --git a/docs6b/docs/_build/doctrees/faq.doctree b/docs6/docs/_build/doctrees/faq.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/faq.doctree rename to docs6/docs/_build/doctrees/faq.doctree diff --git a/docs6b/docs/_build/doctrees/feature-comparison.doctree b/docs6/docs/_build/doctrees/feature-comparison.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/feature-comparison.doctree rename to docs6/docs/_build/doctrees/feature-comparison.doctree diff --git a/docs6b/docs/_build/doctrees/features.doctree b/docs6/docs/_build/doctrees/features.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/features.doctree rename to docs6/docs/_build/doctrees/features.doctree diff --git a/docs6b/docs/_build/doctrees/file-formats.doctree b/docs6/docs/_build/doctrees/file-formats.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/file-formats.doctree rename to docs6/docs/_build/doctrees/file-formats.doctree diff --git a/docs6b/docs/_build/doctrees/foo.doctree b/docs6/docs/_build/doctrees/foo.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/foo.doctree rename to docs6/docs/_build/doctrees/foo.doctree diff --git a/docs6b/docs/_build/doctrees/getting-started.doctree b/docs6/docs/_build/doctrees/getting-started.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/getting-started.doctree rename to docs6/docs/_build/doctrees/getting-started.doctree diff --git a/docs6b/docs/_build/doctrees/index.doctree b/docs6/docs/_build/doctrees/index.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/index.doctree rename to docs6/docs/_build/doctrees/index.doctree diff --git a/docs6b/docs/_build/doctrees/install.doctree b/docs6/docs/_build/doctrees/install.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/install.doctree rename to docs6/docs/_build/doctrees/install.doctree diff --git a/docs6b/docs/_build/doctrees/installation.doctree b/docs6/docs/_build/doctrees/installation.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/installation.doctree rename to docs6/docs/_build/doctrees/installation.doctree diff --git a/docs6b/docs/_build/doctrees/internationalization.doctree b/docs6/docs/_build/doctrees/internationalization.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/internationalization.doctree rename to docs6/docs/_build/doctrees/internationalization.doctree diff --git a/docs6b/docs/_build/doctrees/introduction.doctree b/docs6/docs/_build/doctrees/introduction.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/introduction.doctree rename to docs6/docs/_build/doctrees/introduction.doctree diff --git a/docs6b/docs/_build/doctrees/joins.doctree b/docs6/docs/_build/doctrees/joins.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/joins.doctree rename to docs6/docs/_build/doctrees/joins.doctree diff --git a/docs6b/docs/_build/doctrees/keystroke-savers.doctree b/docs6/docs/_build/doctrees/keystroke-savers.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/keystroke-savers.doctree rename to docs6/docs/_build/doctrees/keystroke-savers.doctree diff --git a/docs6b/docs/_build/doctrees/log-processing-examples.doctree b/docs6/docs/_build/doctrees/log-processing-examples.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/log-processing-examples.doctree rename to docs6/docs/_build/doctrees/log-processing-examples.doctree diff --git a/docs6b/docs/_build/doctrees/manpage.doctree b/docs6/docs/_build/doctrees/manpage.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/manpage.doctree rename to docs6/docs/_build/doctrees/manpage.doctree diff --git a/docs6b/docs/_build/doctrees/miller-by-example.doctree b/docs6/docs/_build/doctrees/miller-by-example.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/miller-by-example.doctree rename to docs6/docs/_build/doctrees/miller-by-example.doctree diff --git a/docs6b/docs/_build/doctrees/miller-on-windows.doctree b/docs6/docs/_build/doctrees/miller-on-windows.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/miller-on-windows.doctree rename to docs6/docs/_build/doctrees/miller-on-windows.doctree diff --git a/docs6b/docs/_build/doctrees/misc-examples.doctree b/docs6/docs/_build/doctrees/misc-examples.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/misc-examples.doctree rename to docs6/docs/_build/doctrees/misc-examples.doctree diff --git a/docs6b/docs/_build/doctrees/new-in-miller-6.doctree b/docs6/docs/_build/doctrees/new-in-miller-6.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/new-in-miller-6.doctree rename to docs6/docs/_build/doctrees/new-in-miller-6.doctree diff --git a/docs6b/docs/_build/doctrees/old-10min.doctree b/docs6/docs/_build/doctrees/old-10min.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/old-10min.doctree rename to docs6/docs/_build/doctrees/old-10min.doctree diff --git a/docs6b/docs/_build/doctrees/operating-on-all-fields.doctree b/docs6/docs/_build/doctrees/operating-on-all-fields.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/operating-on-all-fields.doctree rename to docs6/docs/_build/doctrees/operating-on-all-fields.doctree diff --git a/docs6b/docs/_build/doctrees/originality.doctree b/docs6/docs/_build/doctrees/originality.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/originality.doctree rename to docs6/docs/_build/doctrees/originality.doctree diff --git a/docs6b/docs/_build/doctrees/output-colorization.doctree b/docs6/docs/_build/doctrees/output-colorization.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/output-colorization.doctree rename to docs6/docs/_build/doctrees/output-colorization.doctree diff --git a/docs6b/docs/_build/doctrees/performance.doctree b/docs6/docs/_build/doctrees/performance.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/performance.doctree rename to docs6/docs/_build/doctrees/performance.doctree diff --git a/docs6b/docs/_build/doctrees/programming-examples.doctree b/docs6/docs/_build/doctrees/programming-examples.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/programming-examples.doctree rename to docs6/docs/_build/doctrees/programming-examples.doctree diff --git a/docs6b/docs/_build/doctrees/programming-language.doctree b/docs6/docs/_build/doctrees/programming-language.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/programming-language.doctree rename to docs6/docs/_build/doctrees/programming-language.doctree diff --git a/docs6b/docs/_build/doctrees/quick-examples.doctree b/docs6/docs/_build/doctrees/quick-examples.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/quick-examples.doctree rename to docs6/docs/_build/doctrees/quick-examples.doctree diff --git a/docs6b/docs/_build/doctrees/randomizing-examples.doctree b/docs6/docs/_build/doctrees/randomizing-examples.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/randomizing-examples.doctree rename to docs6/docs/_build/doctrees/randomizing-examples.doctree diff --git a/docs6b/docs/_build/doctrees/record-heterogeneity.doctree b/docs6/docs/_build/doctrees/record-heterogeneity.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/record-heterogeneity.doctree rename to docs6/docs/_build/doctrees/record-heterogeneity.doctree diff --git a/docs6b/docs/_build/doctrees/reference-dsl-arrays.doctree b/docs6/docs/_build/doctrees/reference-dsl-arrays.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/reference-dsl-arrays.doctree rename to docs6/docs/_build/doctrees/reference-dsl-arrays.doctree diff --git a/docs6b/docs/_build/doctrees/reference-dsl-builtin-functions.doctree b/docs6/docs/_build/doctrees/reference-dsl-builtin-functions.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/reference-dsl-builtin-functions.doctree rename to docs6/docs/_build/doctrees/reference-dsl-builtin-functions.doctree diff --git a/docs6b/docs/_build/doctrees/reference-dsl-complexity.doctree b/docs6/docs/_build/doctrees/reference-dsl-complexity.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/reference-dsl-complexity.doctree rename to docs6/docs/_build/doctrees/reference-dsl-complexity.doctree diff --git a/docs6b/docs/_build/doctrees/reference-dsl-complexlity.doctree b/docs6/docs/_build/doctrees/reference-dsl-complexlity.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/reference-dsl-complexlity.doctree rename to docs6/docs/_build/doctrees/reference-dsl-complexlity.doctree diff --git a/docs6b/docs/_build/doctrees/reference-dsl-control-structures.doctree b/docs6/docs/_build/doctrees/reference-dsl-control-structures.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/reference-dsl-control-structures.doctree rename to docs6/docs/_build/doctrees/reference-dsl-control-structures.doctree diff --git a/docs6b/docs/_build/doctrees/reference-dsl-errors.doctree b/docs6/docs/_build/doctrees/reference-dsl-errors.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/reference-dsl-errors.doctree rename to docs6/docs/_build/doctrees/reference-dsl-errors.doctree diff --git a/docs6b/docs/_build/doctrees/reference-dsl-filter-statements.doctree b/docs6/docs/_build/doctrees/reference-dsl-filter-statements.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/reference-dsl-filter-statements.doctree rename to docs6/docs/_build/doctrees/reference-dsl-filter-statements.doctree diff --git a/docs6b/docs/_build/doctrees/reference-dsl-operators.doctree b/docs6/docs/_build/doctrees/reference-dsl-operators.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/reference-dsl-operators.doctree rename to docs6/docs/_build/doctrees/reference-dsl-operators.doctree diff --git a/docs6b/docs/_build/doctrees/reference-dsl-output-statements.doctree b/docs6/docs/_build/doctrees/reference-dsl-output-statements.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/reference-dsl-output-statements.doctree rename to docs6/docs/_build/doctrees/reference-dsl-output-statements.doctree diff --git a/docs6b/docs/_build/doctrees/reference-dsl-overview.doctree b/docs6/docs/_build/doctrees/reference-dsl-overview.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/reference-dsl-overview.doctree rename to docs6/docs/_build/doctrees/reference-dsl-overview.doctree diff --git a/docs6b/docs/_build/doctrees/reference-dsl-syntax.doctree b/docs6/docs/_build/doctrees/reference-dsl-syntax.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/reference-dsl-syntax.doctree rename to docs6/docs/_build/doctrees/reference-dsl-syntax.doctree diff --git a/docs6b/docs/_build/doctrees/reference-dsl-tbf.doctree b/docs6/docs/_build/doctrees/reference-dsl-tbf.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/reference-dsl-tbf.doctree rename to docs6/docs/_build/doctrees/reference-dsl-tbf.doctree diff --git a/docs6b/docs/_build/doctrees/reference-dsl-unset-statements.doctree b/docs6/docs/_build/doctrees/reference-dsl-unset-statements.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/reference-dsl-unset-statements.doctree rename to docs6/docs/_build/doctrees/reference-dsl-unset-statements.doctree diff --git a/docs6b/docs/_build/doctrees/reference-dsl-user-defined-functions.doctree b/docs6/docs/_build/doctrees/reference-dsl-user-defined-functions.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/reference-dsl-user-defined-functions.doctree rename to docs6/docs/_build/doctrees/reference-dsl-user-defined-functions.doctree diff --git a/docs6b/docs/_build/doctrees/reference-dsl-variables.doctree b/docs6/docs/_build/doctrees/reference-dsl-variables.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/reference-dsl-variables.doctree rename to docs6/docs/_build/doctrees/reference-dsl-variables.doctree diff --git a/docs6b/docs/_build/doctrees/reference-dsl.doctree b/docs6/docs/_build/doctrees/reference-dsl.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/reference-dsl.doctree rename to docs6/docs/_build/doctrees/reference-dsl.doctree diff --git a/docs6b/docs/_build/doctrees/reference-main-arithmetic.doctree b/docs6/docs/_build/doctrees/reference-main-arithmetic.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/reference-main-arithmetic.doctree rename to docs6/docs/_build/doctrees/reference-main-arithmetic.doctree diff --git a/docs6b/docs/_build/doctrees/reference-main-auxiliary-commands.doctree b/docs6/docs/_build/doctrees/reference-main-auxiliary-commands.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/reference-main-auxiliary-commands.doctree rename to docs6/docs/_build/doctrees/reference-main-auxiliary-commands.doctree diff --git a/docs6b/docs/_build/doctrees/reference-main-data-types.doctree b/docs6/docs/_build/doctrees/reference-main-data-types.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/reference-main-data-types.doctree rename to docs6/docs/_build/doctrees/reference-main-data-types.doctree diff --git a/docs6b/docs/_build/doctrees/reference-main-env-vars.doctree b/docs6/docs/_build/doctrees/reference-main-env-vars.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/reference-main-env-vars.doctree rename to docs6/docs/_build/doctrees/reference-main-env-vars.doctree diff --git a/docs6b/docs/_build/doctrees/reference-main-io-options.doctree b/docs6/docs/_build/doctrees/reference-main-io-options.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/reference-main-io-options.doctree rename to docs6/docs/_build/doctrees/reference-main-io-options.doctree diff --git a/docs6b/docs/_build/doctrees/reference-main-null-data.doctree b/docs6/docs/_build/doctrees/reference-main-null-data.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/reference-main-null-data.doctree rename to docs6/docs/_build/doctrees/reference-main-null-data.doctree diff --git a/docs6b/docs/_build/doctrees/reference-main-online-help.doctree b/docs6/docs/_build/doctrees/reference-main-online-help.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/reference-main-online-help.doctree rename to docs6/docs/_build/doctrees/reference-main-online-help.doctree diff --git a/docs6b/docs/_build/doctrees/reference-main-overview.doctree b/docs6/docs/_build/doctrees/reference-main-overview.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/reference-main-overview.doctree rename to docs6/docs/_build/doctrees/reference-main-overview.doctree diff --git a/docs6b/docs/_build/doctrees/reference-main-regular-expressions.doctree b/docs6/docs/_build/doctrees/reference-main-regular-expressions.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/reference-main-regular-expressions.doctree rename to docs6/docs/_build/doctrees/reference-main-regular-expressions.doctree diff --git a/docs6b/docs/_build/doctrees/reference-main-then-chaining.doctree b/docs6/docs/_build/doctrees/reference-main-then-chaining.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/reference-main-then-chaining.doctree rename to docs6/docs/_build/doctrees/reference-main-then-chaining.doctree diff --git a/docs6b/docs/_build/doctrees/reference-verbs.doctree b/docs6/docs/_build/doctrees/reference-verbs.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/reference-verbs.doctree rename to docs6/docs/_build/doctrees/reference-verbs.doctree diff --git a/docs6b/docs/_build/doctrees/reference.doctree b/docs6/docs/_build/doctrees/reference.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/reference.doctree rename to docs6/docs/_build/doctrees/reference.doctree diff --git a/docs6b/docs/_build/doctrees/release-docs.doctree b/docs6/docs/_build/doctrees/release-docs.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/release-docs.doctree rename to docs6/docs/_build/doctrees/release-docs.doctree diff --git a/docs6b/docs/_build/doctrees/repl.doctree b/docs6/docs/_build/doctrees/repl.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/repl.doctree rename to docs6/docs/_build/doctrees/repl.doctree diff --git a/docs6b/docs/_build/doctrees/shapes-of-data.doctree b/docs6/docs/_build/doctrees/shapes-of-data.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/shapes-of-data.doctree rename to docs6/docs/_build/doctrees/shapes-of-data.doctree diff --git a/docs6b/docs/_build/doctrees/shell-commands.doctree b/docs6/docs/_build/doctrees/shell-commands.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/shell-commands.doctree rename to docs6/docs/_build/doctrees/shell-commands.doctree diff --git a/docs6b/docs/_build/doctrees/special-symbols-and-formatting.doctree b/docs6/docs/_build/doctrees/special-symbols-and-formatting.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/special-symbols-and-formatting.doctree rename to docs6/docs/_build/doctrees/special-symbols-and-formatting.doctree diff --git a/docs6b/docs/_build/doctrees/sql-examples.doctree b/docs6/docs/_build/doctrees/sql-examples.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/sql-examples.doctree rename to docs6/docs/_build/doctrees/sql-examples.doctree diff --git a/docs6b/docs/_build/doctrees/statistics-examples.doctree b/docs6/docs/_build/doctrees/statistics-examples.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/statistics-examples.doctree rename to docs6/docs/_build/doctrees/statistics-examples.doctree diff --git a/docs6b/docs/_build/doctrees/then-chaining.doctree b/docs6/docs/_build/doctrees/then-chaining.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/then-chaining.doctree rename to docs6/docs/_build/doctrees/then-chaining.doctree diff --git a/docs6b/docs/_build/doctrees/two-pass-algorithms.doctree b/docs6/docs/_build/doctrees/two-pass-algorithms.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/two-pass-algorithms.doctree rename to docs6/docs/_build/doctrees/two-pass-algorithms.doctree diff --git a/docs6b/docs/_build/doctrees/why.doctree b/docs6/docs/_build/doctrees/why.doctree similarity index 100% rename from docs6b/docs/_build/doctrees/why.doctree rename to docs6/docs/_build/doctrees/why.doctree diff --git a/docs6b/docs/_build/html/.buildinfo b/docs6/docs/_build/html/.buildinfo similarity index 100% rename from docs6b/docs/_build/html/.buildinfo rename to docs6/docs/_build/html/.buildinfo diff --git a/docs6b/docs/10-1.sh b/docs6/docs/_build/html/10-1.sh old mode 100755 new mode 100644 similarity index 100% rename from docs6b/docs/10-1.sh rename to docs6/docs/_build/html/10-1.sh diff --git a/docs6b/docs/10-2.sh b/docs6/docs/_build/html/10-2.sh old mode 100755 new mode 100644 similarity index 100% rename from docs6b/docs/10-2.sh rename to docs6/docs/_build/html/10-2.sh diff --git a/docs6b/docs/_build/html/10min.html b/docs6/docs/_build/html/10min.html similarity index 100% rename from docs6b/docs/_build/html/10min.html rename to docs6/docs/_build/html/10min.html diff --git a/docs6/pix/colorization.png b/docs6/docs/_build/html/_images/colorization.png similarity index 100% rename from docs6/pix/colorization.png rename to docs6/docs/_build/html/_images/colorization.png diff --git a/docs6/pix/colorization2.png b/docs6/docs/_build/html/_images/colorization2.png similarity index 100% rename from docs6/pix/colorization2.png rename to docs6/docs/_build/html/_images/colorization2.png diff --git a/docs6/coverart/cover-combined.png b/docs6/docs/_build/html/_images/cover-combined.png similarity index 100% rename from docs6/coverart/cover-combined.png rename to docs6/docs/_build/html/_images/cover-combined.png diff --git a/docs6/data/linreg-example.jpg b/docs6/docs/_build/html/_images/linreg-example.jpg similarity index 100% rename from docs6/data/linreg-example.jpg rename to docs6/docs/_build/html/_images/linreg-example.jpg diff --git a/docs6/pix/mand.png b/docs6/docs/_build/html/_images/mand.png similarity index 100% rename from docs6/pix/mand.png rename to docs6/docs/_build/html/_images/mand.png diff --git a/docs6/pix/miller-msys-complex.png b/docs6/docs/_build/html/_images/miller-msys-complex.png similarity index 100% rename from docs6/pix/miller-msys-complex.png rename to docs6/docs/_build/html/_images/miller-msys-complex.png diff --git a/docs6/pix/miller-msys.png b/docs6/docs/_build/html/_images/miller-msys.png similarity index 100% rename from docs6/pix/miller-msys.png rename to docs6/docs/_build/html/_images/miller-msys.png diff --git a/docs6/pix/miller-windows-complex-workaround.png b/docs6/docs/_build/html/_images/miller-windows-complex-workaround.png similarity index 100% rename from docs6/pix/miller-windows-complex-workaround.png rename to docs6/docs/_build/html/_images/miller-windows-complex-workaround.png diff --git a/docs6/pix/miller-windows-complex.png b/docs6/docs/_build/html/_images/miller-windows-complex.png similarity index 100% rename from docs6/pix/miller-windows-complex.png rename to docs6/docs/_build/html/_images/miller-windows-complex.png diff --git a/docs6/pix/miller-windows-triple-double-quote.png b/docs6/docs/_build/html/_images/miller-windows-triple-double-quote.png similarity index 100% rename from docs6/pix/miller-windows-triple-double-quote.png rename to docs6/docs/_build/html/_images/miller-windows-triple-double-quote.png diff --git a/docs6/pix/miller-windows.png b/docs6/docs/_build/html/_images/miller-windows.png similarity index 100% rename from docs6/pix/miller-windows.png rename to docs6/docs/_build/html/_images/miller-windows.png diff --git a/docs6/pix/omd.png b/docs6/docs/_build/html/_images/omd.png similarity index 100% rename from docs6/pix/omd.png rename to docs6/docs/_build/html/_images/omd.png diff --git a/docs6b/docs/_build/html/_sources/10min.rst.txt b/docs6/docs/_build/html/_sources/10min.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/10min.rst.txt rename to docs6/docs/_build/html/_sources/10min.rst.txt diff --git a/docs6b/docs/_build/html/_sources/build.rst.txt b/docs6/docs/_build/html/_sources/build.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/build.rst.txt rename to docs6/docs/_build/html/_sources/build.rst.txt diff --git a/docs6b/docs/_build/html/_sources/community.rst.txt b/docs6/docs/_build/html/_sources/community.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/community.rst.txt rename to docs6/docs/_build/html/_sources/community.rst.txt diff --git a/docs6b/docs/_build/html/_sources/contact.rst.txt b/docs6/docs/_build/html/_sources/contact.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/contact.rst.txt rename to docs6/docs/_build/html/_sources/contact.rst.txt diff --git a/docs6b/docs/_build/html/_sources/contributing.rst.txt b/docs6/docs/_build/html/_sources/contributing.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/contributing.rst.txt rename to docs6/docs/_build/html/_sources/contributing.rst.txt diff --git a/docs6b/docs/_build/html/_sources/cookbook.rst.txt b/docs6/docs/_build/html/_sources/cookbook.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/cookbook.rst.txt rename to docs6/docs/_build/html/_sources/cookbook.rst.txt diff --git a/docs6b/docs/_build/html/_sources/cookbook2.rst.txt b/docs6/docs/_build/html/_sources/cookbook2.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/cookbook2.rst.txt rename to docs6/docs/_build/html/_sources/cookbook2.rst.txt diff --git a/docs6b/docs/_build/html/_sources/cookbook3.rst.txt b/docs6/docs/_build/html/_sources/cookbook3.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/cookbook3.rst.txt rename to docs6/docs/_build/html/_sources/cookbook3.rst.txt diff --git a/docs6b/docs/_build/html/_sources/cookbook4.rst.txt b/docs6/docs/_build/html/_sources/cookbook4.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/cookbook4.rst.txt rename to docs6/docs/_build/html/_sources/cookbook4.rst.txt diff --git a/docs6b/docs/_build/html/_sources/csv-with-and-without-headers.rst.txt b/docs6/docs/_build/html/_sources/csv-with-and-without-headers.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/csv-with-and-without-headers.rst.txt rename to docs6/docs/_build/html/_sources/csv-with-and-without-headers.rst.txt diff --git a/docs6b/docs/_build/html/_sources/customization.rst.txt b/docs6/docs/_build/html/_sources/customization.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/customization.rst.txt rename to docs6/docs/_build/html/_sources/customization.rst.txt diff --git a/docs6b/docs/_build/html/_sources/data-cleaning-examples.rst.txt b/docs6/docs/_build/html/_sources/data-cleaning-examples.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/data-cleaning-examples.rst.txt rename to docs6/docs/_build/html/_sources/data-cleaning-examples.rst.txt diff --git a/docs6b/docs/_build/html/_sources/data-diving-examples.rst.txt b/docs6/docs/_build/html/_sources/data-diving-examples.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/data-diving-examples.rst.txt rename to docs6/docs/_build/html/_sources/data-diving-examples.rst.txt diff --git a/docs6b/docs/_build/html/_sources/data-examples.rst.txt b/docs6/docs/_build/html/_sources/data-examples.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/data-examples.rst.txt rename to docs6/docs/_build/html/_sources/data-examples.rst.txt diff --git a/docs6b/docs/_build/html/_sources/data-sharing.rst.txt b/docs6/docs/_build/html/_sources/data-sharing.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/data-sharing.rst.txt rename to docs6/docs/_build/html/_sources/data-sharing.rst.txt diff --git a/docs6b/docs/_build/html/_sources/dates-and-times.rst.txt b/docs6/docs/_build/html/_sources/dates-and-times.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/dates-and-times.rst.txt rename to docs6/docs/_build/html/_sources/dates-and-times.rst.txt diff --git a/docs6b/docs/_build/html/_sources/dkvp-examples.rst.txt b/docs6/docs/_build/html/_sources/dkvp-examples.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/dkvp-examples.rst.txt rename to docs6/docs/_build/html/_sources/dkvp-examples.rst.txt diff --git a/docs6b/docs/_build/html/_sources/etymology.rst.txt b/docs6/docs/_build/html/_sources/etymology.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/etymology.rst.txt rename to docs6/docs/_build/html/_sources/etymology.rst.txt diff --git a/docs6b/docs/_build/html/_sources/ex-fields-not-selected.rst.txt b/docs6/docs/_build/html/_sources/ex-fields-not-selected.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/ex-fields-not-selected.rst.txt rename to docs6/docs/_build/html/_sources/ex-fields-not-selected.rst.txt diff --git a/docs6b/docs/_build/html/_sources/ex-no-output-at-all.rst.txt b/docs6/docs/_build/html/_sources/ex-no-output-at-all.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/ex-no-output-at-all.rst.txt rename to docs6/docs/_build/html/_sources/ex-no-output-at-all.rst.txt diff --git a/docs6b/docs/_build/html/_sources/faq.rst.txt b/docs6/docs/_build/html/_sources/faq.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/faq.rst.txt rename to docs6/docs/_build/html/_sources/faq.rst.txt diff --git a/docs6b/docs/_build/html/_sources/feature-comparison.rst.txt b/docs6/docs/_build/html/_sources/feature-comparison.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/feature-comparison.rst.txt rename to docs6/docs/_build/html/_sources/feature-comparison.rst.txt diff --git a/docs6b/docs/_build/html/_sources/features.rst.txt b/docs6/docs/_build/html/_sources/features.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/features.rst.txt rename to docs6/docs/_build/html/_sources/features.rst.txt diff --git a/docs6b/docs/_build/html/_sources/file-formats.rst.txt b/docs6/docs/_build/html/_sources/file-formats.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/file-formats.rst.txt rename to docs6/docs/_build/html/_sources/file-formats.rst.txt diff --git a/docs6b/docs/_build/html/_sources/foo.rst.txt b/docs6/docs/_build/html/_sources/foo.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/foo.rst.txt rename to docs6/docs/_build/html/_sources/foo.rst.txt diff --git a/docs6b/docs/_build/html/_sources/getting-started.rst.txt b/docs6/docs/_build/html/_sources/getting-started.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/getting-started.rst.txt rename to docs6/docs/_build/html/_sources/getting-started.rst.txt diff --git a/docs6b/docs/_build/html/_sources/index.rst.txt b/docs6/docs/_build/html/_sources/index.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/index.rst.txt rename to docs6/docs/_build/html/_sources/index.rst.txt diff --git a/docs6b/docs/_build/html/_sources/install.rst.txt b/docs6/docs/_build/html/_sources/install.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/install.rst.txt rename to docs6/docs/_build/html/_sources/install.rst.txt diff --git a/docs6b/docs/_build/html/_sources/installation.rst.txt b/docs6/docs/_build/html/_sources/installation.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/installation.rst.txt rename to docs6/docs/_build/html/_sources/installation.rst.txt diff --git a/docs6b/docs/_build/html/_sources/internationalization.rst.txt b/docs6/docs/_build/html/_sources/internationalization.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/internationalization.rst.txt rename to docs6/docs/_build/html/_sources/internationalization.rst.txt diff --git a/docs6b/docs/_build/html/_sources/introduction.rst.txt b/docs6/docs/_build/html/_sources/introduction.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/introduction.rst.txt rename to docs6/docs/_build/html/_sources/introduction.rst.txt diff --git a/docs6b/docs/_build/html/_sources/joins.rst.txt b/docs6/docs/_build/html/_sources/joins.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/joins.rst.txt rename to docs6/docs/_build/html/_sources/joins.rst.txt diff --git a/docs6b/docs/_build/html/_sources/keystroke-savers.rst.txt b/docs6/docs/_build/html/_sources/keystroke-savers.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/keystroke-savers.rst.txt rename to docs6/docs/_build/html/_sources/keystroke-savers.rst.txt diff --git a/docs6b/docs/_build/html/_sources/log-processing-examples.rst.txt b/docs6/docs/_build/html/_sources/log-processing-examples.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/log-processing-examples.rst.txt rename to docs6/docs/_build/html/_sources/log-processing-examples.rst.txt diff --git a/docs6b/docs/_build/html/_sources/manpage.rst.txt b/docs6/docs/_build/html/_sources/manpage.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/manpage.rst.txt rename to docs6/docs/_build/html/_sources/manpage.rst.txt diff --git a/docs6b/docs/_build/html/_sources/miller-by-example.rst.txt b/docs6/docs/_build/html/_sources/miller-by-example.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/miller-by-example.rst.txt rename to docs6/docs/_build/html/_sources/miller-by-example.rst.txt diff --git a/docs6b/docs/_build/html/_sources/miller-on-windows.rst.txt b/docs6/docs/_build/html/_sources/miller-on-windows.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/miller-on-windows.rst.txt rename to docs6/docs/_build/html/_sources/miller-on-windows.rst.txt diff --git a/docs6b/docs/_build/html/_sources/misc-examples.rst.txt b/docs6/docs/_build/html/_sources/misc-examples.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/misc-examples.rst.txt rename to docs6/docs/_build/html/_sources/misc-examples.rst.txt diff --git a/docs6b/docs/_build/html/_sources/new-in-miller-6.rst.txt b/docs6/docs/_build/html/_sources/new-in-miller-6.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/new-in-miller-6.rst.txt rename to docs6/docs/_build/html/_sources/new-in-miller-6.rst.txt diff --git a/docs6b/docs/_build/html/_sources/old-10min.rst.txt b/docs6/docs/_build/html/_sources/old-10min.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/old-10min.rst.txt rename to docs6/docs/_build/html/_sources/old-10min.rst.txt diff --git a/docs6b/docs/_build/html/_sources/operating-on-all-fields.rst.txt b/docs6/docs/_build/html/_sources/operating-on-all-fields.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/operating-on-all-fields.rst.txt rename to docs6/docs/_build/html/_sources/operating-on-all-fields.rst.txt diff --git a/docs6b/docs/_build/html/_sources/originality.rst.txt b/docs6/docs/_build/html/_sources/originality.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/originality.rst.txt rename to docs6/docs/_build/html/_sources/originality.rst.txt diff --git a/docs6b/docs/_build/html/_sources/output-colorization.rst.txt b/docs6/docs/_build/html/_sources/output-colorization.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/output-colorization.rst.txt rename to docs6/docs/_build/html/_sources/output-colorization.rst.txt diff --git a/docs6b/docs/_build/html/_sources/performance.rst.txt b/docs6/docs/_build/html/_sources/performance.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/performance.rst.txt rename to docs6/docs/_build/html/_sources/performance.rst.txt diff --git a/docs6b/docs/_build/html/_sources/programming-examples.rst.txt b/docs6/docs/_build/html/_sources/programming-examples.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/programming-examples.rst.txt rename to docs6/docs/_build/html/_sources/programming-examples.rst.txt diff --git a/docs6b/docs/_build/html/_sources/programming-language.rst.txt b/docs6/docs/_build/html/_sources/programming-language.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/programming-language.rst.txt rename to docs6/docs/_build/html/_sources/programming-language.rst.txt diff --git a/docs6b/docs/_build/html/_sources/quick-examples.rst.txt b/docs6/docs/_build/html/_sources/quick-examples.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/quick-examples.rst.txt rename to docs6/docs/_build/html/_sources/quick-examples.rst.txt diff --git a/docs6b/docs/_build/html/_sources/randomizing-examples.rst.txt b/docs6/docs/_build/html/_sources/randomizing-examples.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/randomizing-examples.rst.txt rename to docs6/docs/_build/html/_sources/randomizing-examples.rst.txt diff --git a/docs6b/docs/_build/html/_sources/record-heterogeneity.rst.txt b/docs6/docs/_build/html/_sources/record-heterogeneity.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/record-heterogeneity.rst.txt rename to docs6/docs/_build/html/_sources/record-heterogeneity.rst.txt diff --git a/docs6b/docs/_build/html/_sources/reference-dsl-arrays.rst.txt b/docs6/docs/_build/html/_sources/reference-dsl-arrays.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/reference-dsl-arrays.rst.txt rename to docs6/docs/_build/html/_sources/reference-dsl-arrays.rst.txt diff --git a/docs6b/docs/_build/html/_sources/reference-dsl-builtin-functions.rst.txt b/docs6/docs/_build/html/_sources/reference-dsl-builtin-functions.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/reference-dsl-builtin-functions.rst.txt rename to docs6/docs/_build/html/_sources/reference-dsl-builtin-functions.rst.txt diff --git a/docs6b/docs/_build/html/_sources/reference-dsl-complexity.rst.txt b/docs6/docs/_build/html/_sources/reference-dsl-complexity.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/reference-dsl-complexity.rst.txt rename to docs6/docs/_build/html/_sources/reference-dsl-complexity.rst.txt diff --git a/docs6b/docs/_build/html/_sources/reference-dsl-complexlity.rst.txt b/docs6/docs/_build/html/_sources/reference-dsl-complexlity.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/reference-dsl-complexlity.rst.txt rename to docs6/docs/_build/html/_sources/reference-dsl-complexlity.rst.txt diff --git a/docs6b/docs/_build/html/_sources/reference-dsl-control-structures.rst.txt b/docs6/docs/_build/html/_sources/reference-dsl-control-structures.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/reference-dsl-control-structures.rst.txt rename to docs6/docs/_build/html/_sources/reference-dsl-control-structures.rst.txt diff --git a/docs6b/docs/_build/html/_sources/reference-dsl-errors.rst.txt b/docs6/docs/_build/html/_sources/reference-dsl-errors.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/reference-dsl-errors.rst.txt rename to docs6/docs/_build/html/_sources/reference-dsl-errors.rst.txt diff --git a/docs6b/docs/_build/html/_sources/reference-dsl-filter-statements.rst.txt b/docs6/docs/_build/html/_sources/reference-dsl-filter-statements.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/reference-dsl-filter-statements.rst.txt rename to docs6/docs/_build/html/_sources/reference-dsl-filter-statements.rst.txt diff --git a/docs6b/docs/_build/html/_sources/reference-dsl-operators.rst.txt b/docs6/docs/_build/html/_sources/reference-dsl-operators.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/reference-dsl-operators.rst.txt rename to docs6/docs/_build/html/_sources/reference-dsl-operators.rst.txt diff --git a/docs6b/docs/_build/html/_sources/reference-dsl-output-statements.rst.txt b/docs6/docs/_build/html/_sources/reference-dsl-output-statements.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/reference-dsl-output-statements.rst.txt rename to docs6/docs/_build/html/_sources/reference-dsl-output-statements.rst.txt diff --git a/docs6b/docs/_build/html/_sources/reference-dsl-overview.rst.txt b/docs6/docs/_build/html/_sources/reference-dsl-overview.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/reference-dsl-overview.rst.txt rename to docs6/docs/_build/html/_sources/reference-dsl-overview.rst.txt diff --git a/docs6b/docs/_build/html/_sources/reference-dsl-syntax.rst.txt b/docs6/docs/_build/html/_sources/reference-dsl-syntax.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/reference-dsl-syntax.rst.txt rename to docs6/docs/_build/html/_sources/reference-dsl-syntax.rst.txt diff --git a/docs6b/docs/_build/html/_sources/reference-dsl-tbf.rst.txt b/docs6/docs/_build/html/_sources/reference-dsl-tbf.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/reference-dsl-tbf.rst.txt rename to docs6/docs/_build/html/_sources/reference-dsl-tbf.rst.txt diff --git a/docs6b/docs/_build/html/_sources/reference-dsl-unset-statements.rst.txt b/docs6/docs/_build/html/_sources/reference-dsl-unset-statements.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/reference-dsl-unset-statements.rst.txt rename to docs6/docs/_build/html/_sources/reference-dsl-unset-statements.rst.txt diff --git a/docs6b/docs/_build/html/_sources/reference-dsl-user-defined-functions.rst.txt b/docs6/docs/_build/html/_sources/reference-dsl-user-defined-functions.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/reference-dsl-user-defined-functions.rst.txt rename to docs6/docs/_build/html/_sources/reference-dsl-user-defined-functions.rst.txt diff --git a/docs6b/docs/_build/html/_sources/reference-dsl-variables.rst.txt b/docs6/docs/_build/html/_sources/reference-dsl-variables.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/reference-dsl-variables.rst.txt rename to docs6/docs/_build/html/_sources/reference-dsl-variables.rst.txt diff --git a/docs6b/docs/_build/html/_sources/reference-dsl.rst.txt b/docs6/docs/_build/html/_sources/reference-dsl.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/reference-dsl.rst.txt rename to docs6/docs/_build/html/_sources/reference-dsl.rst.txt diff --git a/docs6b/docs/_build/html/_sources/reference-main-arithmetic.rst.txt b/docs6/docs/_build/html/_sources/reference-main-arithmetic.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/reference-main-arithmetic.rst.txt rename to docs6/docs/_build/html/_sources/reference-main-arithmetic.rst.txt diff --git a/docs6b/docs/_build/html/_sources/reference-main-auxiliary-commands.rst.txt b/docs6/docs/_build/html/_sources/reference-main-auxiliary-commands.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/reference-main-auxiliary-commands.rst.txt rename to docs6/docs/_build/html/_sources/reference-main-auxiliary-commands.rst.txt diff --git a/docs6b/docs/_build/html/_sources/reference-main-data-types.rst.txt b/docs6/docs/_build/html/_sources/reference-main-data-types.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/reference-main-data-types.rst.txt rename to docs6/docs/_build/html/_sources/reference-main-data-types.rst.txt diff --git a/docs6b/docs/_build/html/_sources/reference-main-env-vars.rst.txt b/docs6/docs/_build/html/_sources/reference-main-env-vars.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/reference-main-env-vars.rst.txt rename to docs6/docs/_build/html/_sources/reference-main-env-vars.rst.txt diff --git a/docs6b/docs/_build/html/_sources/reference-main-io-options.rst.txt b/docs6/docs/_build/html/_sources/reference-main-io-options.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/reference-main-io-options.rst.txt rename to docs6/docs/_build/html/_sources/reference-main-io-options.rst.txt diff --git a/docs6b/docs/_build/html/_sources/reference-main-null-data.rst.txt b/docs6/docs/_build/html/_sources/reference-main-null-data.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/reference-main-null-data.rst.txt rename to docs6/docs/_build/html/_sources/reference-main-null-data.rst.txt diff --git a/docs6b/docs/_build/html/_sources/reference-main-online-help.rst.txt b/docs6/docs/_build/html/_sources/reference-main-online-help.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/reference-main-online-help.rst.txt rename to docs6/docs/_build/html/_sources/reference-main-online-help.rst.txt diff --git a/docs6b/docs/_build/html/_sources/reference-main-overview.rst.txt b/docs6/docs/_build/html/_sources/reference-main-overview.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/reference-main-overview.rst.txt rename to docs6/docs/_build/html/_sources/reference-main-overview.rst.txt diff --git a/docs6b/docs/_build/html/_sources/reference-main-regular-expressions.rst.txt b/docs6/docs/_build/html/_sources/reference-main-regular-expressions.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/reference-main-regular-expressions.rst.txt rename to docs6/docs/_build/html/_sources/reference-main-regular-expressions.rst.txt diff --git a/docs6b/docs/_build/html/_sources/reference-main-then-chaining.rst.txt b/docs6/docs/_build/html/_sources/reference-main-then-chaining.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/reference-main-then-chaining.rst.txt rename to docs6/docs/_build/html/_sources/reference-main-then-chaining.rst.txt diff --git a/docs6b/docs/_build/html/_sources/reference-verbs.rst.txt b/docs6/docs/_build/html/_sources/reference-verbs.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/reference-verbs.rst.txt rename to docs6/docs/_build/html/_sources/reference-verbs.rst.txt diff --git a/docs6b/docs/_build/html/_sources/reference.rst.txt b/docs6/docs/_build/html/_sources/reference.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/reference.rst.txt rename to docs6/docs/_build/html/_sources/reference.rst.txt diff --git a/docs6b/docs/_build/html/_sources/release-docs.rst.txt b/docs6/docs/_build/html/_sources/release-docs.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/release-docs.rst.txt rename to docs6/docs/_build/html/_sources/release-docs.rst.txt diff --git a/docs6b/docs/_build/html/_sources/repl.rst.txt b/docs6/docs/_build/html/_sources/repl.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/repl.rst.txt rename to docs6/docs/_build/html/_sources/repl.rst.txt diff --git a/docs6b/docs/_build/html/_sources/shapes-of-data.rst.txt b/docs6/docs/_build/html/_sources/shapes-of-data.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/shapes-of-data.rst.txt rename to docs6/docs/_build/html/_sources/shapes-of-data.rst.txt diff --git a/docs6b/docs/_build/html/_sources/shell-commands.rst.txt b/docs6/docs/_build/html/_sources/shell-commands.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/shell-commands.rst.txt rename to docs6/docs/_build/html/_sources/shell-commands.rst.txt diff --git a/docs6b/docs/_build/html/_sources/special-symbols-and-formatting.rst.txt b/docs6/docs/_build/html/_sources/special-symbols-and-formatting.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/special-symbols-and-formatting.rst.txt rename to docs6/docs/_build/html/_sources/special-symbols-and-formatting.rst.txt diff --git a/docs6b/docs/_build/html/_sources/sql-examples.rst.txt b/docs6/docs/_build/html/_sources/sql-examples.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/sql-examples.rst.txt rename to docs6/docs/_build/html/_sources/sql-examples.rst.txt diff --git a/docs6b/docs/_build/html/_sources/statistics-examples.rst.txt b/docs6/docs/_build/html/_sources/statistics-examples.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/statistics-examples.rst.txt rename to docs6/docs/_build/html/_sources/statistics-examples.rst.txt diff --git a/docs6b/docs/_build/html/_sources/then-chaining.rst.txt b/docs6/docs/_build/html/_sources/then-chaining.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/then-chaining.rst.txt rename to docs6/docs/_build/html/_sources/then-chaining.rst.txt diff --git a/docs6b/docs/_build/html/_sources/two-pass-algorithms.rst.txt b/docs6/docs/_build/html/_sources/two-pass-algorithms.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/two-pass-algorithms.rst.txt rename to docs6/docs/_build/html/_sources/two-pass-algorithms.rst.txt diff --git a/docs6b/docs/_build/html/_sources/why.rst.txt b/docs6/docs/_build/html/_sources/why.rst.txt similarity index 100% rename from docs6b/docs/_build/html/_sources/why.rst.txt rename to docs6/docs/_build/html/_sources/why.rst.txt diff --git a/docs6/_static/basic.css b/docs6/docs/_build/html/_static/basic.css similarity index 100% rename from docs6/_static/basic.css rename to docs6/docs/_build/html/_static/basic.css diff --git a/docs6/_static/classic.css b/docs6/docs/_build/html/_static/classic.css similarity index 100% rename from docs6/_static/classic.css rename to docs6/docs/_build/html/_static/classic.css diff --git a/docs6b/docs/_build/html/_static/darkmetal.png b/docs6/docs/_build/html/_static/darkmetal.png similarity index 100% rename from docs6b/docs/_build/html/_static/darkmetal.png rename to docs6/docs/_build/html/_static/darkmetal.png diff --git a/docs6b/docs/_build/html/_static/doctools.js b/docs6/docs/_build/html/_static/doctools.js similarity index 100% rename from docs6b/docs/_build/html/_static/doctools.js rename to docs6/docs/_build/html/_static/doctools.js diff --git a/docs6b/docs/_build/html/_static/documentation_options.js b/docs6/docs/_build/html/_static/documentation_options.js similarity index 100% rename from docs6b/docs/_build/html/_static/documentation_options.js rename to docs6/docs/_build/html/_static/documentation_options.js diff --git a/docs6b/docs/_build/html/_static/file.png b/docs6/docs/_build/html/_static/file.png similarity index 100% rename from docs6b/docs/_build/html/_static/file.png rename to docs6/docs/_build/html/_static/file.png diff --git a/docs6b/docs/_build/html/_static/headerbg.png b/docs6/docs/_build/html/_static/headerbg.png similarity index 100% rename from docs6b/docs/_build/html/_static/headerbg.png rename to docs6/docs/_build/html/_static/headerbg.png diff --git a/docs6b/docs/_build/html/_static/jquery-3.5.1.js b/docs6/docs/_build/html/_static/jquery-3.5.1.js similarity index 100% rename from docs6b/docs/_build/html/_static/jquery-3.5.1.js rename to docs6/docs/_build/html/_static/jquery-3.5.1.js diff --git a/docs6b/docs/_build/html/_static/jquery.js b/docs6/docs/_build/html/_static/jquery.js similarity index 100% rename from docs6b/docs/_build/html/_static/jquery.js rename to docs6/docs/_build/html/_static/jquery.js diff --git a/docs6b/docs/_build/html/_static/language_data.js b/docs6/docs/_build/html/_static/language_data.js similarity index 100% rename from docs6b/docs/_build/html/_static/language_data.js rename to docs6/docs/_build/html/_static/language_data.js diff --git a/docs6b/docs/_build/html/_static/logo.png b/docs6/docs/_build/html/_static/logo.png similarity index 100% rename from docs6b/docs/_build/html/_static/logo.png rename to docs6/docs/_build/html/_static/logo.png diff --git a/docs6b/docs/_build/html/_static/metal.png b/docs6/docs/_build/html/_static/metal.png similarity index 100% rename from docs6b/docs/_build/html/_static/metal.png rename to docs6/docs/_build/html/_static/metal.png diff --git a/docs6b/docs/_build/html/_static/minus.png b/docs6/docs/_build/html/_static/minus.png similarity index 100% rename from docs6b/docs/_build/html/_static/minus.png rename to docs6/docs/_build/html/_static/minus.png diff --git a/docs6/_static/mlr.jpg b/docs6/docs/_build/html/_static/mlr.jpg similarity index 100% rename from docs6/_static/mlr.jpg rename to docs6/docs/_build/html/_static/mlr.jpg diff --git a/docs6b/docs/_build/html/_static/navigation.png b/docs6/docs/_build/html/_static/navigation.png similarity index 100% rename from docs6b/docs/_build/html/_static/navigation.png rename to docs6/docs/_build/html/_static/navigation.png diff --git a/docs6b/docs/_build/html/_static/plus.png b/docs6/docs/_build/html/_static/plus.png similarity index 100% rename from docs6b/docs/_build/html/_static/plus.png rename to docs6/docs/_build/html/_static/plus.png diff --git a/docs6b/docs/_build/html/_static/print.css b/docs6/docs/_build/html/_static/print.css similarity index 100% rename from docs6b/docs/_build/html/_static/print.css rename to docs6/docs/_build/html/_static/print.css diff --git a/docs6/_static/pygments.css b/docs6/docs/_build/html/_static/pygments.css similarity index 100% rename from docs6/_static/pygments.css rename to docs6/docs/_build/html/_static/pygments.css diff --git a/docs6/_static/scrolls.css b/docs6/docs/_build/html/_static/scrolls.css similarity index 100% rename from docs6/_static/scrolls.css rename to docs6/docs/_build/html/_static/scrolls.css diff --git a/docs6b/docs/_build/html/_static/searchtools.js b/docs6/docs/_build/html/_static/searchtools.js similarity index 100% rename from docs6b/docs/_build/html/_static/searchtools.js rename to docs6/docs/_build/html/_static/searchtools.js diff --git a/docs6b/docs/_build/html/_static/sidebar.js b/docs6/docs/_build/html/_static/sidebar.js similarity index 100% rename from docs6b/docs/_build/html/_static/sidebar.js rename to docs6/docs/_build/html/_static/sidebar.js diff --git a/docs6b/docs/_build/html/_static/theme_extras.js b/docs6/docs/_build/html/_static/theme_extras.js similarity index 100% rename from docs6b/docs/_build/html/_static/theme_extras.js rename to docs6/docs/_build/html/_static/theme_extras.js diff --git a/docs6/_static/top.png b/docs6/docs/_build/html/_static/top.png similarity index 100% rename from docs6/_static/top.png rename to docs6/docs/_build/html/_static/top.png diff --git a/docs6b/docs/_build/html/_static/underscore-1.3.1.js b/docs6/docs/_build/html/_static/underscore-1.3.1.js similarity index 100% rename from docs6b/docs/_build/html/_static/underscore-1.3.1.js rename to docs6/docs/_build/html/_static/underscore-1.3.1.js diff --git a/docs6b/docs/_build/html/_static/underscore.js b/docs6/docs/_build/html/_static/underscore.js similarity index 100% rename from docs6b/docs/_build/html/_static/underscore.js rename to docs6/docs/_build/html/_static/underscore.js diff --git a/docs6b/docs/_build/html/_static/watermark.png b/docs6/docs/_build/html/_static/watermark.png similarity index 100% rename from docs6b/docs/_build/html/_static/watermark.png rename to docs6/docs/_build/html/_static/watermark.png diff --git a/docs6b/docs/_build/html/_static/watermark_blur.png b/docs6/docs/_build/html/_static/watermark_blur.png similarity index 100% rename from docs6b/docs/_build/html/_static/watermark_blur.png rename to docs6/docs/_build/html/_static/watermark_blur.png diff --git a/docs6b/docs/_build/html/build.html b/docs6/docs/_build/html/build.html similarity index 100% rename from docs6b/docs/_build/html/build.html rename to docs6/docs/_build/html/build.html diff --git a/docs6/circle.csv b/docs6/docs/_build/html/circle.csv similarity index 100% rename from docs6/circle.csv rename to docs6/docs/_build/html/circle.csv diff --git a/docs6/commas.csv b/docs6/docs/_build/html/commas.csv similarity index 100% rename from docs6/commas.csv rename to docs6/docs/_build/html/commas.csv diff --git a/docs6b/docs/_build/html/community.html b/docs6/docs/_build/html/community.html similarity index 100% rename from docs6b/docs/_build/html/community.html rename to docs6/docs/_build/html/community.html diff --git a/docs6b/docs/_build/html/contact.html b/docs6/docs/_build/html/contact.html similarity index 100% rename from docs6b/docs/_build/html/contact.html rename to docs6/docs/_build/html/contact.html diff --git a/docs6b/docs/_build/html/contributing.html b/docs6/docs/_build/html/contributing.html similarity index 100% rename from docs6b/docs/_build/html/contributing.html rename to docs6/docs/_build/html/contributing.html diff --git a/docs6b/docs/_build/html/cookbook.html b/docs6/docs/_build/html/cookbook.html similarity index 100% rename from docs6b/docs/_build/html/cookbook.html rename to docs6/docs/_build/html/cookbook.html diff --git a/docs6b/docs/_build/html/cookbook2.html b/docs6/docs/_build/html/cookbook2.html similarity index 100% rename from docs6b/docs/_build/html/cookbook2.html rename to docs6/docs/_build/html/cookbook2.html diff --git a/docs6b/docs/_build/html/cookbook3.html b/docs6/docs/_build/html/cookbook3.html similarity index 100% rename from docs6b/docs/_build/html/cookbook3.html rename to docs6/docs/_build/html/cookbook3.html diff --git a/docs6b/docs/_build/html/cookbook4.html b/docs6/docs/_build/html/cookbook4.html similarity index 100% rename from docs6b/docs/_build/html/cookbook4.html rename to docs6/docs/_build/html/cookbook4.html diff --git a/docs6b/docs/_build/html/csv-with-and-without-headers.html b/docs6/docs/_build/html/csv-with-and-without-headers.html similarity index 100% rename from docs6b/docs/_build/html/csv-with-and-without-headers.html rename to docs6/docs/_build/html/csv-with-and-without-headers.html diff --git a/docs6b/docs/_build/html/customization.html b/docs6/docs/_build/html/customization.html similarity index 100% rename from docs6b/docs/_build/html/customization.html rename to docs6/docs/_build/html/customization.html diff --git a/docs6b/docs/_build/html/data-cleaning-examples.html b/docs6/docs/_build/html/data-cleaning-examples.html similarity index 100% rename from docs6b/docs/_build/html/data-cleaning-examples.html rename to docs6/docs/_build/html/data-cleaning-examples.html diff --git a/docs6b/docs/_build/html/data-diving-examples.html b/docs6/docs/_build/html/data-diving-examples.html similarity index 100% rename from docs6b/docs/_build/html/data-diving-examples.html rename to docs6/docs/_build/html/data-diving-examples.html diff --git a/docs6b/docs/_build/html/data-examples.html b/docs6/docs/_build/html/data-examples.html similarity index 100% rename from docs6b/docs/_build/html/data-examples.html rename to docs6/docs/_build/html/data-examples.html diff --git a/docs6b/docs/_build/html/data-sharing.html b/docs6/docs/_build/html/data-sharing.html similarity index 100% rename from docs6b/docs/_build/html/data-sharing.html rename to docs6/docs/_build/html/data-sharing.html diff --git a/docs6/data/a.csv b/docs6/docs/_build/html/data/a.csv similarity index 100% rename from docs6/data/a.csv rename to docs6/docs/_build/html/data/a.csv diff --git a/docs6/data/a.dkvp b/docs6/docs/_build/html/data/a.dkvp similarity index 100% rename from docs6/data/a.dkvp rename to docs6/docs/_build/html/data/a.dkvp diff --git a/docs6/data/array-example.json b/docs6/docs/_build/html/data/array-example.json similarity index 100% rename from docs6/data/array-example.json rename to docs6/docs/_build/html/data/array-example.json diff --git a/docs6/data/b.csv b/docs6/docs/_build/html/data/b.csv similarity index 100% rename from docs6/data/b.csv rename to docs6/docs/_build/html/data/b.csv diff --git a/docs6/data/b.dkvp b/docs6/docs/_build/html/data/b.dkvp similarity index 100% rename from docs6/data/b.dkvp rename to docs6/docs/_build/html/data/b.dkvp diff --git a/docs6/data/begin-end-example-1.sh b/docs6/docs/_build/html/data/begin-end-example-1.sh similarity index 100% rename from docs6/data/begin-end-example-1.sh rename to docs6/docs/_build/html/data/begin-end-example-1.sh diff --git a/docs6/data/begin-end-example-2.sh b/docs6/docs/_build/html/data/begin-end-example-2.sh similarity index 100% rename from docs6/data/begin-end-example-2.sh rename to docs6/docs/_build/html/data/begin-end-example-2.sh diff --git a/docs6/data/begin-end-example-3.sh b/docs6/docs/_build/html/data/begin-end-example-3.sh similarity index 100% rename from docs6/data/begin-end-example-3.sh rename to docs6/docs/_build/html/data/begin-end-example-3.sh diff --git a/docs6/data/begin-end-example-4.sh b/docs6/docs/_build/html/data/begin-end-example-4.sh similarity index 100% rename from docs6/data/begin-end-example-4.sh rename to docs6/docs/_build/html/data/begin-end-example-4.sh diff --git a/docs6/data/begin-end-example-5.sh b/docs6/docs/_build/html/data/begin-end-example-5.sh similarity index 100% rename from docs6/data/begin-end-example-5.sh rename to docs6/docs/_build/html/data/begin-end-example-5.sh diff --git a/docs6/data/begin-end-example-6.sh b/docs6/docs/_build/html/data/begin-end-example-6.sh similarity index 100% rename from docs6/data/begin-end-example-6.sh rename to docs6/docs/_build/html/data/begin-end-example-6.sh diff --git a/docs6/data/begin-end-example-6a.sh b/docs6/docs/_build/html/data/begin-end-example-6a.sh similarity index 100% rename from docs6/data/begin-end-example-6a.sh rename to docs6/docs/_build/html/data/begin-end-example-6a.sh diff --git a/docs6/data/begin-end-example-7.sh b/docs6/docs/_build/html/data/begin-end-example-7.sh similarity index 100% rename from docs6/data/begin-end-example-7.sh rename to docs6/docs/_build/html/data/begin-end-example-7.sh diff --git a/docs6/data/begin-end-example-7b.sh b/docs6/docs/_build/html/data/begin-end-example-7b.sh similarity index 100% rename from docs6/data/begin-end-example-7b.sh rename to docs6/docs/_build/html/data/begin-end-example-7b.sh diff --git a/docs6/data/begin-end-example-8.sh b/docs6/docs/_build/html/data/begin-end-example-8.sh similarity index 100% rename from docs6/data/begin-end-example-8.sh rename to docs6/docs/_build/html/data/begin-end-example-8.sh diff --git a/docs6/data/budget.csv b/docs6/docs/_build/html/data/budget.csv similarity index 100% rename from docs6/data/budget.csv rename to docs6/docs/_build/html/data/budget.csv diff --git a/docs6/data/bulk-rename-for-loop.mlr b/docs6/docs/_build/html/data/bulk-rename-for-loop.mlr similarity index 100% rename from docs6/data/bulk-rename-for-loop.mlr rename to docs6/docs/_build/html/data/bulk-rename-for-loop.mlr diff --git a/docs6/data/clean-whitespace.csv b/docs6/docs/_build/html/data/clean-whitespace.csv similarity index 100% rename from docs6/data/clean-whitespace.csv rename to docs6/docs/_build/html/data/clean-whitespace.csv diff --git a/docs6/data/color-codes.csv b/docs6/docs/_build/html/data/color-codes.csv similarity index 100% rename from docs6/data/color-codes.csv rename to docs6/docs/_build/html/data/color-codes.csv diff --git a/docs6/data/color-names.csv b/docs6/docs/_build/html/data/color-names.csv similarity index 100% rename from docs6/data/color-names.csv rename to docs6/docs/_build/html/data/color-names.csv diff --git a/docs6/data/colored-shapes.csv b/docs6/docs/_build/html/data/colored-shapes.csv similarity index 100% rename from docs6/data/colored-shapes.csv rename to docs6/docs/_build/html/data/colored-shapes.csv diff --git a/docs6/data/colored-shapes.dkvp b/docs6/docs/_build/html/data/colored-shapes.dkvp similarity index 100% rename from docs6/data/colored-shapes.dkvp rename to docs6/docs/_build/html/data/colored-shapes.dkvp diff --git a/docs6/data/colours.csv b/docs6/docs/_build/html/data/colours.csv similarity index 100% rename from docs6/data/colours.csv rename to docs6/docs/_build/html/data/colours.csv diff --git a/docs6/data/current_counters.csv b/docs6/docs/_build/html/data/current_counters.csv similarity index 100% rename from docs6/data/current_counters.csv rename to docs6/docs/_build/html/data/current_counters.csv diff --git a/docs6/data/currtemp.csv b/docs6/docs/_build/html/data/currtemp.csv similarity index 100% rename from docs6/data/currtemp.csv rename to docs6/docs/_build/html/data/currtemp.csv diff --git a/docs6b/docs/_build/html/data/delimiter-examples.txt b/docs6/docs/_build/html/data/delimiter-examples.txt similarity index 100% rename from docs6b/docs/_build/html/data/delimiter-examples.txt rename to docs6/docs/_build/html/data/delimiter-examples.txt diff --git a/docs6/data/dollar-sign.txt b/docs6/docs/_build/html/data/dollar-sign.txt similarity index 100% rename from docs6/data/dollar-sign.txt rename to docs6/docs/_build/html/data/dollar-sign.txt diff --git a/docs6/data/dynamic-nr.sh b/docs6/docs/_build/html/data/dynamic-nr.sh similarity index 100% rename from docs6/data/dynamic-nr.sh rename to docs6/docs/_build/html/data/dynamic-nr.sh diff --git a/docs6/data/emit-lashed.sh b/docs6/docs/_build/html/data/emit-lashed.sh similarity index 100% rename from docs6/data/emit-lashed.sh rename to docs6/docs/_build/html/data/emit-lashed.sh diff --git a/docs6/data/english-words.txt b/docs6/docs/_build/html/data/english-words.txt similarity index 100% rename from docs6/data/english-words.txt rename to docs6/docs/_build/html/data/english-words.txt diff --git a/docs6/data/factorial-example.sh b/docs6/docs/_build/html/data/factorial-example.sh similarity index 100% rename from docs6/data/factorial-example.sh rename to docs6/docs/_build/html/data/factorial-example.sh diff --git a/docs6/data/fe-example-1.sh b/docs6/docs/_build/html/data/fe-example-1.sh similarity index 100% rename from docs6/data/fe-example-1.sh rename to docs6/docs/_build/html/data/fe-example-1.sh diff --git a/docs6/data/fe-example-2.sh b/docs6/docs/_build/html/data/fe-example-2.sh similarity index 100% rename from docs6/data/fe-example-2.sh rename to docs6/docs/_build/html/data/fe-example-2.sh diff --git a/docs6/data/fe-example-3.mlr b/docs6/docs/_build/html/data/fe-example-3.mlr similarity index 100% rename from docs6/data/fe-example-3.mlr rename to docs6/docs/_build/html/data/fe-example-3.mlr diff --git a/docs6/data/fe-example-4.mlr b/docs6/docs/_build/html/data/fe-example-4.mlr similarity index 100% rename from docs6/data/fe-example-4.mlr rename to docs6/docs/_build/html/data/fe-example-4.mlr diff --git a/docs6/data/feature-count.mlr b/docs6/docs/_build/html/data/feature-count.mlr similarity index 100% rename from docs6/data/feature-count.mlr rename to docs6/docs/_build/html/data/feature-count.mlr diff --git a/docs6/data/features.json b/docs6/docs/_build/html/data/features.json similarity index 100% rename from docs6/data/features.json rename to docs6/docs/_build/html/data/features.json diff --git a/docs6/data/fibo-cached.sh b/docs6/docs/_build/html/data/fibo-cached.sh similarity index 100% rename from docs6/data/fibo-cached.sh rename to docs6/docs/_build/html/data/fibo-cached.sh diff --git a/docs6/data/fibo-uncached.sh b/docs6/docs/_build/html/data/fibo-uncached.sh similarity index 100% rename from docs6/data/fibo-uncached.sh rename to docs6/docs/_build/html/data/fibo-uncached.sh diff --git a/docs6/data/fill-down.csv b/docs6/docs/_build/html/data/fill-down.csv similarity index 100% rename from docs6/data/fill-down.csv rename to docs6/docs/_build/html/data/fill-down.csv diff --git a/docs6/data/filter-multiline-example.txt b/docs6/docs/_build/html/data/filter-multiline-example.txt similarity index 100% rename from docs6/data/filter-multiline-example.txt rename to docs6/docs/_build/html/data/filter-multiline-example.txt diff --git a/docs6/data/flins.csv b/docs6/docs/_build/html/data/flins.csv similarity index 100% rename from docs6/data/flins.csv rename to docs6/docs/_build/html/data/flins.csv diff --git a/docs6/data/flins.json b/docs6/docs/_build/html/data/flins.json similarity index 100% rename from docs6/data/flins.json rename to docs6/docs/_build/html/data/flins.json diff --git a/docs6/data/for-oosvar-example-0a.txt b/docs6/docs/_build/html/data/for-oosvar-example-0a.txt similarity index 100% rename from docs6/data/for-oosvar-example-0a.txt rename to docs6/docs/_build/html/data/for-oosvar-example-0a.txt diff --git a/docs6/data/for-oosvar-example-0b.sh b/docs6/docs/_build/html/data/for-oosvar-example-0b.sh similarity index 100% rename from docs6/data/for-oosvar-example-0b.sh rename to docs6/docs/_build/html/data/for-oosvar-example-0b.sh diff --git a/docs6/data/for-oosvar-example-0c.sh b/docs6/docs/_build/html/data/for-oosvar-example-0c.sh similarity index 100% rename from docs6/data/for-oosvar-example-0c.sh rename to docs6/docs/_build/html/data/for-oosvar-example-0c.sh diff --git a/docs6/data/for-oosvar-example-0d.sh b/docs6/docs/_build/html/data/for-oosvar-example-0d.sh similarity index 100% rename from docs6/data/for-oosvar-example-0d.sh rename to docs6/docs/_build/html/data/for-oosvar-example-0d.sh diff --git a/docs6/data/for-oosvar-example-0e.sh b/docs6/docs/_build/html/data/for-oosvar-example-0e.sh similarity index 100% rename from docs6/data/for-oosvar-example-0e.sh rename to docs6/docs/_build/html/data/for-oosvar-example-0e.sh diff --git a/docs6/data/for-srec-example-1.sh b/docs6/docs/_build/html/data/for-srec-example-1.sh similarity index 100% rename from docs6/data/for-srec-example-1.sh rename to docs6/docs/_build/html/data/for-srec-example-1.sh diff --git a/docs6/data/for-srec-example-2.sh b/docs6/docs/_build/html/data/for-srec-example-2.sh similarity index 100% rename from docs6/data/for-srec-example-2.sh rename to docs6/docs/_build/html/data/for-srec-example-2.sh diff --git a/docs6/data/for-srec-example-3.sh b/docs6/docs/_build/html/data/for-srec-example-3.sh similarity index 100% rename from docs6/data/for-srec-example-3.sh rename to docs6/docs/_build/html/data/for-srec-example-3.sh diff --git a/docs6/data/for-srec-example.tbl b/docs6/docs/_build/html/data/for-srec-example.tbl similarity index 100% rename from docs6/data/for-srec-example.tbl rename to docs6/docs/_build/html/data/for-srec-example.tbl diff --git a/docs6/data/fraction-example.csv b/docs6/docs/_build/html/data/fraction-example.csv similarity index 100% rename from docs6/data/fraction-example.csv rename to docs6/docs/_build/html/data/fraction-example.csv diff --git a/docs6/data/full-reorg.sh b/docs6/docs/_build/html/data/full-reorg.sh similarity index 100% rename from docs6/data/full-reorg.sh rename to docs6/docs/_build/html/data/full-reorg.sh diff --git a/docs6/data/headerless.csv b/docs6/docs/_build/html/data/headerless.csv similarity index 100% rename from docs6/data/headerless.csv rename to docs6/docs/_build/html/data/headerless.csv diff --git a/docs6/data/het-bool.csv b/docs6/docs/_build/html/data/het-bool.csv similarity index 100% rename from docs6/data/het-bool.csv rename to docs6/docs/_build/html/data/het-bool.csv diff --git a/docs6/data/het.csv b/docs6/docs/_build/html/data/het.csv similarity index 100% rename from docs6/data/het.csv rename to docs6/docs/_build/html/data/het.csv diff --git a/docs6/data/het.dkvp b/docs6/docs/_build/html/data/het.dkvp similarity index 100% rename from docs6/data/het.dkvp rename to docs6/docs/_build/html/data/het.dkvp diff --git a/docs6/data/if-chain.sh b/docs6/docs/_build/html/data/if-chain.sh similarity index 100% rename from docs6/data/if-chain.sh rename to docs6/docs/_build/html/data/if-chain.sh diff --git a/docs6/data/inout.csv b/docs6/docs/_build/html/data/inout.csv similarity index 100% rename from docs6/data/inout.csv rename to docs6/docs/_build/html/data/inout.csv diff --git a/docs6/data/iqr1.sh b/docs6/docs/_build/html/data/iqr1.sh similarity index 100% rename from docs6/data/iqr1.sh rename to docs6/docs/_build/html/data/iqr1.sh diff --git a/docs6/data/iqrn.sh b/docs6/docs/_build/html/data/iqrn.sh similarity index 100% rename from docs6/data/iqrn.sh rename to docs6/docs/_build/html/data/iqrn.sh diff --git a/docs6/data/join-left-example.csv b/docs6/docs/_build/html/data/join-left-example.csv similarity index 100% rename from docs6/data/join-left-example.csv rename to docs6/docs/_build/html/data/join-left-example.csv diff --git a/docs6/data/join-right-example.csv b/docs6/docs/_build/html/data/join-right-example.csv similarity index 100% rename from docs6/data/join-right-example.csv rename to docs6/docs/_build/html/data/join-right-example.csv diff --git a/docs6/data/join-u-left.csv b/docs6/docs/_build/html/data/join-u-left.csv similarity index 100% rename from docs6/data/join-u-left.csv rename to docs6/docs/_build/html/data/join-u-left.csv diff --git a/docs6/data/join-u-right.csv b/docs6/docs/_build/html/data/join-u-right.csv similarity index 100% rename from docs6/data/join-u-right.csv rename to docs6/docs/_build/html/data/join-u-right.csv diff --git a/docs6/data/json-example-1.json b/docs6/docs/_build/html/data/json-example-1.json similarity index 100% rename from docs6/data/json-example-1.json rename to docs6/docs/_build/html/data/json-example-1.json diff --git a/docs6/data/json-example-2.json b/docs6/docs/_build/html/data/json-example-2.json similarity index 100% rename from docs6/data/json-example-2.json rename to docs6/docs/_build/html/data/json-example-2.json diff --git a/docs6/data/json-example-3.json b/docs6/docs/_build/html/data/json-example-3.json similarity index 100% rename from docs6/data/json-example-3.json rename to docs6/docs/_build/html/data/json-example-3.json diff --git a/docs6/data/keyed-mean-with-oosvars.sh b/docs6/docs/_build/html/data/keyed-mean-with-oosvars.sh similarity index 100% rename from docs6/data/keyed-mean-with-oosvars.sh rename to docs6/docs/_build/html/data/keyed-mean-with-oosvars.sh diff --git a/docs6/data/keyed-min-max-with-oosvars.sh b/docs6/docs/_build/html/data/keyed-min-max-with-oosvars.sh similarity index 100% rename from docs6/data/keyed-min-max-with-oosvars.sh rename to docs6/docs/_build/html/data/keyed-min-max-with-oosvars.sh diff --git a/docs6/data/label-example.txt b/docs6/docs/_build/html/data/label-example.txt similarity index 100% rename from docs6/data/label-example.txt rename to docs6/docs/_build/html/data/label-example.txt diff --git a/docs6b/docs/_build/html/_images/linreg-example.jpg b/docs6/docs/_build/html/data/linreg-example.jpg similarity index 100% rename from docs6b/docs/_build/html/_images/linreg-example.jpg rename to docs6/docs/_build/html/data/linreg-example.jpg diff --git a/docs6/data/linreg-example.txt b/docs6/docs/_build/html/data/linreg-example.txt similarity index 100% rename from docs6/data/linreg-example.txt rename to docs6/docs/_build/html/data/linreg-example.txt diff --git a/docs6/data/local-example-1.sh b/docs6/docs/_build/html/data/local-example-1.sh old mode 100755 new mode 100644 similarity index 100% rename from docs6/data/local-example-1.sh rename to docs6/docs/_build/html/data/local-example-1.sh diff --git a/docs6/data/map-literal-example-1.sh b/docs6/docs/_build/html/data/map-literal-example-1.sh old mode 100755 new mode 100644 similarity index 100% rename from docs6/data/map-literal-example-1.sh rename to docs6/docs/_build/html/data/map-literal-example-1.sh diff --git a/docs6/data/map-literal-example-2.sh b/docs6/docs/_build/html/data/map-literal-example-2.sh old mode 100755 new mode 100644 similarity index 100% rename from docs6/data/map-literal-example-2.sh rename to docs6/docs/_build/html/data/map-literal-example-2.sh diff --git a/docs6/data/map-literal-example-3.sh b/docs6/docs/_build/html/data/map-literal-example-3.sh old mode 100755 new mode 100644 similarity index 100% rename from docs6/data/map-literal-example-3.sh rename to docs6/docs/_build/html/data/map-literal-example-3.sh diff --git a/docs6/data/maxrows.mlr b/docs6/docs/_build/html/data/maxrows.mlr similarity index 100% rename from docs6/data/maxrows.mlr rename to docs6/docs/_build/html/data/maxrows.mlr diff --git a/docs6/data/maxrows.tsv b/docs6/docs/_build/html/data/maxrows.tsv similarity index 100% rename from docs6/data/maxrows.tsv rename to docs6/docs/_build/html/data/maxrows.tsv diff --git a/docs6/data/mean-with-oosvars.sh b/docs6/docs/_build/html/data/mean-with-oosvars.sh similarity index 100% rename from docs6/data/mean-with-oosvars.sh rename to docs6/docs/_build/html/data/mean-with-oosvars.sh diff --git a/docs6/data/medium b/docs6/docs/_build/html/data/medium similarity index 100% rename from docs6/data/medium rename to docs6/docs/_build/html/data/medium diff --git a/docs6/data/medium-squares b/docs6/docs/_build/html/data/medium-squares similarity index 100% rename from docs6/data/medium-squares rename to docs6/docs/_build/html/data/medium-squares diff --git a/docs6/data/miss-date-1.sh b/docs6/docs/_build/html/data/miss-date-1.sh similarity index 100% rename from docs6/data/miss-date-1.sh rename to docs6/docs/_build/html/data/miss-date-1.sh diff --git a/docs6/data/miss-date-2.sh b/docs6/docs/_build/html/data/miss-date-2.sh similarity index 100% rename from docs6/data/miss-date-2.sh rename to docs6/docs/_build/html/data/miss-date-2.sh diff --git a/docs6/data/miss-date.csv b/docs6/docs/_build/html/data/miss-date.csv similarity index 100% rename from docs6/data/miss-date.csv rename to docs6/docs/_build/html/data/miss-date.csv diff --git a/docs6/data/mkdat2 b/docs6/docs/_build/html/data/mkdat2 old mode 100755 new mode 100644 similarity index 100% rename from docs6/data/mkdat2 rename to docs6/docs/_build/html/data/mkdat2 diff --git a/docs6/data/multicountdown.dat b/docs6/docs/_build/html/data/multicountdown.dat similarity index 100% rename from docs6/data/multicountdown.dat rename to docs6/docs/_build/html/data/multicountdown.dat diff --git a/docs6/data/multicountdown.rb b/docs6/docs/_build/html/data/multicountdown.rb similarity index 100% rename from docs6/data/multicountdown.rb rename to docs6/docs/_build/html/data/multicountdown.rb diff --git a/docs6/data/mydata.txt b/docs6/docs/_build/html/data/mydata.txt similarity index 100% rename from docs6/data/mydata.txt rename to docs6/docs/_build/html/data/mydata.txt diff --git a/docs6/data/nested.tsv b/docs6/docs/_build/html/data/nested.tsv similarity index 100% rename from docs6/data/nested.tsv rename to docs6/docs/_build/html/data/nested.tsv diff --git a/docs6/data/newline-example.txt b/docs6/docs/_build/html/data/newline-example.txt similarity index 100% rename from docs6/data/newline-example.txt rename to docs6/docs/_build/html/data/newline-example.txt diff --git a/docs6/data/ping-delta-example.txt b/docs6/docs/_build/html/data/ping-delta-example.txt similarity index 100% rename from docs6/data/ping-delta-example.txt rename to docs6/docs/_build/html/data/ping-delta-example.txt diff --git a/docs6/data/previous-to-current.sh b/docs6/docs/_build/html/data/previous-to-current.sh similarity index 100% rename from docs6/data/previous-to-current.sh rename to docs6/docs/_build/html/data/previous-to-current.sh diff --git a/docs6/data/previous_counters.csv b/docs6/docs/_build/html/data/previous_counters.csv similarity index 100% rename from docs6/data/previous_counters.csv rename to docs6/docs/_build/html/data/previous_counters.csv diff --git a/docs6/data/prevtemp.csv b/docs6/docs/_build/html/data/prevtemp.csv similarity index 100% rename from docs6/data/prevtemp.csv rename to docs6/docs/_build/html/data/prevtemp.csv diff --git a/docs6/data/put-gating-example-1.dkvp b/docs6/docs/_build/html/data/put-gating-example-1.dkvp similarity index 100% rename from docs6/data/put-gating-example-1.dkvp rename to docs6/docs/_build/html/data/put-gating-example-1.dkvp diff --git a/docs6/data/put-gating-example-2.dkvp b/docs6/docs/_build/html/data/put-gating-example-2.dkvp similarity index 100% rename from docs6/data/put-gating-example-2.dkvp rename to docs6/docs/_build/html/data/put-gating-example-2.dkvp diff --git a/docs6/data/put-multiline-example.txt b/docs6/docs/_build/html/data/put-multiline-example.txt similarity index 100% rename from docs6/data/put-multiline-example.txt rename to docs6/docs/_build/html/data/put-multiline-example.txt diff --git a/docs6/data/question.dat b/docs6/docs/_build/html/data/question.dat similarity index 100% rename from docs6/data/question.dat rename to docs6/docs/_build/html/data/question.dat diff --git a/docs6/data/ragged-csv-2.sh b/docs6/docs/_build/html/data/ragged-csv-2.sh similarity index 100% rename from docs6/data/ragged-csv-2.sh rename to docs6/docs/_build/html/data/ragged-csv-2.sh diff --git a/docs6/data/ragged-csv.sh b/docs6/docs/_build/html/data/ragged-csv.sh old mode 100755 new mode 100644 similarity index 100% rename from docs6/data/ragged-csv.sh rename to docs6/docs/_build/html/data/ragged-csv.sh diff --git a/docs6/data/ragged.csv b/docs6/docs/_build/html/data/ragged.csv similarity index 100% rename from docs6/data/ragged.csv rename to docs6/docs/_build/html/data/ragged.csv diff --git a/docs6/data/rect-inner.txt b/docs6/docs/_build/html/data/rect-inner.txt similarity index 100% rename from docs6/data/rect-inner.txt rename to docs6/docs/_build/html/data/rect-inner.txt diff --git a/docs6/data/rect-middle.txt b/docs6/docs/_build/html/data/rect-middle.txt similarity index 100% rename from docs6/data/rect-middle.txt rename to docs6/docs/_build/html/data/rect-middle.txt diff --git a/docs6/data/rect-outer.txt b/docs6/docs/_build/html/data/rect-outer.txt similarity index 100% rename from docs6/data/rect-outer.txt rename to docs6/docs/_build/html/data/rect-outer.txt diff --git a/docs6/data/rect.sh b/docs6/docs/_build/html/data/rect.sh similarity index 100% rename from docs6/data/rect.sh rename to docs6/docs/_build/html/data/rect.sh diff --git a/docs6/data/rect.txt b/docs6/docs/_build/html/data/rect.txt similarity index 100% rename from docs6/data/rect.txt rename to docs6/docs/_build/html/data/rect.txt diff --git a/docs6/data/regex-in-data.dat b/docs6/docs/_build/html/data/regex-in-data.dat similarity index 100% rename from docs6/data/regex-in-data.dat rename to docs6/docs/_build/html/data/regex-in-data.dat diff --git a/docs6/data/remove-empty-columns.csv b/docs6/docs/_build/html/data/remove-empty-columns.csv similarity index 100% rename from docs6/data/remove-empty-columns.csv rename to docs6/docs/_build/html/data/remove-empty-columns.csv diff --git a/docs6/data/repeat-example.dat b/docs6/docs/_build/html/data/repeat-example.dat similarity index 100% rename from docs6/data/repeat-example.dat rename to docs6/docs/_build/html/data/repeat-example.dat diff --git a/docs6/data/repeats.dkvp b/docs6/docs/_build/html/data/repeats.dkvp similarity index 100% rename from docs6/data/repeats.dkvp rename to docs6/docs/_build/html/data/repeats.dkvp diff --git a/docs6/data/sample-example.txt b/docs6/docs/_build/html/data/sample-example.txt similarity index 100% rename from docs6/data/sample-example.txt rename to docs6/docs/_build/html/data/sample-example.txt diff --git a/docs6/data/sar.csv b/docs6/docs/_build/html/data/sar.csv similarity index 100% rename from docs6/data/sar.csv rename to docs6/docs/_build/html/data/sar.csv diff --git a/docs6/data/sar.mlr b/docs6/docs/_build/html/data/sar.mlr similarity index 100% rename from docs6/data/sar.mlr rename to docs6/docs/_build/html/data/sar.mlr diff --git a/docs6/data/scan-example-1.tbl b/docs6/docs/_build/html/data/scan-example-1.tbl similarity index 100% rename from docs6/data/scan-example-1.tbl rename to docs6/docs/_build/html/data/scan-example-1.tbl diff --git a/docs6/data/scan-example-2.tbl b/docs6/docs/_build/html/data/scan-example-2.tbl similarity index 100% rename from docs6/data/scan-example-2.tbl rename to docs6/docs/_build/html/data/scan-example-2.tbl diff --git a/docs6/data/scope-example.dat b/docs6/docs/_build/html/data/scope-example.dat similarity index 100% rename from docs6/data/scope-example.dat rename to docs6/docs/_build/html/data/scope-example.dat diff --git a/docs6/data/scope-example.mlr b/docs6/docs/_build/html/data/scope-example.mlr similarity index 100% rename from docs6/data/scope-example.mlr rename to docs6/docs/_build/html/data/scope-example.mlr diff --git a/docs6/data/self-join.csv b/docs6/docs/_build/html/data/self-join.csv similarity index 100% rename from docs6/data/self-join.csv rename to docs6/docs/_build/html/data/self-join.csv diff --git a/docs6/data/semicolon-example.txt b/docs6/docs/_build/html/data/semicolon-example.txt similarity index 100% rename from docs6/data/semicolon-example.txt rename to docs6/docs/_build/html/data/semicolon-example.txt diff --git a/docs6/data/single-for-example-1.sh b/docs6/docs/_build/html/data/single-for-example-1.sh old mode 100755 new mode 100644 similarity index 100% rename from docs6/data/single-for-example-1.sh rename to docs6/docs/_build/html/data/single-for-example-1.sh diff --git a/docs6/data/single-for-example-2.sh b/docs6/docs/_build/html/data/single-for-example-2.sh old mode 100755 new mode 100644 similarity index 100% rename from docs6/data/single-for-example-2.sh rename to docs6/docs/_build/html/data/single-for-example-2.sh diff --git a/docs6/data/single-quote-example.mlr b/docs6/docs/_build/html/data/single-quote-example.mlr similarity index 100% rename from docs6/data/single-quote-example.mlr rename to docs6/docs/_build/html/data/single-quote-example.mlr diff --git a/docs6/data/small b/docs6/docs/_build/html/data/small similarity index 100% rename from docs6/data/small rename to docs6/docs/_build/html/data/small diff --git a/docs6/data/small.csv b/docs6/docs/_build/html/data/small.csv similarity index 100% rename from docs6/data/small.csv rename to docs6/docs/_build/html/data/small.csv diff --git a/docs6/data/small2 b/docs6/docs/_build/html/data/small2 similarity index 100% rename from docs6/data/small2 rename to docs6/docs/_build/html/data/small2 diff --git a/docs6/data/sort-het.dkvp b/docs6/docs/_build/html/data/sort-het.dkvp similarity index 100% rename from docs6/data/sort-het.dkvp rename to docs6/docs/_build/html/data/sort-het.dkvp diff --git a/docs6/data/sort-missing.dkvp b/docs6/docs/_build/html/data/sort-missing.dkvp similarity index 100% rename from docs6/data/sort-missing.dkvp rename to docs6/docs/_build/html/data/sort-missing.dkvp diff --git a/docs6/data/sort-null.dat b/docs6/docs/_build/html/data/sort-null.dat similarity index 100% rename from docs6/data/sort-null.dat rename to docs6/docs/_build/html/data/sort-null.dat diff --git a/docs6/data/sort-within-records.json b/docs6/docs/_build/html/data/sort-within-records.json similarity index 100% rename from docs6/data/sort-within-records.json rename to docs6/docs/_build/html/data/sort-within-records.json diff --git a/docs6/data/spaces.csv b/docs6/docs/_build/html/data/spaces.csv similarity index 100% rename from docs6/data/spaces.csv rename to docs6/docs/_build/html/data/spaces.csv diff --git a/docs6/data/sparse.json b/docs6/docs/_build/html/data/sparse.json similarity index 100% rename from docs6/data/sparse.json rename to docs6/docs/_build/html/data/sparse.json diff --git a/docs6/data/subcommand-example.txt b/docs6/docs/_build/html/data/subcommand-example.txt similarity index 100% rename from docs6/data/subcommand-example.txt rename to docs6/docs/_build/html/data/subcommand-example.txt diff --git a/docs6/data/subr-example.sh b/docs6/docs/_build/html/data/subr-example.sh similarity index 100% rename from docs6/data/subr-example.sh rename to docs6/docs/_build/html/data/subr-example.sh diff --git a/docs6/data/system-file-ojson-example.txt b/docs6/docs/_build/html/data/system-file-ojson-example.txt similarity index 100% rename from docs6/data/system-file-ojson-example.txt rename to docs6/docs/_build/html/data/system-file-ojson-example.txt diff --git a/docs6/data/system-file-opprint-example.txt b/docs6/docs/_build/html/data/system-file-opprint-example.txt similarity index 100% rename from docs6/data/system-file-opprint-example.txt rename to docs6/docs/_build/html/data/system-file-opprint-example.txt diff --git a/docs6/data/system-file-oxtab-example.txt b/docs6/docs/_build/html/data/system-file-oxtab-example.txt similarity index 100% rename from docs6/data/system-file-oxtab-example.txt rename to docs6/docs/_build/html/data/system-file-oxtab-example.txt diff --git a/docs6/data/then-chaining-performance.txt b/docs6/docs/_build/html/data/then-chaining-performance.txt similarity index 100% rename from docs6/data/then-chaining-performance.txt rename to docs6/docs/_build/html/data/then-chaining-performance.txt diff --git a/docs6/data/then-example.csv b/docs6/docs/_build/html/data/then-example.csv similarity index 100% rename from docs6/data/then-example.csv rename to docs6/docs/_build/html/data/then-example.csv diff --git a/docs6/data/timing-example.txt b/docs6/docs/_build/html/data/timing-example.txt similarity index 100% rename from docs6/data/timing-example.txt rename to docs6/docs/_build/html/data/timing-example.txt diff --git a/docs6/data/trailing-commas.sh b/docs6/docs/_build/html/data/trailing-commas.sh old mode 100755 new mode 100644 similarity index 100% rename from docs6/data/trailing-commas.sh rename to docs6/docs/_build/html/data/trailing-commas.sh diff --git a/docs6/data/triple-for-example-1.sh b/docs6/docs/_build/html/data/triple-for-example-1.sh similarity index 100% rename from docs6/data/triple-for-example-1.sh rename to docs6/docs/_build/html/data/triple-for-example-1.sh diff --git a/docs6/data/triple-for-example-2.sh b/docs6/docs/_build/html/data/triple-for-example-2.sh similarity index 100% rename from docs6/data/triple-for-example-2.sh rename to docs6/docs/_build/html/data/triple-for-example-2.sh diff --git a/docs6/data/trivial-records.csv b/docs6/docs/_build/html/data/trivial-records.csv similarity index 100% rename from docs6/data/trivial-records.csv rename to docs6/docs/_build/html/data/trivial-records.csv diff --git a/docs6/data/two-pass-percentage.sh b/docs6/docs/_build/html/data/two-pass-percentage.sh similarity index 100% rename from docs6/data/two-pass-percentage.sh rename to docs6/docs/_build/html/data/two-pass-percentage.sh diff --git a/docs6/data/two-pass-record-numbers.sh b/docs6/docs/_build/html/data/two-pass-record-numbers.sh similarity index 100% rename from docs6/data/two-pass-record-numbers.sh rename to docs6/docs/_build/html/data/two-pass-record-numbers.sh diff --git a/docs6/data/type-decl-example.mlr b/docs6/docs/_build/html/data/type-decl-example.mlr similarity index 100% rename from docs6/data/type-decl-example.mlr rename to docs6/docs/_build/html/data/type-decl-example.mlr diff --git a/docs6/data/unsparsify.mlr b/docs6/docs/_build/html/data/unsparsify.mlr similarity index 100% rename from docs6/data/unsparsify.mlr rename to docs6/docs/_build/html/data/unsparsify.mlr diff --git a/docs6/data/weighted-mean.sh b/docs6/docs/_build/html/data/weighted-mean.sh similarity index 100% rename from docs6/data/weighted-mean.sh rename to docs6/docs/_build/html/data/weighted-mean.sh diff --git a/docs6/data/while-example-1.sh b/docs6/docs/_build/html/data/while-example-1.sh similarity index 100% rename from docs6/data/while-example-1.sh rename to docs6/docs/_build/html/data/while-example-1.sh diff --git a/docs6/data/while-example-2.sh b/docs6/docs/_build/html/data/while-example-2.sh similarity index 100% rename from docs6/data/while-example-2.sh rename to docs6/docs/_build/html/data/while-example-2.sh diff --git a/docs6b/docs/_build/html/dates-and-times.html b/docs6/docs/_build/html/dates-and-times.html similarity index 100% rename from docs6b/docs/_build/html/dates-and-times.html rename to docs6/docs/_build/html/dates-and-times.html diff --git a/docs6/dates.csv b/docs6/docs/_build/html/dates.csv similarity index 100% rename from docs6/dates.csv rename to docs6/docs/_build/html/dates.csv diff --git a/docs6b/docs/_build/html/dkvp-examples.html b/docs6/docs/_build/html/dkvp-examples.html similarity index 100% rename from docs6b/docs/_build/html/dkvp-examples.html rename to docs6/docs/_build/html/dkvp-examples.html diff --git a/docs6b/docs/_build/html/etymology.html b/docs6/docs/_build/html/etymology.html similarity index 100% rename from docs6b/docs/_build/html/etymology.html rename to docs6/docs/_build/html/etymology.html diff --git a/docs6b/docs/_build/html/ex-fields-not-selected.html b/docs6/docs/_build/html/ex-fields-not-selected.html similarity index 100% rename from docs6b/docs/_build/html/ex-fields-not-selected.html rename to docs6/docs/_build/html/ex-fields-not-selected.html diff --git a/docs6b/docs/_build/html/ex-no-output-at-all.html b/docs6/docs/_build/html/ex-no-output-at-all.html similarity index 100% rename from docs6b/docs/_build/html/ex-no-output-at-all.html rename to docs6/docs/_build/html/ex-no-output-at-all.html diff --git a/docs6/example.csv b/docs6/docs/_build/html/example.csv similarity index 100% rename from docs6/example.csv rename to docs6/docs/_build/html/example.csv diff --git a/docs6/expo-sample.sh b/docs6/docs/_build/html/expo-sample.sh old mode 100755 new mode 100644 similarity index 100% rename from docs6/expo-sample.sh rename to docs6/docs/_build/html/expo-sample.sh diff --git a/docs6b/docs/_build/html/faq.html b/docs6/docs/_build/html/faq.html similarity index 100% rename from docs6b/docs/_build/html/faq.html rename to docs6/docs/_build/html/faq.html diff --git a/docs6b/docs/_build/html/feature-comparison.html b/docs6/docs/_build/html/feature-comparison.html similarity index 100% rename from docs6b/docs/_build/html/feature-comparison.html rename to docs6/docs/_build/html/feature-comparison.html diff --git a/docs6b/docs/_build/html/features.html b/docs6/docs/_build/html/features.html similarity index 100% rename from docs6b/docs/_build/html/features.html rename to docs6/docs/_build/html/features.html diff --git a/docs6b/docs/_build/html/file-formats.html b/docs6/docs/_build/html/file-formats.html similarity index 100% rename from docs6b/docs/_build/html/file-formats.html rename to docs6/docs/_build/html/file-formats.html diff --git a/docs6b/docs/_build/html/foo.html b/docs6/docs/_build/html/foo.html similarity index 100% rename from docs6b/docs/_build/html/foo.html rename to docs6/docs/_build/html/foo.html diff --git a/docs6b/docs/_build/html/genindex.html b/docs6/docs/_build/html/genindex.html similarity index 100% rename from docs6b/docs/_build/html/genindex.html rename to docs6/docs/_build/html/genindex.html diff --git a/docs6b/docs/_build/html/getting-started.html b/docs6/docs/_build/html/getting-started.html similarity index 100% rename from docs6b/docs/_build/html/getting-started.html rename to docs6/docs/_build/html/getting-started.html diff --git a/docs6b/docs/_build/html/index.html b/docs6/docs/_build/html/index.html similarity index 100% rename from docs6b/docs/_build/html/index.html rename to docs6/docs/_build/html/index.html diff --git a/docs6b/docs/_build/html/install.html b/docs6/docs/_build/html/install.html similarity index 100% rename from docs6b/docs/_build/html/install.html rename to docs6/docs/_build/html/install.html diff --git a/docs6b/docs/_build/html/installation.html b/docs6/docs/_build/html/installation.html similarity index 100% rename from docs6b/docs/_build/html/installation.html rename to docs6/docs/_build/html/installation.html diff --git a/docs6b/docs/_build/html/internationalization.html b/docs6/docs/_build/html/internationalization.html similarity index 100% rename from docs6b/docs/_build/html/internationalization.html rename to docs6/docs/_build/html/internationalization.html diff --git a/docs6b/docs/_build/html/introduction.html b/docs6/docs/_build/html/introduction.html similarity index 100% rename from docs6b/docs/_build/html/introduction.html rename to docs6/docs/_build/html/introduction.html diff --git a/docs6b/docs/_build/html/joins.html b/docs6/docs/_build/html/joins.html similarity index 100% rename from docs6b/docs/_build/html/joins.html rename to docs6/docs/_build/html/joins.html diff --git a/docs6b/docs/_build/html/keystroke-savers.html b/docs6/docs/_build/html/keystroke-savers.html similarity index 100% rename from docs6b/docs/_build/html/keystroke-savers.html rename to docs6/docs/_build/html/keystroke-savers.html diff --git a/docs6b/docs/_build/html/log-processing-examples.html b/docs6/docs/_build/html/log-processing-examples.html similarity index 100% rename from docs6b/docs/_build/html/log-processing-examples.html rename to docs6/docs/_build/html/log-processing-examples.html diff --git a/docs6/log.txt b/docs6/docs/_build/html/log.txt similarity index 100% rename from docs6/log.txt rename to docs6/docs/_build/html/log.txt diff --git a/docs6/make.bat b/docs6/docs/_build/html/make.bat similarity index 100% rename from docs6/make.bat rename to docs6/docs/_build/html/make.bat diff --git a/docs6b/docs/_build/html/manpage.html b/docs6/docs/_build/html/manpage.html similarity index 100% rename from docs6b/docs/_build/html/manpage.html rename to docs6/docs/_build/html/manpage.html diff --git a/docs6/manpage.txt b/docs6/docs/_build/html/manpage.txt similarity index 100% rename from docs6/manpage.txt rename to docs6/docs/_build/html/manpage.txt diff --git a/docs6b/docs/_build/html/miller-by-example.html b/docs6/docs/_build/html/miller-by-example.html similarity index 100% rename from docs6b/docs/_build/html/miller-by-example.html rename to docs6/docs/_build/html/miller-by-example.html diff --git a/docs6b/docs/_build/html/miller-on-windows.html b/docs6/docs/_build/html/miller-on-windows.html similarity index 100% rename from docs6b/docs/_build/html/miller-on-windows.html rename to docs6/docs/_build/html/miller-on-windows.html diff --git a/docs6b/docs/_build/html/misc-examples.html b/docs6/docs/_build/html/misc-examples.html similarity index 100% rename from docs6b/docs/_build/html/misc-examples.html rename to docs6/docs/_build/html/misc-examples.html diff --git a/docs6/multi-join/input.csv b/docs6/docs/_build/html/multi-join/input.csv similarity index 100% rename from docs6/multi-join/input.csv rename to docs6/docs/_build/html/multi-join/input.csv diff --git a/docs6/multi-join/name-lookup.csv b/docs6/docs/_build/html/multi-join/name-lookup.csv similarity index 100% rename from docs6/multi-join/name-lookup.csv rename to docs6/docs/_build/html/multi-join/name-lookup.csv diff --git a/docs6/multi-join/status-lookup.csv b/docs6/docs/_build/html/multi-join/status-lookup.csv similarity index 100% rename from docs6/multi-join/status-lookup.csv rename to docs6/docs/_build/html/multi-join/status-lookup.csv diff --git a/docs6b/docs/_build/html/new-in-miller-6.html b/docs6/docs/_build/html/new-in-miller-6.html similarity index 100% rename from docs6b/docs/_build/html/new-in-miller-6.html rename to docs6/docs/_build/html/new-in-miller-6.html diff --git a/docs6/ngrams/gsl-2000.txt b/docs6/docs/_build/html/ngrams/gsl-2000.txt similarity index 100% rename from docs6/ngrams/gsl-2000.txt rename to docs6/docs/_build/html/ngrams/gsl-2000.txt diff --git a/docs6/ngrams/mkv.mlr b/docs6/docs/_build/html/ngrams/mkv.mlr old mode 100755 new mode 100644 similarity index 100% rename from docs6/ngrams/mkv.mlr rename to docs6/docs/_build/html/ngrams/mkv.mlr diff --git a/docs6/ngrams/mkv3.mlr b/docs6/docs/_build/html/ngrams/mkv3.mlr old mode 100755 new mode 100644 similarity index 100% rename from docs6/ngrams/mkv3.mlr rename to docs6/docs/_build/html/ngrams/mkv3.mlr diff --git a/docs6/ngrams/mkv4.mlr b/docs6/docs/_build/html/ngrams/mkv4.mlr old mode 100755 new mode 100644 similarity index 100% rename from docs6/ngrams/mkv4.mlr rename to docs6/docs/_build/html/ngrams/mkv4.mlr diff --git a/docs6/ngrams/mkv5.mlr b/docs6/docs/_build/html/ngrams/mkv5.mlr old mode 100755 new mode 100644 similarity index 100% rename from docs6/ngrams/mkv5.mlr rename to docs6/docs/_build/html/ngrams/mkv5.mlr diff --git a/docs6/ngrams/ng1 b/docs6/docs/_build/html/ngrams/ng1 old mode 100755 new mode 100644 similarity index 100% rename from docs6/ngrams/ng1 rename to docs6/docs/_build/html/ngrams/ng1 diff --git a/docs6/ngrams/ng1.mlr b/docs6/docs/_build/html/ngrams/ng1.mlr old mode 100755 new mode 100644 similarity index 100% rename from docs6/ngrams/ng1.mlr rename to docs6/docs/_build/html/ngrams/ng1.mlr diff --git a/docs6/ngrams/ng1.mlr.txt b/docs6/docs/_build/html/ngrams/ng1.mlr.txt old mode 100755 new mode 100644 similarity index 100% rename from docs6/ngrams/ng1.mlr.txt rename to docs6/docs/_build/html/ngrams/ng1.mlr.txt diff --git a/docs6/ngrams/ng2 b/docs6/docs/_build/html/ngrams/ng2 old mode 100755 new mode 100644 similarity index 100% rename from docs6/ngrams/ng2 rename to docs6/docs/_build/html/ngrams/ng2 diff --git a/docs6/ngrams/ng2.mlr b/docs6/docs/_build/html/ngrams/ng2.mlr old mode 100755 new mode 100644 similarity index 100% rename from docs6/ngrams/ng2.mlr rename to docs6/docs/_build/html/ngrams/ng2.mlr diff --git a/docs6/ngrams/ng2.mlr.txt b/docs6/docs/_build/html/ngrams/ng2.mlr.txt old mode 100755 new mode 100644 similarity index 100% rename from docs6/ngrams/ng2.mlr.txt rename to docs6/docs/_build/html/ngrams/ng2.mlr.txt diff --git a/docs6/ngrams/ng3 b/docs6/docs/_build/html/ngrams/ng3 old mode 100755 new mode 100644 similarity index 100% rename from docs6/ngrams/ng3 rename to docs6/docs/_build/html/ngrams/ng3 diff --git a/docs6/ngrams/ng3.mlr b/docs6/docs/_build/html/ngrams/ng3.mlr old mode 100755 new mode 100644 similarity index 100% rename from docs6/ngrams/ng3.mlr rename to docs6/docs/_build/html/ngrams/ng3.mlr diff --git a/docs6/ngrams/ng3.mlr.txt b/docs6/docs/_build/html/ngrams/ng3.mlr.txt old mode 100755 new mode 100644 similarity index 100% rename from docs6/ngrams/ng3.mlr.txt rename to docs6/docs/_build/html/ngrams/ng3.mlr.txt diff --git a/docs6/ngrams/ng4 b/docs6/docs/_build/html/ngrams/ng4 old mode 100755 new mode 100644 similarity index 100% rename from docs6/ngrams/ng4 rename to docs6/docs/_build/html/ngrams/ng4 diff --git a/docs6/ngrams/ng4.mlr b/docs6/docs/_build/html/ngrams/ng4.mlr old mode 100755 new mode 100644 similarity index 100% rename from docs6/ngrams/ng4.mlr rename to docs6/docs/_build/html/ngrams/ng4.mlr diff --git a/docs6/ngrams/ng4.mlr.txt b/docs6/docs/_build/html/ngrams/ng4.mlr.txt old mode 100755 new mode 100644 similarity index 100% rename from docs6/ngrams/ng4.mlr.txt rename to docs6/docs/_build/html/ngrams/ng4.mlr.txt diff --git a/docs6/ngrams/ng5 b/docs6/docs/_build/html/ngrams/ng5 old mode 100755 new mode 100644 similarity index 100% rename from docs6/ngrams/ng5 rename to docs6/docs/_build/html/ngrams/ng5 diff --git a/docs6/ngrams/ng5.mlr b/docs6/docs/_build/html/ngrams/ng5.mlr old mode 100755 new mode 100644 similarity index 100% rename from docs6/ngrams/ng5.mlr rename to docs6/docs/_build/html/ngrams/ng5.mlr diff --git a/docs6/ngrams/ng5.mlr.txt b/docs6/docs/_build/html/ngrams/ng5.mlr.txt old mode 100755 new mode 100644 similarity index 100% rename from docs6/ngrams/ng5.mlr.txt rename to docs6/docs/_build/html/ngrams/ng5.mlr.txt diff --git a/docs6/ngrams/ngfuncs.mlr b/docs6/docs/_build/html/ngrams/ngfuncs.mlr similarity index 100% rename from docs6/ngrams/ngfuncs.mlr rename to docs6/docs/_build/html/ngrams/ngfuncs.mlr diff --git a/docs6/ngrams/ngfuncs.mlr.txt b/docs6/docs/_build/html/ngrams/ngfuncs.mlr.txt similarity index 100% rename from docs6/ngrams/ngfuncs.mlr.txt rename to docs6/docs/_build/html/ngrams/ngfuncs.mlr.txt diff --git a/docs6b/docs/_build/html/objects.inv b/docs6/docs/_build/html/objects.inv similarity index 100% rename from docs6b/docs/_build/html/objects.inv rename to docs6/docs/_build/html/objects.inv diff --git a/docs6b/docs/_build/html/old-10min.html b/docs6/docs/_build/html/old-10min.html similarity index 100% rename from docs6b/docs/_build/html/old-10min.html rename to docs6/docs/_build/html/old-10min.html diff --git a/docs6/oosvar-example-ewma.sh b/docs6/docs/_build/html/oosvar-example-ewma.sh similarity index 100% rename from docs6/oosvar-example-ewma.sh rename to docs6/docs/_build/html/oosvar-example-ewma.sh diff --git a/docs6/oosvar-example-sum-grouped.sh b/docs6/docs/_build/html/oosvar-example-sum-grouped.sh similarity index 100% rename from docs6/oosvar-example-sum-grouped.sh rename to docs6/docs/_build/html/oosvar-example-sum-grouped.sh diff --git a/docs6/oosvar-example-sum.sh b/docs6/docs/_build/html/oosvar-example-sum.sh similarity index 100% rename from docs6/oosvar-example-sum.sh rename to docs6/docs/_build/html/oosvar-example-sum.sh diff --git a/docs6b/docs/_build/html/operating-on-all-fields.html b/docs6/docs/_build/html/operating-on-all-fields.html similarity index 100% rename from docs6b/docs/_build/html/operating-on-all-fields.html rename to docs6/docs/_build/html/operating-on-all-fields.html diff --git a/docs6b/docs/_build/html/originality.html b/docs6/docs/_build/html/originality.html similarity index 100% rename from docs6b/docs/_build/html/originality.html rename to docs6/docs/_build/html/originality.html diff --git a/docs6b/docs/_build/html/output-colorization.html b/docs6/docs/_build/html/output-colorization.html similarity index 100% rename from docs6b/docs/_build/html/output-colorization.html rename to docs6/docs/_build/html/output-colorization.html diff --git a/docs6b/docs/_build/html/performance.html b/docs6/docs/_build/html/performance.html similarity index 100% rename from docs6b/docs/_build/html/performance.html rename to docs6/docs/_build/html/performance.html diff --git a/docs6b/docs/_build/html/_images/colorization.png b/docs6/docs/_build/html/pix/colorization.png similarity index 100% rename from docs6b/docs/_build/html/_images/colorization.png rename to docs6/docs/_build/html/pix/colorization.png diff --git a/docs6/pix/colorization.png.000 b/docs6/docs/_build/html/pix/colorization.png.000 similarity index 100% rename from docs6/pix/colorization.png.000 rename to docs6/docs/_build/html/pix/colorization.png.000 diff --git a/docs6b/docs/_build/html/_images/colorization2.png b/docs6/docs/_build/html/pix/colorization2.png similarity index 100% rename from docs6b/docs/_build/html/_images/colorization2.png rename to docs6/docs/_build/html/pix/colorization2.png diff --git a/docs6/pix/colorization2.png.000 b/docs6/docs/_build/html/pix/colorization2.png.000 similarity index 100% rename from docs6/pix/colorization2.png.000 rename to docs6/docs/_build/html/pix/colorization2.png.000 diff --git a/docs6b/docs/_build/html/_images/mand.png b/docs6/docs/_build/html/pix/mand.png similarity index 100% rename from docs6b/docs/_build/html/_images/mand.png rename to docs6/docs/_build/html/pix/mand.png diff --git a/docs6b/docs/_build/html/_images/miller-msys-complex.png b/docs6/docs/_build/html/pix/miller-msys-complex.png similarity index 100% rename from docs6b/docs/_build/html/_images/miller-msys-complex.png rename to docs6/docs/_build/html/pix/miller-msys-complex.png diff --git a/docs6b/docs/_build/html/_images/miller-msys.png b/docs6/docs/_build/html/pix/miller-msys.png similarity index 100% rename from docs6b/docs/_build/html/_images/miller-msys.png rename to docs6/docs/_build/html/pix/miller-msys.png diff --git a/docs6b/docs/_build/html/_images/miller-windows-complex-workaround.png b/docs6/docs/_build/html/pix/miller-windows-complex-workaround.png similarity index 100% rename from docs6b/docs/_build/html/_images/miller-windows-complex-workaround.png rename to docs6/docs/_build/html/pix/miller-windows-complex-workaround.png diff --git a/docs6b/docs/_build/html/_images/miller-windows-complex.png b/docs6/docs/_build/html/pix/miller-windows-complex.png similarity index 100% rename from docs6b/docs/_build/html/_images/miller-windows-complex.png rename to docs6/docs/_build/html/pix/miller-windows-complex.png diff --git a/docs6b/docs/_build/html/_images/miller-windows-triple-double-quote.png b/docs6/docs/_build/html/pix/miller-windows-triple-double-quote.png similarity index 100% rename from docs6b/docs/_build/html/_images/miller-windows-triple-double-quote.png rename to docs6/docs/_build/html/pix/miller-windows-triple-double-quote.png diff --git a/docs6b/docs/_build/html/_images/miller-windows.png b/docs6/docs/_build/html/pix/miller-windows.png similarity index 100% rename from docs6b/docs/_build/html/_images/miller-windows.png rename to docs6/docs/_build/html/pix/miller-windows.png diff --git a/docs6/pix/mlr-doc-sepia.jpg b/docs6/docs/_build/html/pix/mlr-doc-sepia.jpg similarity index 100% rename from docs6/pix/mlr-doc-sepia.jpg rename to docs6/docs/_build/html/pix/mlr-doc-sepia.jpg diff --git a/docs6/pix/mlr.jpg b/docs6/docs/_build/html/pix/mlr.jpg similarity index 100% rename from docs6/pix/mlr.jpg rename to docs6/docs/_build/html/pix/mlr.jpg diff --git a/docs6b/docs/_build/html/_images/omd.png b/docs6/docs/_build/html/pix/omd.png similarity index 100% rename from docs6b/docs/_build/html/_images/omd.png rename to docs6/docs/_build/html/pix/omd.png diff --git a/docs6/pix/sepia-overlay.jpg b/docs6/docs/_build/html/pix/sepia-overlay.jpg similarity index 100% rename from docs6/pix/sepia-overlay.jpg rename to docs6/docs/_build/html/pix/sepia-overlay.jpg diff --git a/docs6/polyglot-dkvp-io/dkvp_io.py b/docs6/docs/_build/html/polyglot-dkvp-io/dkvp_io.py similarity index 100% rename from docs6/polyglot-dkvp-io/dkvp_io.py rename to docs6/docs/_build/html/polyglot-dkvp-io/dkvp_io.py diff --git a/docs6/polyglot-dkvp-io/dkvp_io.rb b/docs6/docs/_build/html/polyglot-dkvp-io/dkvp_io.rb similarity index 100% rename from docs6/polyglot-dkvp-io/dkvp_io.rb rename to docs6/docs/_build/html/polyglot-dkvp-io/dkvp_io.rb diff --git a/docs6/polyglot-dkvp-io/example.py b/docs6/docs/_build/html/polyglot-dkvp-io/example.py similarity index 100% rename from docs6/polyglot-dkvp-io/example.py rename to docs6/docs/_build/html/polyglot-dkvp-io/example.py diff --git a/docs6/polyglot-dkvp-io/example.rb b/docs6/docs/_build/html/polyglot-dkvp-io/example.rb similarity index 100% rename from docs6/polyglot-dkvp-io/example.rb rename to docs6/docs/_build/html/polyglot-dkvp-io/example.rb diff --git a/docs6b/docs/_build/html/programming-examples.html b/docs6/docs/_build/html/programming-examples.html similarity index 100% rename from docs6b/docs/_build/html/programming-examples.html rename to docs6/docs/_build/html/programming-examples.html diff --git a/docs6b/docs/_build/html/programming-language.html b/docs6/docs/_build/html/programming-language.html similarity index 100% rename from docs6b/docs/_build/html/programming-language.html rename to docs6/docs/_build/html/programming-language.html diff --git a/docs6/programs/mand.mlr b/docs6/docs/_build/html/programs/mand.mlr similarity index 100% rename from docs6/programs/mand.mlr rename to docs6/docs/_build/html/programs/mand.mlr diff --git a/docs6/programs/mand.sh b/docs6/docs/_build/html/programs/mand.sh similarity index 100% rename from docs6/programs/mand.sh rename to docs6/docs/_build/html/programs/mand.sh diff --git a/docs6/programs/sieve.mlr b/docs6/docs/_build/html/programs/sieve.mlr similarity index 100% rename from docs6/programs/sieve.mlr rename to docs6/docs/_build/html/programs/sieve.mlr diff --git a/docs6b/docs/_build/html/quick-examples.html b/docs6/docs/_build/html/quick-examples.html similarity index 100% rename from docs6b/docs/_build/html/quick-examples.html rename to docs6/docs/_build/html/quick-examples.html diff --git a/docs6b/docs/_build/html/randomizing-examples.html b/docs6/docs/_build/html/randomizing-examples.html similarity index 100% rename from docs6b/docs/_build/html/randomizing-examples.html rename to docs6/docs/_build/html/randomizing-examples.html diff --git a/docs6b/docs/_build/html/record-heterogeneity.html b/docs6/docs/_build/html/record-heterogeneity.html similarity index 100% rename from docs6b/docs/_build/html/record-heterogeneity.html rename to docs6/docs/_build/html/record-heterogeneity.html diff --git a/docs6b/docs/_build/html/reference-dsl-arrays.html b/docs6/docs/_build/html/reference-dsl-arrays.html similarity index 100% rename from docs6b/docs/_build/html/reference-dsl-arrays.html rename to docs6/docs/_build/html/reference-dsl-arrays.html diff --git a/docs6b/docs/_build/html/reference-dsl-builtin-functions.html b/docs6/docs/_build/html/reference-dsl-builtin-functions.html similarity index 100% rename from docs6b/docs/_build/html/reference-dsl-builtin-functions.html rename to docs6/docs/_build/html/reference-dsl-builtin-functions.html diff --git a/docs6b/docs/_build/html/reference-dsl-complexity.html b/docs6/docs/_build/html/reference-dsl-complexity.html similarity index 100% rename from docs6b/docs/_build/html/reference-dsl-complexity.html rename to docs6/docs/_build/html/reference-dsl-complexity.html diff --git a/docs6b/docs/_build/html/reference-dsl-complexlity.html b/docs6/docs/_build/html/reference-dsl-complexlity.html similarity index 100% rename from docs6b/docs/_build/html/reference-dsl-complexlity.html rename to docs6/docs/_build/html/reference-dsl-complexlity.html diff --git a/docs6b/docs/_build/html/reference-dsl-control-structures.html b/docs6/docs/_build/html/reference-dsl-control-structures.html similarity index 100% rename from docs6b/docs/_build/html/reference-dsl-control-structures.html rename to docs6/docs/_build/html/reference-dsl-control-structures.html diff --git a/docs6b/docs/_build/html/reference-dsl-errors.html b/docs6/docs/_build/html/reference-dsl-errors.html similarity index 100% rename from docs6b/docs/_build/html/reference-dsl-errors.html rename to docs6/docs/_build/html/reference-dsl-errors.html diff --git a/docs6b/docs/_build/html/reference-dsl-filter-statements.html b/docs6/docs/_build/html/reference-dsl-filter-statements.html similarity index 100% rename from docs6b/docs/_build/html/reference-dsl-filter-statements.html rename to docs6/docs/_build/html/reference-dsl-filter-statements.html diff --git a/docs6b/docs/_build/html/reference-dsl-operators.html b/docs6/docs/_build/html/reference-dsl-operators.html similarity index 100% rename from docs6b/docs/_build/html/reference-dsl-operators.html rename to docs6/docs/_build/html/reference-dsl-operators.html diff --git a/docs6b/docs/_build/html/reference-dsl-output-statements.html b/docs6/docs/_build/html/reference-dsl-output-statements.html similarity index 100% rename from docs6b/docs/_build/html/reference-dsl-output-statements.html rename to docs6/docs/_build/html/reference-dsl-output-statements.html diff --git a/docs6b/docs/_build/html/reference-dsl-overview.html b/docs6/docs/_build/html/reference-dsl-overview.html similarity index 100% rename from docs6b/docs/_build/html/reference-dsl-overview.html rename to docs6/docs/_build/html/reference-dsl-overview.html diff --git a/docs6b/docs/_build/html/reference-dsl-syntax.html b/docs6/docs/_build/html/reference-dsl-syntax.html similarity index 100% rename from docs6b/docs/_build/html/reference-dsl-syntax.html rename to docs6/docs/_build/html/reference-dsl-syntax.html diff --git a/docs6b/docs/_build/html/reference-dsl-tbf.html b/docs6/docs/_build/html/reference-dsl-tbf.html similarity index 100% rename from docs6b/docs/_build/html/reference-dsl-tbf.html rename to docs6/docs/_build/html/reference-dsl-tbf.html diff --git a/docs6b/docs/_build/html/reference-dsl-unset-statements.html b/docs6/docs/_build/html/reference-dsl-unset-statements.html similarity index 100% rename from docs6b/docs/_build/html/reference-dsl-unset-statements.html rename to docs6/docs/_build/html/reference-dsl-unset-statements.html diff --git a/docs6b/docs/_build/html/reference-dsl-user-defined-functions.html b/docs6/docs/_build/html/reference-dsl-user-defined-functions.html similarity index 100% rename from docs6b/docs/_build/html/reference-dsl-user-defined-functions.html rename to docs6/docs/_build/html/reference-dsl-user-defined-functions.html diff --git a/docs6b/docs/_build/html/reference-dsl-variables.html b/docs6/docs/_build/html/reference-dsl-variables.html similarity index 100% rename from docs6b/docs/_build/html/reference-dsl-variables.html rename to docs6/docs/_build/html/reference-dsl-variables.html diff --git a/docs6b/docs/_build/html/reference-dsl.html b/docs6/docs/_build/html/reference-dsl.html similarity index 100% rename from docs6b/docs/_build/html/reference-dsl.html rename to docs6/docs/_build/html/reference-dsl.html diff --git a/docs6b/docs/_build/html/reference-main-arithmetic.html b/docs6/docs/_build/html/reference-main-arithmetic.html similarity index 100% rename from docs6b/docs/_build/html/reference-main-arithmetic.html rename to docs6/docs/_build/html/reference-main-arithmetic.html diff --git a/docs6b/docs/_build/html/reference-main-auxiliary-commands.html b/docs6/docs/_build/html/reference-main-auxiliary-commands.html similarity index 100% rename from docs6b/docs/_build/html/reference-main-auxiliary-commands.html rename to docs6/docs/_build/html/reference-main-auxiliary-commands.html diff --git a/docs6b/docs/_build/html/reference-main-data-types.html b/docs6/docs/_build/html/reference-main-data-types.html similarity index 100% rename from docs6b/docs/_build/html/reference-main-data-types.html rename to docs6/docs/_build/html/reference-main-data-types.html diff --git a/docs6b/docs/_build/html/reference-main-env-vars.html b/docs6/docs/_build/html/reference-main-env-vars.html similarity index 100% rename from docs6b/docs/_build/html/reference-main-env-vars.html rename to docs6/docs/_build/html/reference-main-env-vars.html diff --git a/docs6b/docs/_build/html/reference-main-io-options.html b/docs6/docs/_build/html/reference-main-io-options.html similarity index 100% rename from docs6b/docs/_build/html/reference-main-io-options.html rename to docs6/docs/_build/html/reference-main-io-options.html diff --git a/docs6b/docs/_build/html/reference-main-null-data.html b/docs6/docs/_build/html/reference-main-null-data.html similarity index 100% rename from docs6b/docs/_build/html/reference-main-null-data.html rename to docs6/docs/_build/html/reference-main-null-data.html diff --git a/docs6b/docs/_build/html/reference-main-online-help.html b/docs6/docs/_build/html/reference-main-online-help.html similarity index 100% rename from docs6b/docs/_build/html/reference-main-online-help.html rename to docs6/docs/_build/html/reference-main-online-help.html diff --git a/docs6b/docs/_build/html/reference-main-overview.html b/docs6/docs/_build/html/reference-main-overview.html similarity index 100% rename from docs6b/docs/_build/html/reference-main-overview.html rename to docs6/docs/_build/html/reference-main-overview.html diff --git a/docs6b/docs/_build/html/reference-main-regular-expressions.html b/docs6/docs/_build/html/reference-main-regular-expressions.html similarity index 100% rename from docs6b/docs/_build/html/reference-main-regular-expressions.html rename to docs6/docs/_build/html/reference-main-regular-expressions.html diff --git a/docs6b/docs/_build/html/reference-main-then-chaining.html b/docs6/docs/_build/html/reference-main-then-chaining.html similarity index 100% rename from docs6b/docs/_build/html/reference-main-then-chaining.html rename to docs6/docs/_build/html/reference-main-then-chaining.html diff --git a/docs6b/docs/_build/html/reference-verbs.html b/docs6/docs/_build/html/reference-verbs.html similarity index 100% rename from docs6b/docs/_build/html/reference-verbs.html rename to docs6/docs/_build/html/reference-verbs.html diff --git a/docs6b/docs/_build/html/reference.html b/docs6/docs/_build/html/reference.html similarity index 100% rename from docs6b/docs/_build/html/reference.html rename to docs6/docs/_build/html/reference.html diff --git a/docs6b/docs/_build/html/release-docs.html b/docs6/docs/_build/html/release-docs.html similarity index 100% rename from docs6b/docs/_build/html/release-docs.html rename to docs6/docs/_build/html/release-docs.html diff --git a/docs6b/docs/_build/html/repl.html b/docs6/docs/_build/html/repl.html similarity index 100% rename from docs6b/docs/_build/html/repl.html rename to docs6/docs/_build/html/repl.html diff --git a/docs6/sample_mlrrc b/docs6/docs/_build/html/sample_mlrrc similarity index 100% rename from docs6/sample_mlrrc rename to docs6/docs/_build/html/sample_mlrrc diff --git a/docs6b/docs/_build/html/search.html b/docs6/docs/_build/html/search.html similarity index 100% rename from docs6b/docs/_build/html/search.html rename to docs6/docs/_build/html/search.html diff --git a/docs6b/docs/_build/html/searchindex.js b/docs6/docs/_build/html/searchindex.js similarity index 100% rename from docs6b/docs/_build/html/searchindex.js rename to docs6/docs/_build/html/searchindex.js diff --git a/docs6b/docs/_build/html/shapes-of-data.html b/docs6/docs/_build/html/shapes-of-data.html similarity index 100% rename from docs6b/docs/_build/html/shapes-of-data.html rename to docs6/docs/_build/html/shapes-of-data.html diff --git a/docs6b/docs/_build/html/shell-commands.html b/docs6/docs/_build/html/shell-commands.html similarity index 100% rename from docs6b/docs/_build/html/shell-commands.html rename to docs6/docs/_build/html/shell-commands.html diff --git a/docs6b/docs/_build/html/special-symbols-and-formatting.html b/docs6/docs/_build/html/special-symbols-and-formatting.html similarity index 100% rename from docs6b/docs/_build/html/special-symbols-and-formatting.html rename to docs6/docs/_build/html/special-symbols-and-formatting.html diff --git a/docs6b/docs/_build/html/sql-examples.html b/docs6/docs/_build/html/sql-examples.html similarity index 100% rename from docs6b/docs/_build/html/sql-examples.html rename to docs6/docs/_build/html/sql-examples.html diff --git a/docs6/square.csv b/docs6/docs/_build/html/square.csv similarity index 100% rename from docs6/square.csv rename to docs6/docs/_build/html/square.csv diff --git a/docs6b/docs/_build/html/statistics-examples.html b/docs6/docs/_build/html/statistics-examples.html similarity index 100% rename from docs6b/docs/_build/html/statistics-examples.html rename to docs6/docs/_build/html/statistics-examples.html diff --git a/docs6b/docs/_build/html/then-chaining.html b/docs6/docs/_build/html/then-chaining.html similarity index 100% rename from docs6b/docs/_build/html/then-chaining.html rename to docs6/docs/_build/html/then-chaining.html diff --git a/docs6/triangle.csv b/docs6/docs/_build/html/triangle.csv similarity index 100% rename from docs6/triangle.csv rename to docs6/docs/_build/html/triangle.csv diff --git a/docs6b/docs/_build/html/two-pass-algorithms.html b/docs6/docs/_build/html/two-pass-algorithms.html similarity index 100% rename from docs6b/docs/_build/html/two-pass-algorithms.html rename to docs6/docs/_build/html/two-pass-algorithms.html diff --git a/docs6/variance.mlr b/docs6/docs/_build/html/variance.mlr similarity index 100% rename from docs6/variance.mlr rename to docs6/docs/_build/html/variance.mlr diff --git a/docs6/verb-example-ewma.sh b/docs6/docs/_build/html/verb-example-ewma.sh similarity index 100% rename from docs6/verb-example-ewma.sh rename to docs6/docs/_build/html/verb-example-ewma.sh diff --git a/docs6b/docs/_build/html/why.html b/docs6/docs/_build/html/why.html similarity index 100% rename from docs6b/docs/_build/html/why.html rename to docs6/docs/_build/html/why.html diff --git a/docs6b/docs/_build/html/_static/basic.css b/docs6/docs/_static/basic.css similarity index 100% rename from docs6b/docs/_build/html/_static/basic.css rename to docs6/docs/_static/basic.css diff --git a/docs6b/docs/_build/html/_static/classic.css b/docs6/docs/_static/classic.css similarity index 100% rename from docs6b/docs/_build/html/_static/classic.css rename to docs6/docs/_static/classic.css diff --git a/docs6b/docs/_build/html/_static/mlr.jpg b/docs6/docs/_static/mlr.jpg similarity index 100% rename from docs6b/docs/_build/html/_static/mlr.jpg rename to docs6/docs/_static/mlr.jpg diff --git a/docs6b/docs/_build/html/_static/pygments.css b/docs6/docs/_static/pygments.css similarity index 100% rename from docs6b/docs/_build/html/_static/pygments.css rename to docs6/docs/_static/pygments.css diff --git a/docs6b/docs/_build/html/_static/scrolls.css b/docs6/docs/_static/scrolls.css similarity index 100% rename from docs6b/docs/_build/html/_static/scrolls.css rename to docs6/docs/_static/scrolls.css diff --git a/docs6b/docs/_build/html/_static/top.png b/docs6/docs/_static/top.png similarity index 100% rename from docs6b/docs/_build/html/_static/top.png rename to docs6/docs/_static/top.png diff --git a/docs6/absent-example.json b/docs6/docs/absent-example.json similarity index 100% rename from docs6/absent-example.json rename to docs6/docs/absent-example.json diff --git a/docs6b/docs/build-one b/docs6/docs/build-one similarity index 100% rename from docs6b/docs/build-one rename to docs6/docs/build-one diff --git a/docs6b/docs/build.md b/docs6/docs/build.md similarity index 100% rename from docs6b/docs/build.md rename to docs6/docs/build.md diff --git a/docs6b/docs/build.md.in b/docs6/docs/build.md.in similarity index 100% rename from docs6b/docs/build.md.in rename to docs6/docs/build.md.in diff --git a/docs6b/docs/_build/html/circle.csv b/docs6/docs/circle.csv similarity index 100% rename from docs6b/docs/_build/html/circle.csv rename to docs6/docs/circle.csv diff --git a/docs6b/docs/_build/html/commas.csv b/docs6/docs/commas.csv similarity index 100% rename from docs6b/docs/_build/html/commas.csv rename to docs6/docs/commas.csv diff --git a/docs6b/docs/community.md b/docs6/docs/community.md similarity index 100% rename from docs6b/docs/community.md rename to docs6/docs/community.md diff --git a/docs6b/docs/community.md.in b/docs6/docs/community.md.in similarity index 100% rename from docs6b/docs/community.md.in rename to docs6/docs/community.md.in diff --git a/docs6/context-example.mlr b/docs6/docs/context-example.mlr similarity index 100% rename from docs6/context-example.mlr rename to docs6/docs/context-example.mlr diff --git a/docs6b/docs/contributing.md b/docs6/docs/contributing.md similarity index 100% rename from docs6b/docs/contributing.md rename to docs6/docs/contributing.md diff --git a/docs6b/docs/contributing.md.in b/docs6/docs/contributing.md.in similarity index 100% rename from docs6b/docs/contributing.md.in rename to docs6/docs/contributing.md.in diff --git a/docs6/coverart/cover-cat.png b/docs6/docs/coverart/cover-cat.png similarity index 100% rename from docs6/coverart/cover-cat.png rename to docs6/docs/coverart/cover-cat.png diff --git a/docs6b/docs/_build/html/_images/cover-combined.png b/docs6/docs/coverart/cover-combined.png similarity index 100% rename from docs6b/docs/_build/html/_images/cover-combined.png rename to docs6/docs/coverart/cover-combined.png diff --git a/docs6/coverart/cover-filter-to-json.png b/docs6/docs/coverart/cover-filter-to-json.png similarity index 100% rename from docs6/coverart/cover-filter-to-json.png rename to docs6/docs/coverart/cover-filter-to-json.png diff --git a/docs6/coverart/cover-sort-to-pprint.png b/docs6/docs/coverart/cover-sort-to-pprint.png similarity index 100% rename from docs6/coverart/cover-sort-to-pprint.png rename to docs6/docs/coverart/cover-sort-to-pprint.png diff --git a/docs6/coverart/coverart.key b/docs6/docs/coverart/coverart.key similarity index 100% rename from docs6/coverart/coverart.key rename to docs6/docs/coverart/coverart.key diff --git a/docs6b/docs/csv-with-and-without-headers.md b/docs6/docs/csv-with-and-without-headers.md similarity index 100% rename from docs6b/docs/csv-with-and-without-headers.md rename to docs6/docs/csv-with-and-without-headers.md diff --git a/docs6b/docs/csv-with-and-without-headers.md.in b/docs6/docs/csv-with-and-without-headers.md.in similarity index 100% rename from docs6b/docs/csv-with-and-without-headers.md.in rename to docs6/docs/csv-with-and-without-headers.md.in diff --git a/docs6b/docs/customization.md b/docs6/docs/customization.md similarity index 100% rename from docs6b/docs/customization.md rename to docs6/docs/customization.md diff --git a/docs6b/docs/customization.md.in b/docs6/docs/customization.md.in similarity index 100% rename from docs6b/docs/customization.md.in rename to docs6/docs/customization.md.in diff --git a/docs6b/docs/data-cleaning-examples.md b/docs6/docs/data-cleaning-examples.md similarity index 100% rename from docs6b/docs/data-cleaning-examples.md rename to docs6/docs/data-cleaning-examples.md diff --git a/docs6b/docs/data-cleaning-examples.md.in b/docs6/docs/data-cleaning-examples.md.in similarity index 100% rename from docs6b/docs/data-cleaning-examples.md.in rename to docs6/docs/data-cleaning-examples.md.in diff --git a/docs6b/docs/data-diving-examples.md b/docs6/docs/data-diving-examples.md similarity index 100% rename from docs6b/docs/data-diving-examples.md rename to docs6/docs/data-diving-examples.md diff --git a/docs6b/docs/data-diving-examples.md.in b/docs6/docs/data-diving-examples.md.in similarity index 100% rename from docs6b/docs/data-diving-examples.md.in rename to docs6/docs/data-diving-examples.md.in diff --git a/docs6b/docs/_build/html/data/a.csv b/docs6/docs/data/a.csv similarity index 100% rename from docs6b/docs/_build/html/data/a.csv rename to docs6/docs/data/a.csv diff --git a/docs6b/docs/_build/html/data/a.dkvp b/docs6/docs/data/a.dkvp similarity index 100% rename from docs6b/docs/_build/html/data/a.dkvp rename to docs6/docs/data/a.dkvp diff --git a/docs6b/docs/_build/html/data/array-example.json b/docs6/docs/data/array-example.json similarity index 100% rename from docs6b/docs/_build/html/data/array-example.json rename to docs6/docs/data/array-example.json diff --git a/docs6b/docs/_build/html/data/b.csv b/docs6/docs/data/b.csv similarity index 100% rename from docs6b/docs/_build/html/data/b.csv rename to docs6/docs/data/b.csv diff --git a/docs6b/docs/_build/html/data/b.dkvp b/docs6/docs/data/b.dkvp similarity index 100% rename from docs6b/docs/_build/html/data/b.dkvp rename to docs6/docs/data/b.dkvp diff --git a/docs6b/docs/data/begin-end-example-1.sh b/docs6/docs/data/begin-end-example-1.sh similarity index 100% rename from docs6b/docs/data/begin-end-example-1.sh rename to docs6/docs/data/begin-end-example-1.sh diff --git a/docs6b/docs/data/begin-end-example-2.sh b/docs6/docs/data/begin-end-example-2.sh similarity index 100% rename from docs6b/docs/data/begin-end-example-2.sh rename to docs6/docs/data/begin-end-example-2.sh diff --git a/docs6b/docs/data/begin-end-example-3.sh b/docs6/docs/data/begin-end-example-3.sh similarity index 100% rename from docs6b/docs/data/begin-end-example-3.sh rename to docs6/docs/data/begin-end-example-3.sh diff --git a/docs6b/docs/data/begin-end-example-4.sh b/docs6/docs/data/begin-end-example-4.sh similarity index 100% rename from docs6b/docs/data/begin-end-example-4.sh rename to docs6/docs/data/begin-end-example-4.sh diff --git a/docs6b/docs/data/begin-end-example-5.sh b/docs6/docs/data/begin-end-example-5.sh similarity index 100% rename from docs6b/docs/data/begin-end-example-5.sh rename to docs6/docs/data/begin-end-example-5.sh diff --git a/docs6b/docs/data/begin-end-example-6.sh b/docs6/docs/data/begin-end-example-6.sh similarity index 100% rename from docs6b/docs/data/begin-end-example-6.sh rename to docs6/docs/data/begin-end-example-6.sh diff --git a/docs6b/docs/_build/html/data/begin-end-example-6a.sh b/docs6/docs/data/begin-end-example-6a.sh similarity index 100% rename from docs6b/docs/_build/html/data/begin-end-example-6a.sh rename to docs6/docs/data/begin-end-example-6a.sh diff --git a/docs6b/docs/data/begin-end-example-7.sh b/docs6/docs/data/begin-end-example-7.sh similarity index 100% rename from docs6b/docs/data/begin-end-example-7.sh rename to docs6/docs/data/begin-end-example-7.sh diff --git a/docs6b/docs/_build/html/data/begin-end-example-7b.sh b/docs6/docs/data/begin-end-example-7b.sh similarity index 100% rename from docs6b/docs/_build/html/data/begin-end-example-7b.sh rename to docs6/docs/data/begin-end-example-7b.sh diff --git a/docs6b/docs/_build/html/data/begin-end-example-8.sh b/docs6/docs/data/begin-end-example-8.sh similarity index 100% rename from docs6b/docs/_build/html/data/begin-end-example-8.sh rename to docs6/docs/data/begin-end-example-8.sh diff --git a/docs6b/docs/_build/html/data/budget.csv b/docs6/docs/data/budget.csv similarity index 100% rename from docs6b/docs/_build/html/data/budget.csv rename to docs6/docs/data/budget.csv diff --git a/docs6b/docs/_build/html/data/bulk-rename-for-loop.mlr b/docs6/docs/data/bulk-rename-for-loop.mlr similarity index 100% rename from docs6b/docs/_build/html/data/bulk-rename-for-loop.mlr rename to docs6/docs/data/bulk-rename-for-loop.mlr diff --git a/docs6b/docs/_build/html/data/clean-whitespace.csv b/docs6/docs/data/clean-whitespace.csv similarity index 100% rename from docs6b/docs/_build/html/data/clean-whitespace.csv rename to docs6/docs/data/clean-whitespace.csv diff --git a/docs6b/docs/_build/html/data/color-codes.csv b/docs6/docs/data/color-codes.csv similarity index 100% rename from docs6b/docs/_build/html/data/color-codes.csv rename to docs6/docs/data/color-codes.csv diff --git a/docs6b/docs/_build/html/data/color-names.csv b/docs6/docs/data/color-names.csv similarity index 100% rename from docs6b/docs/_build/html/data/color-names.csv rename to docs6/docs/data/color-names.csv diff --git a/docs6b/docs/_build/html/data/colored-shapes.csv b/docs6/docs/data/colored-shapes.csv similarity index 100% rename from docs6b/docs/_build/html/data/colored-shapes.csv rename to docs6/docs/data/colored-shapes.csv diff --git a/docs6b/docs/_build/html/data/colored-shapes.dkvp b/docs6/docs/data/colored-shapes.dkvp similarity index 100% rename from docs6b/docs/_build/html/data/colored-shapes.dkvp rename to docs6/docs/data/colored-shapes.dkvp diff --git a/docs6b/docs/_build/html/data/colours.csv b/docs6/docs/data/colours.csv similarity index 100% rename from docs6b/docs/_build/html/data/colours.csv rename to docs6/docs/data/colours.csv diff --git a/docs6b/docs/_build/html/data/current_counters.csv b/docs6/docs/data/current_counters.csv similarity index 100% rename from docs6b/docs/_build/html/data/current_counters.csv rename to docs6/docs/data/current_counters.csv diff --git a/docs6b/docs/_build/html/data/currtemp.csv b/docs6/docs/data/currtemp.csv similarity index 100% rename from docs6b/docs/_build/html/data/currtemp.csv rename to docs6/docs/data/currtemp.csv diff --git a/docs6b/docs/_build/html/data/dollar-sign.txt b/docs6/docs/data/dollar-sign.txt similarity index 100% rename from docs6b/docs/_build/html/data/dollar-sign.txt rename to docs6/docs/data/dollar-sign.txt diff --git a/docs6b/docs/_build/html/data/dynamic-nr.sh b/docs6/docs/data/dynamic-nr.sh similarity index 100% rename from docs6b/docs/_build/html/data/dynamic-nr.sh rename to docs6/docs/data/dynamic-nr.sh diff --git a/docs6b/docs/_build/html/data/emit-lashed.sh b/docs6/docs/data/emit-lashed.sh similarity index 100% rename from docs6b/docs/_build/html/data/emit-lashed.sh rename to docs6/docs/data/emit-lashed.sh diff --git a/docs6b/docs/_build/html/data/english-words.txt b/docs6/docs/data/english-words.txt similarity index 100% rename from docs6b/docs/_build/html/data/english-words.txt rename to docs6/docs/data/english-words.txt diff --git a/docs6b/docs/_build/html/data/factorial-example.sh b/docs6/docs/data/factorial-example.sh similarity index 100% rename from docs6b/docs/_build/html/data/factorial-example.sh rename to docs6/docs/data/factorial-example.sh diff --git a/docs6b/docs/_build/html/data/fe-example-1.sh b/docs6/docs/data/fe-example-1.sh similarity index 100% rename from docs6b/docs/_build/html/data/fe-example-1.sh rename to docs6/docs/data/fe-example-1.sh diff --git a/docs6b/docs/_build/html/data/fe-example-2.sh b/docs6/docs/data/fe-example-2.sh similarity index 100% rename from docs6b/docs/_build/html/data/fe-example-2.sh rename to docs6/docs/data/fe-example-2.sh diff --git a/docs6b/docs/_build/html/data/fe-example-3.mlr b/docs6/docs/data/fe-example-3.mlr similarity index 100% rename from docs6b/docs/_build/html/data/fe-example-3.mlr rename to docs6/docs/data/fe-example-3.mlr diff --git a/docs6b/docs/_build/html/data/fe-example-4.mlr b/docs6/docs/data/fe-example-4.mlr similarity index 100% rename from docs6b/docs/_build/html/data/fe-example-4.mlr rename to docs6/docs/data/fe-example-4.mlr diff --git a/docs6b/docs/_build/html/data/feature-count.mlr b/docs6/docs/data/feature-count.mlr similarity index 100% rename from docs6b/docs/_build/html/data/feature-count.mlr rename to docs6/docs/data/feature-count.mlr diff --git a/docs6b/docs/_build/html/data/features.json b/docs6/docs/data/features.json similarity index 100% rename from docs6b/docs/_build/html/data/features.json rename to docs6/docs/data/features.json diff --git a/docs6b/docs/_build/html/data/fibo-cached.sh b/docs6/docs/data/fibo-cached.sh similarity index 100% rename from docs6b/docs/_build/html/data/fibo-cached.sh rename to docs6/docs/data/fibo-cached.sh diff --git a/docs6b/docs/_build/html/data/fibo-uncached.sh b/docs6/docs/data/fibo-uncached.sh similarity index 100% rename from docs6b/docs/_build/html/data/fibo-uncached.sh rename to docs6/docs/data/fibo-uncached.sh diff --git a/docs6b/docs/_build/html/data/fill-down.csv b/docs6/docs/data/fill-down.csv similarity index 100% rename from docs6b/docs/_build/html/data/fill-down.csv rename to docs6/docs/data/fill-down.csv diff --git a/docs6b/docs/_build/html/data/filter-multiline-example.txt b/docs6/docs/data/filter-multiline-example.txt similarity index 100% rename from docs6b/docs/_build/html/data/filter-multiline-example.txt rename to docs6/docs/data/filter-multiline-example.txt diff --git a/docs6b/docs/_build/html/data/flins.csv b/docs6/docs/data/flins.csv similarity index 100% rename from docs6b/docs/_build/html/data/flins.csv rename to docs6/docs/data/flins.csv diff --git a/docs6b/docs/_build/html/data/flins.json b/docs6/docs/data/flins.json similarity index 100% rename from docs6b/docs/_build/html/data/flins.json rename to docs6/docs/data/flins.json diff --git a/docs6b/docs/_build/html/data/for-oosvar-example-0a.txt b/docs6/docs/data/for-oosvar-example-0a.txt similarity index 100% rename from docs6b/docs/_build/html/data/for-oosvar-example-0a.txt rename to docs6/docs/data/for-oosvar-example-0a.txt diff --git a/docs6b/docs/_build/html/data/for-oosvar-example-0b.sh b/docs6/docs/data/for-oosvar-example-0b.sh similarity index 100% rename from docs6b/docs/_build/html/data/for-oosvar-example-0b.sh rename to docs6/docs/data/for-oosvar-example-0b.sh diff --git a/docs6b/docs/_build/html/data/for-oosvar-example-0c.sh b/docs6/docs/data/for-oosvar-example-0c.sh similarity index 100% rename from docs6b/docs/_build/html/data/for-oosvar-example-0c.sh rename to docs6/docs/data/for-oosvar-example-0c.sh diff --git a/docs6b/docs/_build/html/data/for-oosvar-example-0d.sh b/docs6/docs/data/for-oosvar-example-0d.sh similarity index 100% rename from docs6b/docs/_build/html/data/for-oosvar-example-0d.sh rename to docs6/docs/data/for-oosvar-example-0d.sh diff --git a/docs6b/docs/_build/html/data/for-oosvar-example-0e.sh b/docs6/docs/data/for-oosvar-example-0e.sh similarity index 100% rename from docs6b/docs/_build/html/data/for-oosvar-example-0e.sh rename to docs6/docs/data/for-oosvar-example-0e.sh diff --git a/docs6b/docs/_build/html/data/for-srec-example-1.sh b/docs6/docs/data/for-srec-example-1.sh similarity index 100% rename from docs6b/docs/_build/html/data/for-srec-example-1.sh rename to docs6/docs/data/for-srec-example-1.sh diff --git a/docs6b/docs/_build/html/data/for-srec-example-2.sh b/docs6/docs/data/for-srec-example-2.sh similarity index 100% rename from docs6b/docs/_build/html/data/for-srec-example-2.sh rename to docs6/docs/data/for-srec-example-2.sh diff --git a/docs6b/docs/_build/html/data/for-srec-example-3.sh b/docs6/docs/data/for-srec-example-3.sh similarity index 100% rename from docs6b/docs/_build/html/data/for-srec-example-3.sh rename to docs6/docs/data/for-srec-example-3.sh diff --git a/docs6b/docs/_build/html/data/for-srec-example.tbl b/docs6/docs/data/for-srec-example.tbl similarity index 100% rename from docs6b/docs/_build/html/data/for-srec-example.tbl rename to docs6/docs/data/for-srec-example.tbl diff --git a/docs6b/docs/_build/html/data/fraction-example.csv b/docs6/docs/data/fraction-example.csv similarity index 100% rename from docs6b/docs/_build/html/data/fraction-example.csv rename to docs6/docs/data/fraction-example.csv diff --git a/docs6b/docs/_build/html/data/full-reorg.sh b/docs6/docs/data/full-reorg.sh similarity index 100% rename from docs6b/docs/_build/html/data/full-reorg.sh rename to docs6/docs/data/full-reorg.sh diff --git a/docs6b/docs/_build/html/data/headerless.csv b/docs6/docs/data/headerless.csv similarity index 100% rename from docs6b/docs/_build/html/data/headerless.csv rename to docs6/docs/data/headerless.csv diff --git a/docs6b/docs/_build/html/data/het-bool.csv b/docs6/docs/data/het-bool.csv similarity index 100% rename from docs6b/docs/_build/html/data/het-bool.csv rename to docs6/docs/data/het-bool.csv diff --git a/docs6b/docs/_build/html/data/het.csv b/docs6/docs/data/het.csv similarity index 100% rename from docs6b/docs/_build/html/data/het.csv rename to docs6/docs/data/het.csv diff --git a/docs6b/docs/_build/html/data/het.dkvp b/docs6/docs/data/het.dkvp similarity index 100% rename from docs6b/docs/_build/html/data/het.dkvp rename to docs6/docs/data/het.dkvp diff --git a/docs6b/docs/_build/html/data/if-chain.sh b/docs6/docs/data/if-chain.sh similarity index 100% rename from docs6b/docs/_build/html/data/if-chain.sh rename to docs6/docs/data/if-chain.sh diff --git a/docs6b/docs/_build/html/data/inout.csv b/docs6/docs/data/inout.csv similarity index 100% rename from docs6b/docs/_build/html/data/inout.csv rename to docs6/docs/data/inout.csv diff --git a/docs6b/docs/_build/html/data/iqr1.sh b/docs6/docs/data/iqr1.sh similarity index 100% rename from docs6b/docs/_build/html/data/iqr1.sh rename to docs6/docs/data/iqr1.sh diff --git a/docs6b/docs/_build/html/data/iqrn.sh b/docs6/docs/data/iqrn.sh similarity index 100% rename from docs6b/docs/_build/html/data/iqrn.sh rename to docs6/docs/data/iqrn.sh diff --git a/docs6b/docs/_build/html/data/join-left-example.csv b/docs6/docs/data/join-left-example.csv similarity index 100% rename from docs6b/docs/_build/html/data/join-left-example.csv rename to docs6/docs/data/join-left-example.csv diff --git a/docs6b/docs/_build/html/data/join-right-example.csv b/docs6/docs/data/join-right-example.csv similarity index 100% rename from docs6b/docs/_build/html/data/join-right-example.csv rename to docs6/docs/data/join-right-example.csv diff --git a/docs6b/docs/_build/html/data/join-u-left.csv b/docs6/docs/data/join-u-left.csv similarity index 100% rename from docs6b/docs/_build/html/data/join-u-left.csv rename to docs6/docs/data/join-u-left.csv diff --git a/docs6b/docs/_build/html/data/join-u-right.csv b/docs6/docs/data/join-u-right.csv similarity index 100% rename from docs6b/docs/_build/html/data/join-u-right.csv rename to docs6/docs/data/join-u-right.csv diff --git a/docs6b/docs/_build/html/data/json-example-1.json b/docs6/docs/data/json-example-1.json similarity index 100% rename from docs6b/docs/_build/html/data/json-example-1.json rename to docs6/docs/data/json-example-1.json diff --git a/docs6b/docs/_build/html/data/json-example-2.json b/docs6/docs/data/json-example-2.json similarity index 100% rename from docs6b/docs/_build/html/data/json-example-2.json rename to docs6/docs/data/json-example-2.json diff --git a/docs6b/docs/_build/html/data/json-example-3.json b/docs6/docs/data/json-example-3.json similarity index 100% rename from docs6b/docs/_build/html/data/json-example-3.json rename to docs6/docs/data/json-example-3.json diff --git a/docs6b/docs/_build/html/data/keyed-mean-with-oosvars.sh b/docs6/docs/data/keyed-mean-with-oosvars.sh similarity index 100% rename from docs6b/docs/_build/html/data/keyed-mean-with-oosvars.sh rename to docs6/docs/data/keyed-mean-with-oosvars.sh diff --git a/docs6b/docs/_build/html/data/keyed-min-max-with-oosvars.sh b/docs6/docs/data/keyed-min-max-with-oosvars.sh similarity index 100% rename from docs6b/docs/_build/html/data/keyed-min-max-with-oosvars.sh rename to docs6/docs/data/keyed-min-max-with-oosvars.sh diff --git a/docs6b/docs/_build/html/data/label-example.txt b/docs6/docs/data/label-example.txt similarity index 100% rename from docs6b/docs/_build/html/data/label-example.txt rename to docs6/docs/data/label-example.txt diff --git a/docs6b/docs/_build/html/data/linreg-example.jpg b/docs6/docs/data/linreg-example.jpg similarity index 100% rename from docs6b/docs/_build/html/data/linreg-example.jpg rename to docs6/docs/data/linreg-example.jpg diff --git a/docs6b/docs/_build/html/data/linreg-example.txt b/docs6/docs/data/linreg-example.txt similarity index 100% rename from docs6b/docs/_build/html/data/linreg-example.txt rename to docs6/docs/data/linreg-example.txt diff --git a/docs6b/docs/_build/html/data/local-example-1.sh b/docs6/docs/data/local-example-1.sh old mode 100644 new mode 100755 similarity index 100% rename from docs6b/docs/_build/html/data/local-example-1.sh rename to docs6/docs/data/local-example-1.sh diff --git a/docs6b/docs/_build/html/data/map-literal-example-1.sh b/docs6/docs/data/map-literal-example-1.sh old mode 100644 new mode 100755 similarity index 100% rename from docs6b/docs/_build/html/data/map-literal-example-1.sh rename to docs6/docs/data/map-literal-example-1.sh diff --git a/docs6b/docs/_build/html/data/map-literal-example-2.sh b/docs6/docs/data/map-literal-example-2.sh old mode 100644 new mode 100755 similarity index 100% rename from docs6b/docs/_build/html/data/map-literal-example-2.sh rename to docs6/docs/data/map-literal-example-2.sh diff --git a/docs6b/docs/_build/html/data/map-literal-example-3.sh b/docs6/docs/data/map-literal-example-3.sh old mode 100644 new mode 100755 similarity index 100% rename from docs6b/docs/_build/html/data/map-literal-example-3.sh rename to docs6/docs/data/map-literal-example-3.sh diff --git a/docs6b/docs/_build/html/data/maxrows.mlr b/docs6/docs/data/maxrows.mlr similarity index 100% rename from docs6b/docs/_build/html/data/maxrows.mlr rename to docs6/docs/data/maxrows.mlr diff --git a/docs6b/docs/_build/html/data/maxrows.tsv b/docs6/docs/data/maxrows.tsv similarity index 100% rename from docs6b/docs/_build/html/data/maxrows.tsv rename to docs6/docs/data/maxrows.tsv diff --git a/docs6b/docs/_build/html/data/mean-with-oosvars.sh b/docs6/docs/data/mean-with-oosvars.sh similarity index 100% rename from docs6b/docs/_build/html/data/mean-with-oosvars.sh rename to docs6/docs/data/mean-with-oosvars.sh diff --git a/docs6b/docs/_build/html/data/medium b/docs6/docs/data/medium similarity index 100% rename from docs6b/docs/_build/html/data/medium rename to docs6/docs/data/medium diff --git a/docs6b/docs/_build/html/data/medium-squares b/docs6/docs/data/medium-squares similarity index 100% rename from docs6b/docs/_build/html/data/medium-squares rename to docs6/docs/data/medium-squares diff --git a/docs6b/docs/_build/html/data/miss-date-1.sh b/docs6/docs/data/miss-date-1.sh similarity index 100% rename from docs6b/docs/_build/html/data/miss-date-1.sh rename to docs6/docs/data/miss-date-1.sh diff --git a/docs6b/docs/_build/html/data/miss-date-2.sh b/docs6/docs/data/miss-date-2.sh similarity index 100% rename from docs6b/docs/_build/html/data/miss-date-2.sh rename to docs6/docs/data/miss-date-2.sh diff --git a/docs6b/docs/_build/html/data/miss-date.csv b/docs6/docs/data/miss-date.csv similarity index 100% rename from docs6b/docs/_build/html/data/miss-date.csv rename to docs6/docs/data/miss-date.csv diff --git a/docs6b/docs/_build/html/data/mkdat2 b/docs6/docs/data/mkdat2 old mode 100644 new mode 100755 similarity index 100% rename from docs6b/docs/_build/html/data/mkdat2 rename to docs6/docs/data/mkdat2 diff --git a/docs6b/docs/_build/html/data/multicountdown.dat b/docs6/docs/data/multicountdown.dat similarity index 100% rename from docs6b/docs/_build/html/data/multicountdown.dat rename to docs6/docs/data/multicountdown.dat diff --git a/docs6b/docs/_build/html/data/multicountdown.rb b/docs6/docs/data/multicountdown.rb similarity index 100% rename from docs6b/docs/_build/html/data/multicountdown.rb rename to docs6/docs/data/multicountdown.rb diff --git a/docs6b/docs/_build/html/data/mydata.txt b/docs6/docs/data/mydata.txt similarity index 100% rename from docs6b/docs/_build/html/data/mydata.txt rename to docs6/docs/data/mydata.txt diff --git a/docs6b/docs/_build/html/data/nested.tsv b/docs6/docs/data/nested.tsv similarity index 100% rename from docs6b/docs/_build/html/data/nested.tsv rename to docs6/docs/data/nested.tsv diff --git a/docs6b/docs/_build/html/data/newline-example.txt b/docs6/docs/data/newline-example.txt similarity index 100% rename from docs6b/docs/_build/html/data/newline-example.txt rename to docs6/docs/data/newline-example.txt diff --git a/docs6b/docs/_build/html/data/ping-delta-example.txt b/docs6/docs/data/ping-delta-example.txt similarity index 100% rename from docs6b/docs/_build/html/data/ping-delta-example.txt rename to docs6/docs/data/ping-delta-example.txt diff --git a/docs6b/docs/_build/html/data/previous-to-current.sh b/docs6/docs/data/previous-to-current.sh similarity index 100% rename from docs6b/docs/_build/html/data/previous-to-current.sh rename to docs6/docs/data/previous-to-current.sh diff --git a/docs6b/docs/_build/html/data/previous_counters.csv b/docs6/docs/data/previous_counters.csv similarity index 100% rename from docs6b/docs/_build/html/data/previous_counters.csv rename to docs6/docs/data/previous_counters.csv diff --git a/docs6b/docs/_build/html/data/prevtemp.csv b/docs6/docs/data/prevtemp.csv similarity index 100% rename from docs6b/docs/_build/html/data/prevtemp.csv rename to docs6/docs/data/prevtemp.csv diff --git a/docs6b/docs/_build/html/data/put-gating-example-1.dkvp b/docs6/docs/data/put-gating-example-1.dkvp similarity index 100% rename from docs6b/docs/_build/html/data/put-gating-example-1.dkvp rename to docs6/docs/data/put-gating-example-1.dkvp diff --git a/docs6b/docs/_build/html/data/put-gating-example-2.dkvp b/docs6/docs/data/put-gating-example-2.dkvp similarity index 100% rename from docs6b/docs/_build/html/data/put-gating-example-2.dkvp rename to docs6/docs/data/put-gating-example-2.dkvp diff --git a/docs6b/docs/_build/html/data/put-multiline-example.txt b/docs6/docs/data/put-multiline-example.txt similarity index 100% rename from docs6b/docs/_build/html/data/put-multiline-example.txt rename to docs6/docs/data/put-multiline-example.txt diff --git a/docs6b/docs/_build/html/data/question.dat b/docs6/docs/data/question.dat similarity index 100% rename from docs6b/docs/_build/html/data/question.dat rename to docs6/docs/data/question.dat diff --git a/docs6b/docs/_build/html/data/ragged-csv-2.sh b/docs6/docs/data/ragged-csv-2.sh similarity index 100% rename from docs6b/docs/_build/html/data/ragged-csv-2.sh rename to docs6/docs/data/ragged-csv-2.sh diff --git a/docs6b/docs/_build/html/data/ragged-csv.sh b/docs6/docs/data/ragged-csv.sh old mode 100644 new mode 100755 similarity index 100% rename from docs6b/docs/_build/html/data/ragged-csv.sh rename to docs6/docs/data/ragged-csv.sh diff --git a/docs6b/docs/_build/html/data/ragged.csv b/docs6/docs/data/ragged.csv similarity index 100% rename from docs6b/docs/_build/html/data/ragged.csv rename to docs6/docs/data/ragged.csv diff --git a/docs6b/docs/_build/html/data/rect-inner.txt b/docs6/docs/data/rect-inner.txt similarity index 100% rename from docs6b/docs/_build/html/data/rect-inner.txt rename to docs6/docs/data/rect-inner.txt diff --git a/docs6b/docs/_build/html/data/rect-middle.txt b/docs6/docs/data/rect-middle.txt similarity index 100% rename from docs6b/docs/_build/html/data/rect-middle.txt rename to docs6/docs/data/rect-middle.txt diff --git a/docs6b/docs/_build/html/data/rect-outer.txt b/docs6/docs/data/rect-outer.txt similarity index 100% rename from docs6b/docs/_build/html/data/rect-outer.txt rename to docs6/docs/data/rect-outer.txt diff --git a/docs6b/docs/_build/html/data/rect.sh b/docs6/docs/data/rect.sh similarity index 100% rename from docs6b/docs/_build/html/data/rect.sh rename to docs6/docs/data/rect.sh diff --git a/docs6b/docs/_build/html/data/rect.txt b/docs6/docs/data/rect.txt similarity index 100% rename from docs6b/docs/_build/html/data/rect.txt rename to docs6/docs/data/rect.txt diff --git a/docs6b/docs/_build/html/data/regex-in-data.dat b/docs6/docs/data/regex-in-data.dat similarity index 100% rename from docs6b/docs/_build/html/data/regex-in-data.dat rename to docs6/docs/data/regex-in-data.dat diff --git a/docs6b/docs/_build/html/data/remove-empty-columns.csv b/docs6/docs/data/remove-empty-columns.csv similarity index 100% rename from docs6b/docs/_build/html/data/remove-empty-columns.csv rename to docs6/docs/data/remove-empty-columns.csv diff --git a/docs6b/docs/_build/html/data/repeat-example.dat b/docs6/docs/data/repeat-example.dat similarity index 100% rename from docs6b/docs/_build/html/data/repeat-example.dat rename to docs6/docs/data/repeat-example.dat diff --git a/docs6b/docs/_build/html/data/repeats.dkvp b/docs6/docs/data/repeats.dkvp similarity index 100% rename from docs6b/docs/_build/html/data/repeats.dkvp rename to docs6/docs/data/repeats.dkvp diff --git a/docs6b/docs/_build/html/data/sample-example.txt b/docs6/docs/data/sample-example.txt similarity index 100% rename from docs6b/docs/_build/html/data/sample-example.txt rename to docs6/docs/data/sample-example.txt diff --git a/docs6b/docs/_build/html/data/sar.csv b/docs6/docs/data/sar.csv similarity index 100% rename from docs6b/docs/_build/html/data/sar.csv rename to docs6/docs/data/sar.csv diff --git a/docs6b/docs/data/sar.mlr b/docs6/docs/data/sar.mlr similarity index 100% rename from docs6b/docs/data/sar.mlr rename to docs6/docs/data/sar.mlr diff --git a/docs6b/docs/_build/html/data/scan-example-1.tbl b/docs6/docs/data/scan-example-1.tbl similarity index 100% rename from docs6b/docs/_build/html/data/scan-example-1.tbl rename to docs6/docs/data/scan-example-1.tbl diff --git a/docs6b/docs/_build/html/data/scan-example-2.tbl b/docs6/docs/data/scan-example-2.tbl similarity index 100% rename from docs6b/docs/_build/html/data/scan-example-2.tbl rename to docs6/docs/data/scan-example-2.tbl diff --git a/docs6b/docs/_build/html/data/scope-example.dat b/docs6/docs/data/scope-example.dat similarity index 100% rename from docs6b/docs/_build/html/data/scope-example.dat rename to docs6/docs/data/scope-example.dat diff --git a/docs6b/docs/_build/html/data/scope-example.mlr b/docs6/docs/data/scope-example.mlr similarity index 100% rename from docs6b/docs/_build/html/data/scope-example.mlr rename to docs6/docs/data/scope-example.mlr diff --git a/docs6b/docs/_build/html/data/self-join.csv b/docs6/docs/data/self-join.csv similarity index 100% rename from docs6b/docs/_build/html/data/self-join.csv rename to docs6/docs/data/self-join.csv diff --git a/docs6b/docs/_build/html/data/semicolon-example.txt b/docs6/docs/data/semicolon-example.txt similarity index 100% rename from docs6b/docs/_build/html/data/semicolon-example.txt rename to docs6/docs/data/semicolon-example.txt diff --git a/docs6b/docs/_build/html/data/single-for-example-1.sh b/docs6/docs/data/single-for-example-1.sh old mode 100644 new mode 100755 similarity index 100% rename from docs6b/docs/_build/html/data/single-for-example-1.sh rename to docs6/docs/data/single-for-example-1.sh diff --git a/docs6b/docs/_build/html/data/single-for-example-2.sh b/docs6/docs/data/single-for-example-2.sh old mode 100644 new mode 100755 similarity index 100% rename from docs6b/docs/_build/html/data/single-for-example-2.sh rename to docs6/docs/data/single-for-example-2.sh diff --git a/docs6b/docs/_build/html/data/single-quote-example.mlr b/docs6/docs/data/single-quote-example.mlr similarity index 100% rename from docs6b/docs/_build/html/data/single-quote-example.mlr rename to docs6/docs/data/single-quote-example.mlr diff --git a/docs6b/docs/_build/html/data/small b/docs6/docs/data/small similarity index 100% rename from docs6b/docs/_build/html/data/small rename to docs6/docs/data/small diff --git a/docs6b/docs/_build/html/data/small.csv b/docs6/docs/data/small.csv similarity index 100% rename from docs6b/docs/_build/html/data/small.csv rename to docs6/docs/data/small.csv diff --git a/docs6b/docs/_build/html/data/small2 b/docs6/docs/data/small2 similarity index 100% rename from docs6b/docs/_build/html/data/small2 rename to docs6/docs/data/small2 diff --git a/docs6b/docs/_build/html/data/sort-het.dkvp b/docs6/docs/data/sort-het.dkvp similarity index 100% rename from docs6b/docs/_build/html/data/sort-het.dkvp rename to docs6/docs/data/sort-het.dkvp diff --git a/docs6b/docs/_build/html/data/sort-missing.dkvp b/docs6/docs/data/sort-missing.dkvp similarity index 100% rename from docs6b/docs/_build/html/data/sort-missing.dkvp rename to docs6/docs/data/sort-missing.dkvp diff --git a/docs6b/docs/_build/html/data/sort-null.dat b/docs6/docs/data/sort-null.dat similarity index 100% rename from docs6b/docs/_build/html/data/sort-null.dat rename to docs6/docs/data/sort-null.dat diff --git a/docs6b/docs/_build/html/data/sort-within-records.json b/docs6/docs/data/sort-within-records.json similarity index 100% rename from docs6b/docs/_build/html/data/sort-within-records.json rename to docs6/docs/data/sort-within-records.json diff --git a/docs6b/docs/_build/html/data/spaces.csv b/docs6/docs/data/spaces.csv similarity index 100% rename from docs6b/docs/_build/html/data/spaces.csv rename to docs6/docs/data/spaces.csv diff --git a/docs6b/docs/_build/html/data/sparse.json b/docs6/docs/data/sparse.json similarity index 100% rename from docs6b/docs/_build/html/data/sparse.json rename to docs6/docs/data/sparse.json diff --git a/docs6b/docs/_build/html/data/subcommand-example.txt b/docs6/docs/data/subcommand-example.txt similarity index 100% rename from docs6b/docs/_build/html/data/subcommand-example.txt rename to docs6/docs/data/subcommand-example.txt diff --git a/docs6b/docs/_build/html/data/subr-example.sh b/docs6/docs/data/subr-example.sh similarity index 100% rename from docs6b/docs/_build/html/data/subr-example.sh rename to docs6/docs/data/subr-example.sh diff --git a/docs6b/docs/_build/html/data/system-file-ojson-example.txt b/docs6/docs/data/system-file-ojson-example.txt similarity index 100% rename from docs6b/docs/_build/html/data/system-file-ojson-example.txt rename to docs6/docs/data/system-file-ojson-example.txt diff --git a/docs6b/docs/_build/html/data/system-file-opprint-example.txt b/docs6/docs/data/system-file-opprint-example.txt similarity index 100% rename from docs6b/docs/_build/html/data/system-file-opprint-example.txt rename to docs6/docs/data/system-file-opprint-example.txt diff --git a/docs6b/docs/_build/html/data/system-file-oxtab-example.txt b/docs6/docs/data/system-file-oxtab-example.txt similarity index 100% rename from docs6b/docs/_build/html/data/system-file-oxtab-example.txt rename to docs6/docs/data/system-file-oxtab-example.txt diff --git a/docs6b/docs/_build/html/data/then-chaining-performance.txt b/docs6/docs/data/then-chaining-performance.txt similarity index 100% rename from docs6b/docs/_build/html/data/then-chaining-performance.txt rename to docs6/docs/data/then-chaining-performance.txt diff --git a/docs6b/docs/_build/html/data/then-example.csv b/docs6/docs/data/then-example.csv similarity index 100% rename from docs6b/docs/_build/html/data/then-example.csv rename to docs6/docs/data/then-example.csv diff --git a/docs6b/docs/_build/html/data/timing-example.txt b/docs6/docs/data/timing-example.txt similarity index 100% rename from docs6b/docs/_build/html/data/timing-example.txt rename to docs6/docs/data/timing-example.txt diff --git a/docs6b/docs/_build/html/data/trailing-commas.sh b/docs6/docs/data/trailing-commas.sh old mode 100644 new mode 100755 similarity index 100% rename from docs6b/docs/_build/html/data/trailing-commas.sh rename to docs6/docs/data/trailing-commas.sh diff --git a/docs6b/docs/_build/html/data/triple-for-example-1.sh b/docs6/docs/data/triple-for-example-1.sh similarity index 100% rename from docs6b/docs/_build/html/data/triple-for-example-1.sh rename to docs6/docs/data/triple-for-example-1.sh diff --git a/docs6b/docs/_build/html/data/triple-for-example-2.sh b/docs6/docs/data/triple-for-example-2.sh similarity index 100% rename from docs6b/docs/_build/html/data/triple-for-example-2.sh rename to docs6/docs/data/triple-for-example-2.sh diff --git a/docs6b/docs/_build/html/data/trivial-records.csv b/docs6/docs/data/trivial-records.csv similarity index 100% rename from docs6b/docs/_build/html/data/trivial-records.csv rename to docs6/docs/data/trivial-records.csv diff --git a/docs6b/docs/_build/html/data/two-pass-percentage.sh b/docs6/docs/data/two-pass-percentage.sh similarity index 100% rename from docs6b/docs/_build/html/data/two-pass-percentage.sh rename to docs6/docs/data/two-pass-percentage.sh diff --git a/docs6b/docs/_build/html/data/two-pass-record-numbers.sh b/docs6/docs/data/two-pass-record-numbers.sh similarity index 100% rename from docs6b/docs/_build/html/data/two-pass-record-numbers.sh rename to docs6/docs/data/two-pass-record-numbers.sh diff --git a/docs6b/docs/_build/html/data/type-decl-example.mlr b/docs6/docs/data/type-decl-example.mlr similarity index 100% rename from docs6b/docs/_build/html/data/type-decl-example.mlr rename to docs6/docs/data/type-decl-example.mlr diff --git a/docs6b/docs/_build/html/data/unsparsify.mlr b/docs6/docs/data/unsparsify.mlr similarity index 100% rename from docs6b/docs/_build/html/data/unsparsify.mlr rename to docs6/docs/data/unsparsify.mlr diff --git a/docs6b/docs/_build/html/data/weighted-mean.sh b/docs6/docs/data/weighted-mean.sh similarity index 100% rename from docs6b/docs/_build/html/data/weighted-mean.sh rename to docs6/docs/data/weighted-mean.sh diff --git a/docs6b/docs/_build/html/data/while-example-1.sh b/docs6/docs/data/while-example-1.sh similarity index 100% rename from docs6b/docs/_build/html/data/while-example-1.sh rename to docs6/docs/data/while-example-1.sh diff --git a/docs6b/docs/_build/html/data/while-example-2.sh b/docs6/docs/data/while-example-2.sh similarity index 100% rename from docs6b/docs/_build/html/data/while-example-2.sh rename to docs6/docs/data/while-example-2.sh diff --git a/docs6b/docs/dates-and-times.md b/docs6/docs/dates-and-times.md similarity index 100% rename from docs6b/docs/dates-and-times.md rename to docs6/docs/dates-and-times.md diff --git a/docs6b/docs/dates-and-times.md.in b/docs6/docs/dates-and-times.md.in similarity index 100% rename from docs6b/docs/dates-and-times.md.in rename to docs6/docs/dates-and-times.md.in diff --git a/docs6b/docs/_build/html/dates.csv b/docs6/docs/dates.csv similarity index 100% rename from docs6b/docs/_build/html/dates.csv rename to docs6/docs/dates.csv diff --git a/docs6b/docs/dkvp-examples.md b/docs6/docs/dkvp-examples.md similarity index 100% rename from docs6b/docs/dkvp-examples.md rename to docs6/docs/dkvp-examples.md diff --git a/docs6b/docs/dkvp-examples.md.in b/docs6/docs/dkvp-examples.md.in similarity index 100% rename from docs6b/docs/dkvp-examples.md.in rename to docs6/docs/dkvp-examples.md.in diff --git a/docs6b/docs/doc-reorg.txt b/docs6/docs/doc-reorg.txt similarity index 100% rename from docs6b/docs/doc-reorg.txt rename to docs6/docs/doc-reorg.txt diff --git a/docs6/dsl-example-multiline.sh b/docs6/docs/dsl-example-multiline.sh similarity index 100% rename from docs6/dsl-example-multiline.sh rename to docs6/docs/dsl-example-multiline.sh diff --git a/docs6/dsl-example.mlr b/docs6/docs/dsl-example.mlr similarity index 100% rename from docs6/dsl-example.mlr rename to docs6/docs/dsl-example.mlr diff --git a/docs6b/docs/etymology.md b/docs6/docs/etymology.md similarity index 100% rename from docs6b/docs/etymology.md rename to docs6/docs/etymology.md diff --git a/docs6b/docs/etymology.md.in b/docs6/docs/etymology.md.in similarity index 100% rename from docs6b/docs/etymology.md.in rename to docs6/docs/etymology.md.in diff --git a/docs6b/docs/_build/html/example.csv b/docs6/docs/example.csv similarity index 100% rename from docs6b/docs/_build/html/example.csv rename to docs6/docs/example.csv diff --git a/docs6b/docs/expo-sample.sh b/docs6/docs/expo-sample.sh similarity index 100% rename from docs6b/docs/expo-sample.sh rename to docs6/docs/expo-sample.sh diff --git a/docs6b/docs/extra.css b/docs6/docs/extra.css similarity index 100% rename from docs6b/docs/extra.css rename to docs6/docs/extra.css diff --git a/docs6/factorial-example.mlr b/docs6/docs/factorial-example.mlr similarity index 100% rename from docs6/factorial-example.mlr rename to docs6/docs/factorial-example.mlr diff --git a/docs6b/docs/feature-comparison.md b/docs6/docs/feature-comparison.md similarity index 100% rename from docs6b/docs/feature-comparison.md rename to docs6/docs/feature-comparison.md diff --git a/docs6b/docs/feature-comparison.md.in b/docs6/docs/feature-comparison.md.in similarity index 100% rename from docs6b/docs/feature-comparison.md.in rename to docs6/docs/feature-comparison.md.in diff --git a/docs6b/docs/features.md b/docs6/docs/features.md similarity index 100% rename from docs6b/docs/features.md rename to docs6/docs/features.md diff --git a/docs6b/docs/features.md.in b/docs6/docs/features.md.in similarity index 100% rename from docs6b/docs/features.md.in rename to docs6/docs/features.md.in diff --git a/docs6b/docs/file-formats.md b/docs6/docs/file-formats.md similarity index 100% rename from docs6b/docs/file-formats.md rename to docs6/docs/file-formats.md diff --git a/docs6b/docs/file-formats.md.in b/docs6/docs/file-formats.md.in similarity index 100% rename from docs6b/docs/file-formats.md.in rename to docs6/docs/file-formats.md.in diff --git a/docs6/for-example.mlr b/docs6/docs/for-example.mlr similarity index 100% rename from docs6/for-example.mlr rename to docs6/docs/for-example.mlr diff --git a/docs6b/docs/genmd-filter b/docs6/docs/genmd-filter similarity index 100% rename from docs6b/docs/genmd-filter rename to docs6/docs/genmd-filter diff --git a/docs6b/docs/genmds b/docs6/docs/genmds similarity index 100% rename from docs6b/docs/genmds rename to docs6/docs/genmds diff --git a/docs6/h1foo b/docs6/docs/h1foo similarity index 100% rename from docs6/h1foo rename to docs6/docs/h1foo diff --git a/docs6/h2foo b/docs6/docs/h2foo similarity index 100% rename from docs6/h2foo rename to docs6/docs/h2foo diff --git a/docs6/h3foo b/docs6/docs/h3foo similarity index 100% rename from docs6/h3foo rename to docs6/docs/h3foo diff --git a/docs6/if-example.mlr b/docs6/docs/if-example.mlr similarity index 100% rename from docs6/if-example.mlr rename to docs6/docs/if-example.mlr diff --git a/docs6b/docs/index.md b/docs6/docs/index.md similarity index 100% rename from docs6b/docs/index.md rename to docs6/docs/index.md diff --git a/docs6b/docs/index.md.in b/docs6/docs/index.md.in similarity index 100% rename from docs6b/docs/index.md.in rename to docs6/docs/index.md.in diff --git a/docs6b/docs/installation.md b/docs6/docs/installation.md similarity index 100% rename from docs6b/docs/installation.md rename to docs6/docs/installation.md diff --git a/docs6b/docs/installation.md.in b/docs6/docs/installation.md.in similarity index 100% rename from docs6b/docs/installation.md.in rename to docs6/docs/installation.md.in diff --git a/docs6b/docs/internationalization.md b/docs6/docs/internationalization.md similarity index 100% rename from docs6b/docs/internationalization.md rename to docs6/docs/internationalization.md diff --git a/docs6b/docs/internationalization.md.in b/docs6/docs/internationalization.md.in similarity index 100% rename from docs6b/docs/internationalization.md.in rename to docs6/docs/internationalization.md.in diff --git a/docs6b/docs/joins.md b/docs6/docs/joins.md similarity index 100% rename from docs6b/docs/joins.md rename to docs6/docs/joins.md diff --git a/docs6b/docs/joins.md.in b/docs6/docs/joins.md.in similarity index 100% rename from docs6b/docs/joins.md.in rename to docs6/docs/joins.md.in diff --git a/docs6b/docs/keystroke-savers.md b/docs6/docs/keystroke-savers.md similarity index 100% rename from docs6b/docs/keystroke-savers.md rename to docs6/docs/keystroke-savers.md diff --git a/docs6b/docs/keystroke-savers.md.in b/docs6/docs/keystroke-savers.md.in similarity index 100% rename from docs6b/docs/keystroke-savers.md.in rename to docs6/docs/keystroke-savers.md.in diff --git a/docs6/link.txt b/docs6/docs/link.txt similarity index 100% rename from docs6/link.txt rename to docs6/docs/link.txt diff --git a/docs6b/docs/log-processing-examples.md b/docs6/docs/log-processing-examples.md similarity index 100% rename from docs6b/docs/log-processing-examples.md rename to docs6/docs/log-processing-examples.md diff --git a/docs6b/docs/log-processing-examples.md.in b/docs6/docs/log-processing-examples.md.in similarity index 100% rename from docs6b/docs/log-processing-examples.md.in rename to docs6/docs/log-processing-examples.md.in diff --git a/docs6b/docs/_build/html/log.txt b/docs6/docs/log.txt similarity index 100% rename from docs6b/docs/_build/html/log.txt rename to docs6/docs/log.txt diff --git a/docs6b/docs/_build/html/make.bat b/docs6/docs/make.bat similarity index 100% rename from docs6b/docs/_build/html/make.bat rename to docs6/docs/make.bat diff --git a/docs6b/docs/manpage.md b/docs6/docs/manpage.md similarity index 100% rename from docs6b/docs/manpage.md rename to docs6/docs/manpage.md diff --git a/docs6b/docs/manpage.md.in b/docs6/docs/manpage.md.in similarity index 100% rename from docs6b/docs/manpage.md.in rename to docs6/docs/manpage.md.in diff --git a/docs6b/docs/_build/html/manpage.txt b/docs6/docs/manpage.txt similarity index 100% rename from docs6b/docs/_build/html/manpage.txt rename to docs6/docs/manpage.txt diff --git a/docs6b/docs/miller-on-windows.md b/docs6/docs/miller-on-windows.md similarity index 100% rename from docs6b/docs/miller-on-windows.md rename to docs6/docs/miller-on-windows.md diff --git a/docs6b/docs/miller-on-windows.md.in b/docs6/docs/miller-on-windows.md.in similarity index 100% rename from docs6b/docs/miller-on-windows.md.in rename to docs6/docs/miller-on-windows.md.in diff --git a/docs6b/docs/misc-examples.md b/docs6/docs/misc-examples.md similarity index 100% rename from docs6b/docs/misc-examples.md rename to docs6/docs/misc-examples.md diff --git a/docs6b/docs/misc-examples.md.in b/docs6/docs/misc-examples.md.in similarity index 100% rename from docs6b/docs/misc-examples.md.in rename to docs6/docs/misc-examples.md.in diff --git a/docs6b/docs/mk-func-h2s.sh b/docs6/docs/mk-func-h2s.sh similarity index 100% rename from docs6b/docs/mk-func-h2s.sh rename to docs6/docs/mk-func-h2s.sh diff --git a/docs6/mk-func-table.rb b/docs6/docs/mk-func-table.rb similarity index 100% rename from docs6/mk-func-table.rb rename to docs6/docs/mk-func-table.rb diff --git a/docs6/mlr.1 b/docs6/docs/mlr.1 similarity index 100% rename from docs6/mlr.1 rename to docs6/docs/mlr.1 diff --git a/docs6b/docs/morph b/docs6/docs/morph similarity index 100% rename from docs6b/docs/morph rename to docs6/docs/morph diff --git a/docs6b/docs/morphs b/docs6/docs/morphs similarity index 100% rename from docs6b/docs/morphs rename to docs6/docs/morphs diff --git a/docs6b/docs/_build/html/multi-join/input.csv b/docs6/docs/multi-join/input.csv similarity index 100% rename from docs6b/docs/_build/html/multi-join/input.csv rename to docs6/docs/multi-join/input.csv diff --git a/docs6b/docs/_build/html/multi-join/name-lookup.csv b/docs6/docs/multi-join/name-lookup.csv similarity index 100% rename from docs6b/docs/_build/html/multi-join/name-lookup.csv rename to docs6/docs/multi-join/name-lookup.csv diff --git a/docs6b/docs/_build/html/multi-join/status-lookup.csv b/docs6/docs/multi-join/status-lookup.csv similarity index 100% rename from docs6b/docs/_build/html/multi-join/status-lookup.csv rename to docs6/docs/multi-join/status-lookup.csv diff --git a/docs6b/docs/new-in-miller-6.md b/docs6/docs/new-in-miller-6.md similarity index 100% rename from docs6b/docs/new-in-miller-6.md rename to docs6/docs/new-in-miller-6.md diff --git a/docs6b/docs/new-in-miller-6.md.in b/docs6/docs/new-in-miller-6.md.in similarity index 100% rename from docs6b/docs/new-in-miller-6.md.in rename to docs6/docs/new-in-miller-6.md.in diff --git a/docs6b/docs/_build/html/ngrams/gsl-2000.txt b/docs6/docs/ngrams/gsl-2000.txt similarity index 100% rename from docs6b/docs/_build/html/ngrams/gsl-2000.txt rename to docs6/docs/ngrams/gsl-2000.txt diff --git a/docs6b/docs/_build/html/ngrams/mkv.mlr b/docs6/docs/ngrams/mkv.mlr old mode 100644 new mode 100755 similarity index 100% rename from docs6b/docs/_build/html/ngrams/mkv.mlr rename to docs6/docs/ngrams/mkv.mlr diff --git a/docs6b/docs/_build/html/ngrams/mkv3.mlr b/docs6/docs/ngrams/mkv3.mlr old mode 100644 new mode 100755 similarity index 100% rename from docs6b/docs/_build/html/ngrams/mkv3.mlr rename to docs6/docs/ngrams/mkv3.mlr diff --git a/docs6b/docs/_build/html/ngrams/mkv4.mlr b/docs6/docs/ngrams/mkv4.mlr old mode 100644 new mode 100755 similarity index 100% rename from docs6b/docs/_build/html/ngrams/mkv4.mlr rename to docs6/docs/ngrams/mkv4.mlr diff --git a/docs6b/docs/_build/html/ngrams/mkv5.mlr b/docs6/docs/ngrams/mkv5.mlr old mode 100644 new mode 100755 similarity index 100% rename from docs6b/docs/_build/html/ngrams/mkv5.mlr rename to docs6/docs/ngrams/mkv5.mlr diff --git a/docs6b/docs/_build/html/ngrams/ng1 b/docs6/docs/ngrams/ng1 old mode 100644 new mode 100755 similarity index 100% rename from docs6b/docs/_build/html/ngrams/ng1 rename to docs6/docs/ngrams/ng1 diff --git a/docs6b/docs/_build/html/ngrams/ng1.mlr b/docs6/docs/ngrams/ng1.mlr old mode 100644 new mode 100755 similarity index 100% rename from docs6b/docs/_build/html/ngrams/ng1.mlr rename to docs6/docs/ngrams/ng1.mlr diff --git a/docs6b/docs/_build/html/ngrams/ng1.mlr.txt b/docs6/docs/ngrams/ng1.mlr.txt old mode 100644 new mode 100755 similarity index 100% rename from docs6b/docs/_build/html/ngrams/ng1.mlr.txt rename to docs6/docs/ngrams/ng1.mlr.txt diff --git a/docs6b/docs/_build/html/ngrams/ng2 b/docs6/docs/ngrams/ng2 old mode 100644 new mode 100755 similarity index 100% rename from docs6b/docs/_build/html/ngrams/ng2 rename to docs6/docs/ngrams/ng2 diff --git a/docs6b/docs/_build/html/ngrams/ng2.mlr b/docs6/docs/ngrams/ng2.mlr old mode 100644 new mode 100755 similarity index 100% rename from docs6b/docs/_build/html/ngrams/ng2.mlr rename to docs6/docs/ngrams/ng2.mlr diff --git a/docs6b/docs/_build/html/ngrams/ng2.mlr.txt b/docs6/docs/ngrams/ng2.mlr.txt old mode 100644 new mode 100755 similarity index 100% rename from docs6b/docs/_build/html/ngrams/ng2.mlr.txt rename to docs6/docs/ngrams/ng2.mlr.txt diff --git a/docs6b/docs/_build/html/ngrams/ng3 b/docs6/docs/ngrams/ng3 old mode 100644 new mode 100755 similarity index 100% rename from docs6b/docs/_build/html/ngrams/ng3 rename to docs6/docs/ngrams/ng3 diff --git a/docs6b/docs/_build/html/ngrams/ng3.mlr b/docs6/docs/ngrams/ng3.mlr old mode 100644 new mode 100755 similarity index 100% rename from docs6b/docs/_build/html/ngrams/ng3.mlr rename to docs6/docs/ngrams/ng3.mlr diff --git a/docs6b/docs/_build/html/ngrams/ng3.mlr.txt b/docs6/docs/ngrams/ng3.mlr.txt old mode 100644 new mode 100755 similarity index 100% rename from docs6b/docs/_build/html/ngrams/ng3.mlr.txt rename to docs6/docs/ngrams/ng3.mlr.txt diff --git a/docs6b/docs/_build/html/ngrams/ng4 b/docs6/docs/ngrams/ng4 old mode 100644 new mode 100755 similarity index 100% rename from docs6b/docs/_build/html/ngrams/ng4 rename to docs6/docs/ngrams/ng4 diff --git a/docs6b/docs/_build/html/ngrams/ng4.mlr b/docs6/docs/ngrams/ng4.mlr old mode 100644 new mode 100755 similarity index 100% rename from docs6b/docs/_build/html/ngrams/ng4.mlr rename to docs6/docs/ngrams/ng4.mlr diff --git a/docs6b/docs/_build/html/ngrams/ng4.mlr.txt b/docs6/docs/ngrams/ng4.mlr.txt old mode 100644 new mode 100755 similarity index 100% rename from docs6b/docs/_build/html/ngrams/ng4.mlr.txt rename to docs6/docs/ngrams/ng4.mlr.txt diff --git a/docs6b/docs/_build/html/ngrams/ng5 b/docs6/docs/ngrams/ng5 old mode 100644 new mode 100755 similarity index 100% rename from docs6b/docs/_build/html/ngrams/ng5 rename to docs6/docs/ngrams/ng5 diff --git a/docs6b/docs/_build/html/ngrams/ng5.mlr b/docs6/docs/ngrams/ng5.mlr old mode 100644 new mode 100755 similarity index 100% rename from docs6b/docs/_build/html/ngrams/ng5.mlr rename to docs6/docs/ngrams/ng5.mlr diff --git a/docs6b/docs/_build/html/ngrams/ng5.mlr.txt b/docs6/docs/ngrams/ng5.mlr.txt old mode 100644 new mode 100755 similarity index 100% rename from docs6b/docs/_build/html/ngrams/ng5.mlr.txt rename to docs6/docs/ngrams/ng5.mlr.txt diff --git a/docs6b/docs/_build/html/ngrams/ngfuncs.mlr b/docs6/docs/ngrams/ngfuncs.mlr similarity index 100% rename from docs6b/docs/_build/html/ngrams/ngfuncs.mlr rename to docs6/docs/ngrams/ngfuncs.mlr diff --git a/docs6b/docs/_build/html/ngrams/ngfuncs.mlr.txt b/docs6/docs/ngrams/ngfuncs.mlr.txt similarity index 100% rename from docs6b/docs/_build/html/ngrams/ngfuncs.mlr.txt rename to docs6/docs/ngrams/ngfuncs.mlr.txt diff --git a/docs6b/docs/_build/html/oosvar-example-ewma.sh b/docs6/docs/oosvar-example-ewma.sh similarity index 100% rename from docs6b/docs/_build/html/oosvar-example-ewma.sh rename to docs6/docs/oosvar-example-ewma.sh diff --git a/docs6b/docs/_build/html/oosvar-example-sum-grouped.sh b/docs6/docs/oosvar-example-sum-grouped.sh similarity index 100% rename from docs6b/docs/_build/html/oosvar-example-sum-grouped.sh rename to docs6/docs/oosvar-example-sum-grouped.sh diff --git a/docs6b/docs/_build/html/oosvar-example-sum.sh b/docs6/docs/oosvar-example-sum.sh similarity index 100% rename from docs6b/docs/_build/html/oosvar-example-sum.sh rename to docs6/docs/oosvar-example-sum.sh diff --git a/docs6b/docs/operating-on-all-fields.md b/docs6/docs/operating-on-all-fields.md similarity index 100% rename from docs6b/docs/operating-on-all-fields.md rename to docs6/docs/operating-on-all-fields.md diff --git a/docs6b/docs/operating-on-all-fields.md.in b/docs6/docs/operating-on-all-fields.md.in similarity index 100% rename from docs6b/docs/operating-on-all-fields.md.in rename to docs6/docs/operating-on-all-fields.md.in diff --git a/docs6b/docs/originality.md b/docs6/docs/originality.md similarity index 100% rename from docs6b/docs/originality.md rename to docs6/docs/originality.md diff --git a/docs6b/docs/originality.md.in b/docs6/docs/originality.md.in similarity index 100% rename from docs6b/docs/originality.md.in rename to docs6/docs/originality.md.in diff --git a/docs6b/docs/output-colorization.md b/docs6/docs/output-colorization.md similarity index 100% rename from docs6b/docs/output-colorization.md rename to docs6/docs/output-colorization.md diff --git a/docs6b/docs/output-colorization.md.in b/docs6/docs/output-colorization.md.in similarity index 100% rename from docs6b/docs/output-colorization.md.in rename to docs6/docs/output-colorization.md.in diff --git a/docs6b/docs/performance.md b/docs6/docs/performance.md similarity index 100% rename from docs6b/docs/performance.md rename to docs6/docs/performance.md diff --git a/docs6b/docs/performance.md.in b/docs6/docs/performance.md.in similarity index 100% rename from docs6b/docs/performance.md.in rename to docs6/docs/performance.md.in diff --git a/docs6b/docs/_build/html/pix/colorization.png b/docs6/docs/pix/colorization.png similarity index 100% rename from docs6b/docs/_build/html/pix/colorization.png rename to docs6/docs/pix/colorization.png diff --git a/docs6b/docs/_build/html/pix/colorization.png.000 b/docs6/docs/pix/colorization.png.000 similarity index 100% rename from docs6b/docs/_build/html/pix/colorization.png.000 rename to docs6/docs/pix/colorization.png.000 diff --git a/docs6b/docs/_build/html/pix/colorization2.png b/docs6/docs/pix/colorization2.png similarity index 100% rename from docs6b/docs/_build/html/pix/colorization2.png rename to docs6/docs/pix/colorization2.png diff --git a/docs6b/docs/_build/html/pix/colorization2.png.000 b/docs6/docs/pix/colorization2.png.000 similarity index 100% rename from docs6b/docs/_build/html/pix/colorization2.png.000 rename to docs6/docs/pix/colorization2.png.000 diff --git a/docs6b/docs/_build/html/pix/mand.png b/docs6/docs/pix/mand.png similarity index 100% rename from docs6b/docs/_build/html/pix/mand.png rename to docs6/docs/pix/mand.png diff --git a/docs6b/docs/_build/html/pix/miller-msys-complex.png b/docs6/docs/pix/miller-msys-complex.png similarity index 100% rename from docs6b/docs/_build/html/pix/miller-msys-complex.png rename to docs6/docs/pix/miller-msys-complex.png diff --git a/docs6b/docs/_build/html/pix/miller-msys.png b/docs6/docs/pix/miller-msys.png similarity index 100% rename from docs6b/docs/_build/html/pix/miller-msys.png rename to docs6/docs/pix/miller-msys.png diff --git a/docs6b/docs/_build/html/pix/miller-windows-complex-workaround.png b/docs6/docs/pix/miller-windows-complex-workaround.png similarity index 100% rename from docs6b/docs/_build/html/pix/miller-windows-complex-workaround.png rename to docs6/docs/pix/miller-windows-complex-workaround.png diff --git a/docs6b/docs/_build/html/pix/miller-windows-complex.png b/docs6/docs/pix/miller-windows-complex.png similarity index 100% rename from docs6b/docs/_build/html/pix/miller-windows-complex.png rename to docs6/docs/pix/miller-windows-complex.png diff --git a/docs6b/docs/_build/html/pix/miller-windows-triple-double-quote.png b/docs6/docs/pix/miller-windows-triple-double-quote.png similarity index 100% rename from docs6b/docs/_build/html/pix/miller-windows-triple-double-quote.png rename to docs6/docs/pix/miller-windows-triple-double-quote.png diff --git a/docs6b/docs/_build/html/pix/miller-windows.png b/docs6/docs/pix/miller-windows.png similarity index 100% rename from docs6b/docs/_build/html/pix/miller-windows.png rename to docs6/docs/pix/miller-windows.png diff --git a/docs6b/docs/_build/html/pix/mlr-doc-sepia.jpg b/docs6/docs/pix/mlr-doc-sepia.jpg similarity index 100% rename from docs6b/docs/_build/html/pix/mlr-doc-sepia.jpg rename to docs6/docs/pix/mlr-doc-sepia.jpg diff --git a/docs6b/docs/_build/html/pix/mlr.jpg b/docs6/docs/pix/mlr.jpg similarity index 100% rename from docs6b/docs/_build/html/pix/mlr.jpg rename to docs6/docs/pix/mlr.jpg diff --git a/docs6b/docs/_build/html/pix/omd.png b/docs6/docs/pix/omd.png similarity index 100% rename from docs6b/docs/_build/html/pix/omd.png rename to docs6/docs/pix/omd.png diff --git a/docs6b/docs/_build/html/pix/sepia-overlay.jpg b/docs6/docs/pix/sepia-overlay.jpg similarity index 100% rename from docs6b/docs/_build/html/pix/sepia-overlay.jpg rename to docs6/docs/pix/sepia-overlay.jpg diff --git a/docs6b/docs/_build/html/polyglot-dkvp-io/dkvp_io.py b/docs6/docs/polyglot-dkvp-io/dkvp_io.py similarity index 100% rename from docs6b/docs/_build/html/polyglot-dkvp-io/dkvp_io.py rename to docs6/docs/polyglot-dkvp-io/dkvp_io.py diff --git a/docs6b/docs/_build/html/polyglot-dkvp-io/dkvp_io.rb b/docs6/docs/polyglot-dkvp-io/dkvp_io.rb similarity index 100% rename from docs6b/docs/_build/html/polyglot-dkvp-io/dkvp_io.rb rename to docs6/docs/polyglot-dkvp-io/dkvp_io.rb diff --git a/docs6b/docs/_build/html/polyglot-dkvp-io/example.py b/docs6/docs/polyglot-dkvp-io/example.py similarity index 100% rename from docs6b/docs/_build/html/polyglot-dkvp-io/example.py rename to docs6/docs/polyglot-dkvp-io/example.py diff --git a/docs6b/docs/_build/html/polyglot-dkvp-io/example.rb b/docs6/docs/polyglot-dkvp-io/example.rb similarity index 100% rename from docs6b/docs/_build/html/polyglot-dkvp-io/example.rb rename to docs6/docs/polyglot-dkvp-io/example.rb diff --git a/docs6b/docs/programming-examples.md b/docs6/docs/programming-examples.md similarity index 100% rename from docs6b/docs/programming-examples.md rename to docs6/docs/programming-examples.md diff --git a/docs6b/docs/programming-examples.md.in b/docs6/docs/programming-examples.md.in similarity index 100% rename from docs6b/docs/programming-examples.md.in rename to docs6/docs/programming-examples.md.in diff --git a/docs6b/docs/programming-language.md b/docs6/docs/programming-language.md similarity index 100% rename from docs6b/docs/programming-language.md rename to docs6/docs/programming-language.md diff --git a/docs6b/docs/programming-language.md.in b/docs6/docs/programming-language.md.in similarity index 100% rename from docs6b/docs/programming-language.md.in rename to docs6/docs/programming-language.md.in diff --git a/docs6b/docs/_build/html/programs/mand.mlr b/docs6/docs/programs/mand.mlr similarity index 100% rename from docs6b/docs/_build/html/programs/mand.mlr rename to docs6/docs/programs/mand.mlr diff --git a/docs6b/docs/_build/html/programs/mand.sh b/docs6/docs/programs/mand.sh similarity index 100% rename from docs6b/docs/_build/html/programs/mand.sh rename to docs6/docs/programs/mand.sh diff --git a/docs6b/docs/_build/html/programs/sieve.mlr b/docs6/docs/programs/sieve.mlr similarity index 100% rename from docs6b/docs/_build/html/programs/sieve.mlr rename to docs6/docs/programs/sieve.mlr diff --git a/docs6b/docs/randomizing-examples.md b/docs6/docs/randomizing-examples.md similarity index 100% rename from docs6b/docs/randomizing-examples.md rename to docs6/docs/randomizing-examples.md diff --git a/docs6b/docs/randomizing-examples.md.in b/docs6/docs/randomizing-examples.md.in similarity index 100% rename from docs6b/docs/randomizing-examples.md.in rename to docs6/docs/randomizing-examples.md.in diff --git a/docs6b/docs/record-heterogeneity.md b/docs6/docs/record-heterogeneity.md similarity index 100% rename from docs6b/docs/record-heterogeneity.md rename to docs6/docs/record-heterogeneity.md diff --git a/docs6b/docs/record-heterogeneity.md.in b/docs6/docs/record-heterogeneity.md.in similarity index 100% rename from docs6b/docs/record-heterogeneity.md.in rename to docs6/docs/record-heterogeneity.md.in diff --git a/docs6b/docs/reference-dsl-arrays.md b/docs6/docs/reference-dsl-arrays.md similarity index 100% rename from docs6b/docs/reference-dsl-arrays.md rename to docs6/docs/reference-dsl-arrays.md diff --git a/docs6b/docs/reference-dsl-arrays.md.in b/docs6/docs/reference-dsl-arrays.md.in similarity index 100% rename from docs6b/docs/reference-dsl-arrays.md.in rename to docs6/docs/reference-dsl-arrays.md.in diff --git a/docs6b/docs/reference-dsl-builtin-functions.md b/docs6/docs/reference-dsl-builtin-functions.md similarity index 100% rename from docs6b/docs/reference-dsl-builtin-functions.md rename to docs6/docs/reference-dsl-builtin-functions.md diff --git a/docs6b/docs/reference-dsl-builtin-functions.md.in b/docs6/docs/reference-dsl-builtin-functions.md.in similarity index 100% rename from docs6b/docs/reference-dsl-builtin-functions.md.in rename to docs6/docs/reference-dsl-builtin-functions.md.in diff --git a/docs6b/docs/reference-dsl-complexity.md b/docs6/docs/reference-dsl-complexity.md similarity index 100% rename from docs6b/docs/reference-dsl-complexity.md rename to docs6/docs/reference-dsl-complexity.md diff --git a/docs6b/docs/reference-dsl-complexity.md.in b/docs6/docs/reference-dsl-complexity.md.in similarity index 100% rename from docs6b/docs/reference-dsl-complexity.md.in rename to docs6/docs/reference-dsl-complexity.md.in diff --git a/docs6b/docs/reference-dsl-control-structures.md b/docs6/docs/reference-dsl-control-structures.md similarity index 98% rename from docs6b/docs/reference-dsl-control-structures.md rename to docs6/docs/reference-dsl-control-structures.md index 1f97126c2..8a792b3d2 100644 --- a/docs6b/docs/reference-dsl-control-structures.md +++ b/docs6/docs/reference-dsl-control-structures.md @@ -140,8 +140,7 @@ While Miller's `while` and `do-while` statements are much as in many other langu As with `while` and `do-while`, a `break` or `continue` within nested control structures will propagate to the innermost loop enclosing them, if any, and a `break` or `continue` outside a loop is a syntax error that will be flagged as soon as the expression is parsed, before any input records are ingested. -Key-only for-loops -................................................................ +### Key-only for-loops The `key` variable is always bound to the *key* of key-value pairs: @@ -210,8 +209,7 @@ a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729 Note that the value corresponding to a given key may be gotten as through a **computed field name** using square brackets as in `$[key]` for stream records, or by indexing the looped-over variable using square brackets. -Key-value for-loops -................................................................ +### Key-value for-loops Single-level keys may be gotten at using either `for(k,v)` or `for((k),v)`; multi-level keys may be gotten at using `for((k1,k2,k3),v)` and so on. The `v` variable will be bound to to a scalar value (a string or a number) if the map stops at that level, or to a map-valued variable if the map goes deeper. If the map isn't deep enough then the loop body won't be executed. @@ -420,8 +418,7 @@ key1=6,key2=7,valuetype=map key1=7,key2=8,valuetype=int -C-style triple-for loops -................................................................ +### C-style triple-for loops These are supported as follows: diff --git a/docs6b/docs/reference-dsl-control-structures.md.in b/docs6/docs/reference-dsl-control-structures.md.in similarity index 100% rename from docs6b/docs/reference-dsl-control-structures.md.in rename to docs6/docs/reference-dsl-control-structures.md.in diff --git a/docs6b/docs/reference-dsl-errors.md b/docs6/docs/reference-dsl-errors.md similarity index 100% rename from docs6b/docs/reference-dsl-errors.md rename to docs6/docs/reference-dsl-errors.md diff --git a/docs6b/docs/reference-dsl-errors.md.in b/docs6/docs/reference-dsl-errors.md.in similarity index 100% rename from docs6b/docs/reference-dsl-errors.md.in rename to docs6/docs/reference-dsl-errors.md.in diff --git a/docs6b/docs/reference-dsl-filter-statements.md b/docs6/docs/reference-dsl-filter-statements.md similarity index 100% rename from docs6b/docs/reference-dsl-filter-statements.md rename to docs6/docs/reference-dsl-filter-statements.md diff --git a/docs6b/docs/reference-dsl-filter-statements.md.in b/docs6/docs/reference-dsl-filter-statements.md.in similarity index 100% rename from docs6b/docs/reference-dsl-filter-statements.md.in rename to docs6/docs/reference-dsl-filter-statements.md.in diff --git a/docs6b/docs/reference-dsl-operators.md b/docs6/docs/reference-dsl-operators.md similarity index 100% rename from docs6b/docs/reference-dsl-operators.md rename to docs6/docs/reference-dsl-operators.md diff --git a/docs6b/docs/reference-dsl-operators.md.in b/docs6/docs/reference-dsl-operators.md.in similarity index 100% rename from docs6b/docs/reference-dsl-operators.md.in rename to docs6/docs/reference-dsl-operators.md.in diff --git a/docs6b/docs/reference-dsl-output-statements.md b/docs6/docs/reference-dsl-output-statements.md similarity index 100% rename from docs6b/docs/reference-dsl-output-statements.md rename to docs6/docs/reference-dsl-output-statements.md diff --git a/docs6b/docs/reference-dsl-output-statements.md.in b/docs6/docs/reference-dsl-output-statements.md.in similarity index 100% rename from docs6b/docs/reference-dsl-output-statements.md.in rename to docs6/docs/reference-dsl-output-statements.md.in diff --git a/docs6b/docs/reference-dsl-syntax.md b/docs6/docs/reference-dsl-syntax.md similarity index 100% rename from docs6b/docs/reference-dsl-syntax.md rename to docs6/docs/reference-dsl-syntax.md diff --git a/docs6b/docs/reference-dsl-syntax.md.in b/docs6/docs/reference-dsl-syntax.md.in similarity index 100% rename from docs6b/docs/reference-dsl-syntax.md.in rename to docs6/docs/reference-dsl-syntax.md.in diff --git a/docs6b/docs/reference-dsl-unset-statements.md b/docs6/docs/reference-dsl-unset-statements.md similarity index 100% rename from docs6b/docs/reference-dsl-unset-statements.md rename to docs6/docs/reference-dsl-unset-statements.md diff --git a/docs6b/docs/reference-dsl-unset-statements.md.in b/docs6/docs/reference-dsl-unset-statements.md.in similarity index 100% rename from docs6b/docs/reference-dsl-unset-statements.md.in rename to docs6/docs/reference-dsl-unset-statements.md.in diff --git a/docs6b/docs/reference-dsl-user-defined-functions.md b/docs6/docs/reference-dsl-user-defined-functions.md similarity index 100% rename from docs6b/docs/reference-dsl-user-defined-functions.md rename to docs6/docs/reference-dsl-user-defined-functions.md diff --git a/docs6b/docs/reference-dsl-user-defined-functions.md.in b/docs6/docs/reference-dsl-user-defined-functions.md.in similarity index 100% rename from docs6b/docs/reference-dsl-user-defined-functions.md.in rename to docs6/docs/reference-dsl-user-defined-functions.md.in diff --git a/docs6b/docs/reference-dsl-variables.md b/docs6/docs/reference-dsl-variables.md similarity index 100% rename from docs6b/docs/reference-dsl-variables.md rename to docs6/docs/reference-dsl-variables.md diff --git a/docs6b/docs/reference-dsl-variables.md.in b/docs6/docs/reference-dsl-variables.md.in similarity index 100% rename from docs6b/docs/reference-dsl-variables.md.in rename to docs6/docs/reference-dsl-variables.md.in diff --git a/docs6b/docs/reference-dsl.md b/docs6/docs/reference-dsl.md similarity index 100% rename from docs6b/docs/reference-dsl.md rename to docs6/docs/reference-dsl.md diff --git a/docs6b/docs/reference-dsl.md.in b/docs6/docs/reference-dsl.md.in similarity index 100% rename from docs6b/docs/reference-dsl.md.in rename to docs6/docs/reference-dsl.md.in diff --git a/docs6b/docs/reference-main-arithmetic.md b/docs6/docs/reference-main-arithmetic.md similarity index 100% rename from docs6b/docs/reference-main-arithmetic.md rename to docs6/docs/reference-main-arithmetic.md diff --git a/docs6b/docs/reference-main-arithmetic.md.in b/docs6/docs/reference-main-arithmetic.md.in similarity index 100% rename from docs6b/docs/reference-main-arithmetic.md.in rename to docs6/docs/reference-main-arithmetic.md.in diff --git a/docs6b/docs/reference-main-auxiliary-commands.md b/docs6/docs/reference-main-auxiliary-commands.md similarity index 100% rename from docs6b/docs/reference-main-auxiliary-commands.md rename to docs6/docs/reference-main-auxiliary-commands.md diff --git a/docs6b/docs/reference-main-auxiliary-commands.md.in b/docs6/docs/reference-main-auxiliary-commands.md.in similarity index 100% rename from docs6b/docs/reference-main-auxiliary-commands.md.in rename to docs6/docs/reference-main-auxiliary-commands.md.in diff --git a/docs6b/docs/reference-main-data-types.md b/docs6/docs/reference-main-data-types.md similarity index 100% rename from docs6b/docs/reference-main-data-types.md rename to docs6/docs/reference-main-data-types.md diff --git a/docs6b/docs/reference-main-data-types.md.in b/docs6/docs/reference-main-data-types.md.in similarity index 100% rename from docs6b/docs/reference-main-data-types.md.in rename to docs6/docs/reference-main-data-types.md.in diff --git a/docs6b/docs/reference-main-env-vars.md b/docs6/docs/reference-main-env-vars.md similarity index 100% rename from docs6b/docs/reference-main-env-vars.md rename to docs6/docs/reference-main-env-vars.md diff --git a/docs6b/docs/reference-main-env-vars.md.in b/docs6/docs/reference-main-env-vars.md.in similarity index 100% rename from docs6b/docs/reference-main-env-vars.md.in rename to docs6/docs/reference-main-env-vars.md.in diff --git a/docs6b/docs/reference-main-io-options.md b/docs6/docs/reference-main-io-options.md similarity index 100% rename from docs6b/docs/reference-main-io-options.md rename to docs6/docs/reference-main-io-options.md diff --git a/docs6b/docs/reference-main-io-options.md.in b/docs6/docs/reference-main-io-options.md.in similarity index 100% rename from docs6b/docs/reference-main-io-options.md.in rename to docs6/docs/reference-main-io-options.md.in diff --git a/docs6b/docs/reference-main-null-data.md b/docs6/docs/reference-main-null-data.md similarity index 100% rename from docs6b/docs/reference-main-null-data.md rename to docs6/docs/reference-main-null-data.md diff --git a/docs6b/docs/reference-main-null-data.md.in b/docs6/docs/reference-main-null-data.md.in similarity index 100% rename from docs6b/docs/reference-main-null-data.md.in rename to docs6/docs/reference-main-null-data.md.in diff --git a/docs6b/docs/reference-main-online-help.md b/docs6/docs/reference-main-online-help.md similarity index 100% rename from docs6b/docs/reference-main-online-help.md rename to docs6/docs/reference-main-online-help.md diff --git a/docs6b/docs/reference-main-online-help.md.in b/docs6/docs/reference-main-online-help.md.in similarity index 100% rename from docs6b/docs/reference-main-online-help.md.in rename to docs6/docs/reference-main-online-help.md.in diff --git a/docs6b/docs/reference-main-overview.md b/docs6/docs/reference-main-overview.md similarity index 100% rename from docs6b/docs/reference-main-overview.md rename to docs6/docs/reference-main-overview.md diff --git a/docs6b/docs/reference-main-overview.md.in b/docs6/docs/reference-main-overview.md.in similarity index 100% rename from docs6b/docs/reference-main-overview.md.in rename to docs6/docs/reference-main-overview.md.in diff --git a/docs6b/docs/reference-main-regular-expressions.md b/docs6/docs/reference-main-regular-expressions.md similarity index 100% rename from docs6b/docs/reference-main-regular-expressions.md rename to docs6/docs/reference-main-regular-expressions.md diff --git a/docs6b/docs/reference-main-regular-expressions.md.in b/docs6/docs/reference-main-regular-expressions.md.in similarity index 100% rename from docs6b/docs/reference-main-regular-expressions.md.in rename to docs6/docs/reference-main-regular-expressions.md.in diff --git a/docs6b/docs/reference-main-then-chaining.md b/docs6/docs/reference-main-then-chaining.md similarity index 100% rename from docs6b/docs/reference-main-then-chaining.md rename to docs6/docs/reference-main-then-chaining.md diff --git a/docs6b/docs/reference-main-then-chaining.md.in b/docs6/docs/reference-main-then-chaining.md.in similarity index 100% rename from docs6b/docs/reference-main-then-chaining.md.in rename to docs6/docs/reference-main-then-chaining.md.in diff --git a/docs6b/docs/reference-verbs.md b/docs6/docs/reference-verbs.md similarity index 100% rename from docs6b/docs/reference-verbs.md rename to docs6/docs/reference-verbs.md diff --git a/docs6b/docs/reference-verbs.md.in b/docs6/docs/reference-verbs.md.in similarity index 100% rename from docs6b/docs/reference-verbs.md.in rename to docs6/docs/reference-verbs.md.in diff --git a/docs6b/docs/release-docs.md b/docs6/docs/release-docs.md similarity index 100% rename from docs6b/docs/release-docs.md rename to docs6/docs/release-docs.md diff --git a/docs6b/docs/release-docs.md.in b/docs6/docs/release-docs.md.in similarity index 100% rename from docs6b/docs/release-docs.md.in rename to docs6/docs/release-docs.md.in diff --git a/docs6b/docs/repl.md b/docs6/docs/repl.md similarity index 100% rename from docs6b/docs/repl.md rename to docs6/docs/repl.md diff --git a/docs6b/docs/repl.md.in b/docs6/docs/repl.md.in similarity index 100% rename from docs6b/docs/repl.md.in rename to docs6/docs/repl.md.in diff --git a/docs6b/docs/_build/html/sample_mlrrc b/docs6/docs/sample_mlrrc similarity index 100% rename from docs6b/docs/_build/html/sample_mlrrc rename to docs6/docs/sample_mlrrc diff --git a/docs6b/docs/shapes-of-data.md b/docs6/docs/shapes-of-data.md similarity index 100% rename from docs6b/docs/shapes-of-data.md rename to docs6/docs/shapes-of-data.md diff --git a/docs6b/docs/shapes-of-data.md.in b/docs6/docs/shapes-of-data.md.in similarity index 100% rename from docs6b/docs/shapes-of-data.md.in rename to docs6/docs/shapes-of-data.md.in diff --git a/docs6b/docs/shell-commands.md b/docs6/docs/shell-commands.md similarity index 100% rename from docs6b/docs/shell-commands.md rename to docs6/docs/shell-commands.md diff --git a/docs6b/docs/shell-commands.md.in b/docs6/docs/shell-commands.md.in similarity index 100% rename from docs6b/docs/shell-commands.md.in rename to docs6/docs/shell-commands.md.in diff --git a/docs6b/docs/special-symbols-and-formatting.md b/docs6/docs/special-symbols-and-formatting.md similarity index 100% rename from docs6b/docs/special-symbols-and-formatting.md rename to docs6/docs/special-symbols-and-formatting.md diff --git a/docs6b/docs/special-symbols-and-formatting.md.in b/docs6/docs/special-symbols-and-formatting.md.in similarity index 100% rename from docs6b/docs/special-symbols-and-formatting.md.in rename to docs6/docs/special-symbols-and-formatting.md.in diff --git a/docs/sphinx-hack/data b/docs6/docs/sphinx-hack/data similarity index 100% rename from docs/sphinx-hack/data rename to docs6/docs/sphinx-hack/data diff --git a/docs6/sphinx-hack/multi-join b/docs6/docs/sphinx-hack/multi-join similarity index 100% rename from docs6/sphinx-hack/multi-join rename to docs6/docs/sphinx-hack/multi-join diff --git a/docs6/sphinx-hack/ngrams b/docs6/docs/sphinx-hack/ngrams similarity index 100% rename from docs6/sphinx-hack/ngrams rename to docs6/docs/sphinx-hack/ngrams diff --git a/docs6/sphinx-hack/pix b/docs6/docs/sphinx-hack/pix similarity index 100% rename from docs6/sphinx-hack/pix rename to docs6/docs/sphinx-hack/pix diff --git a/docs6/sphinx-hack/polyglot-dkvp-io b/docs6/docs/sphinx-hack/polyglot-dkvp-io similarity index 100% rename from docs6/sphinx-hack/polyglot-dkvp-io rename to docs6/docs/sphinx-hack/polyglot-dkvp-io diff --git a/docs/sphinx-hack/programs b/docs6/docs/sphinx-hack/programs similarity index 100% rename from docs/sphinx-hack/programs rename to docs6/docs/sphinx-hack/programs diff --git a/docs6b/docs/sql-examples.md b/docs6/docs/sql-examples.md similarity index 100% rename from docs6b/docs/sql-examples.md rename to docs6/docs/sql-examples.md diff --git a/docs6b/docs/sql-examples.md.in b/docs6/docs/sql-examples.md.in similarity index 100% rename from docs6b/docs/sql-examples.md.in rename to docs6/docs/sql-examples.md.in diff --git a/docs6b/docs/_build/html/square.csv b/docs6/docs/square.csv similarity index 100% rename from docs6b/docs/_build/html/square.csv rename to docs6/docs/square.csv diff --git a/docs6b/docs/statistics-examples.md b/docs6/docs/statistics-examples.md similarity index 100% rename from docs6b/docs/statistics-examples.md rename to docs6/docs/statistics-examples.md diff --git a/docs6b/docs/statistics-examples.md.in b/docs6/docs/statistics-examples.md.in similarity index 100% rename from docs6b/docs/statistics-examples.md.in rename to docs6/docs/statistics-examples.md.in diff --git a/docs6b/docs/then-chaining.md b/docs6/docs/then-chaining.md similarity index 100% rename from docs6b/docs/then-chaining.md rename to docs6/docs/then-chaining.md diff --git a/docs6b/docs/then-chaining.md.in b/docs6/docs/then-chaining.md.in similarity index 100% rename from docs6b/docs/then-chaining.md.in rename to docs6/docs/then-chaining.md.in diff --git a/docs6b/docs/_build/html/triangle.csv b/docs6/docs/triangle.csv similarity index 100% rename from docs6b/docs/_build/html/triangle.csv rename to docs6/docs/triangle.csv diff --git a/docs6b/docs/two-pass-algorithms.md b/docs6/docs/two-pass-algorithms.md similarity index 100% rename from docs6b/docs/two-pass-algorithms.md rename to docs6/docs/two-pass-algorithms.md diff --git a/docs6b/docs/two-pass-algorithms.md.in b/docs6/docs/two-pass-algorithms.md.in similarity index 100% rename from docs6b/docs/two-pass-algorithms.md.in rename to docs6/docs/two-pass-algorithms.md.in diff --git a/docs6b/docs/_build/html/variance.mlr b/docs6/docs/variance.mlr similarity index 100% rename from docs6b/docs/_build/html/variance.mlr rename to docs6/docs/variance.mlr diff --git a/docs6b/docs/_build/html/verb-example-ewma.sh b/docs6/docs/verb-example-ewma.sh similarity index 100% rename from docs6b/docs/_build/html/verb-example-ewma.sh rename to docs6/docs/verb-example-ewma.sh diff --git a/docs6b/docs/why.md b/docs6/docs/why.md similarity index 100% rename from docs6b/docs/why.md rename to docs6/docs/why.md diff --git a/docs6b/docs/why.md.in b/docs6/docs/why.md.in similarity index 100% rename from docs6b/docs/why.md.in rename to docs6/docs/why.md.in diff --git a/docs6b/docs/x b/docs6/docs/x similarity index 100% rename from docs6b/docs/x rename to docs6/docs/x diff --git a/docs6/etymology.rst b/docs6/etymology.rst deleted file mode 100644 index ca0fc48f0..000000000 --- a/docs6/etymology.rst +++ /dev/null @@ -1,9 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Why call it Miller? -================================================================ - -The Unix toolkit was created in the **1970s** and is a mainstay to this day. Miller's look and feel adheres closely to the `classic toolkit style `_: if this were music, Miller would be a **tribute album**. Likewise, since commands are subcommands of the ``mlr`` executable, the result is a **band**, if you will, of command-line tools. Put these together and the namesake is another classic product of the 1970s: the `Steve Miller Band `_. - -(Additionally, and far more prosaically ... just as a miller is someone who grinds and mixes grain into flour to extend its usefulness, Miller grinds and mixes data for you.) diff --git a/docs6/etymology.rst.in b/docs6/etymology.rst.in deleted file mode 100644 index 56aa14652..000000000 --- a/docs6/etymology.rst.in +++ /dev/null @@ -1,6 +0,0 @@ -Why call it Miller? -================================================================ - -The Unix toolkit was created in the **1970s** and is a mainstay to this day. Miller's look and feel adheres closely to the `classic toolkit style `_: if this were music, Miller would be a **tribute album**. Likewise, since commands are subcommands of the ``mlr`` executable, the result is a **band**, if you will, of command-line tools. Put these together and the namesake is another classic product of the 1970s: the `Steve Miller Band `_. - -(Additionally, and far more prosaically ... just as a miller is someone who grinds and mixes grain into flour to extend its usefulness, Miller grinds and mixes data for you.) diff --git a/docs6/feature-comparison.rst b/docs6/feature-comparison.rst deleted file mode 100644 index 2d7ed3d49..000000000 --- a/docs6/feature-comparison.rst +++ /dev/null @@ -1,71 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Unix-toolkit context -================================================================ - -How does Miller fit within the Unix toolkit (``grep``, ``sed``, ``awk``, etc.)? - -File-format awareness ----------------------------------------------------------------- - -Miller respects CSV headers. If you do ``mlr --csv cat *.csv`` then the header line is written once: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/a.csv - a,b,c - 1,2,3 - 4,5,6 - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/b.csv - a,b,c - 7,8,9 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv cat data/a.csv data/b.csv - a,b,c - 1,2,3 - 4,5,6 - 7,8,9 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv sort -nr b data/a.csv data/b.csv - a,b,c - 7,8,9 - 4,5,6 - 1,2,3 - -Likewise with ``mlr sort``, ``mlr tac``, and so on. - -awk-like features: mlr filter and mlr put ----------------------------------------------------------------- - -* ``mlr filter`` includes/excludes records based on a filter expression, e.g. ``mlr filter '$count > 10'``. - -* ``mlr put`` adds a new field as a function of others, e.g. ``mlr put '$xy = $x * $y'`` or ``mlr put '$counter = NR'``. - -* The ``$name`` syntax is straight from ``awk``'s ``$1 $2 $3`` (adapted to name-based indexing), as are the variables ``FS``, ``OFS``, ``RS``, ``ORS``, ``NF``, ``NR``, and ``FILENAME``. The ``ENV[...]`` syntax is from Ruby. - -* While ``awk`` functions are record-based, Miller subcommands (or *verbs*) are stream-based: each of them maps a stream of records into another stream of records. - -* Like ``awk``, Miller (as of v5.0.0) allows you to define new functions within its ``put`` and ``filter`` expression language. Further programmability comes from chaining with ``then``. - -* As with ``awk``, ``$``-variables are stream variables and all verbs (such as ``cut``, ``stats1``, ``put``, etc.) as well as ``put``/``filter`` statements operate on streams. This means that you define actions to be done on each record and then stream your data through those actions. The built-in variables ``NF``, ``NR``, etc. change from one line to another, ``$x`` is a label for field ``x`` in the current record, and the input to ``sqrt($x)`` changes from one record to the next. The expression language for the ``put`` and ``filter`` verbs additionally allows you to define ``begin {...}`` and ``end {...}`` blocks for actions to be taken before and after records are processed, respectively. - -* As with ``awk``, Miller's ``put``/``filter`` language lets you set ``@sum=0`` before records are read, then update that sum on each record, then print its value at the end. Unlike ``awk``, Miller makes syntactically explicit the difference between variables with extent across all records (names starting with ``@``, such as ``@sum``) and variables which are local to the current expression (names starting without ``@``, such as ``sum``). - -* Miller can be faster than ``awk``, ``cut``, and so on, depending on platform; see also :doc:`performance`. In particular, Miller's DSL syntax is parsed into Go control structures at startup time, with the bulk data-stream processing all done in Go. - -See also ----------------------------------------------------------------- - -See :doc:`reference-verbs` for more on Miller's subcommands ``cat``, ``cut``, ``head``, ``sort``, ``tac``, ``tail``, ``top``, and ``uniq``, as well as :doc:`reference-dsl` for more on the awk-like ``mlr filter`` and ``mlr put``. diff --git a/docs6/feature-comparison.rst.in b/docs6/feature-comparison.rst.in deleted file mode 100644 index 7d22ad6b8..000000000 --- a/docs6/feature-comparison.rst.in +++ /dev/null @@ -1,51 +0,0 @@ -Unix-toolkit context -================================================================ - -How does Miller fit within the Unix toolkit (``grep``, ``sed``, ``awk``, etc.)? - -File-format awareness ----------------------------------------------------------------- - -Miller respects CSV headers. If you do ``mlr --csv cat *.csv`` then the header line is written once: - -GENRST_RUN_COMMAND -cat data/a.csv -GENRST_EOF - -GENRST_RUN_COMMAND -cat data/b.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --csv cat data/a.csv data/b.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --csv sort -nr b data/a.csv data/b.csv -GENRST_EOF - -Likewise with ``mlr sort``, ``mlr tac``, and so on. - -awk-like features: mlr filter and mlr put ----------------------------------------------------------------- - -* ``mlr filter`` includes/excludes records based on a filter expression, e.g. ``mlr filter '$count > 10'``. - -* ``mlr put`` adds a new field as a function of others, e.g. ``mlr put '$xy = $x * $y'`` or ``mlr put '$counter = NR'``. - -* The ``$name`` syntax is straight from ``awk``'s ``$1 $2 $3`` (adapted to name-based indexing), as are the variables ``FS``, ``OFS``, ``RS``, ``ORS``, ``NF``, ``NR``, and ``FILENAME``. The ``ENV[...]`` syntax is from Ruby. - -* While ``awk`` functions are record-based, Miller subcommands (or *verbs*) are stream-based: each of them maps a stream of records into another stream of records. - -* Like ``awk``, Miller (as of v5.0.0) allows you to define new functions within its ``put`` and ``filter`` expression language. Further programmability comes from chaining with ``then``. - -* As with ``awk``, ``$``-variables are stream variables and all verbs (such as ``cut``, ``stats1``, ``put``, etc.) as well as ``put``/``filter`` statements operate on streams. This means that you define actions to be done on each record and then stream your data through those actions. The built-in variables ``NF``, ``NR``, etc. change from one line to another, ``$x`` is a label for field ``x`` in the current record, and the input to ``sqrt($x)`` changes from one record to the next. The expression language for the ``put`` and ``filter`` verbs additionally allows you to define ``begin {...}`` and ``end {...}`` blocks for actions to be taken before and after records are processed, respectively. - -* As with ``awk``, Miller's ``put``/``filter`` language lets you set ``@sum=0`` before records are read, then update that sum on each record, then print its value at the end. Unlike ``awk``, Miller makes syntactically explicit the difference between variables with extent across all records (names starting with ``@``, such as ``@sum``) and variables which are local to the current expression (names starting without ``@``, such as ``sum``). - -* Miller can be faster than ``awk``, ``cut``, and so on, depending on platform; see also :doc:`performance`. In particular, Miller's DSL syntax is parsed into Go control structures at startup time, with the bulk data-stream processing all done in Go. - -See also ----------------------------------------------------------------- - -See :doc:`reference-verbs` for more on Miller's subcommands ``cat``, ``cut``, ``head``, ``sort``, ``tac``, ``tail``, ``top``, and ``uniq``, as well as :doc:`reference-dsl` for more on the awk-like ``mlr filter`` and ``mlr put``. diff --git a/docs6/features.rst b/docs6/features.rst deleted file mode 100644 index 03401c470..000000000 --- a/docs6/features.rst +++ /dev/null @@ -1,43 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Features -================================================================ - -Miller is like awk, sed, cut, join, and sort for **name-indexed data such as -CSV, TSV, and tabular JSON**. You get to work with your data using named -fields, without needing to count positional column indices. - -This is something the Unix toolkit always could have done, and arguably -always should have done. It operates on key-value-pair data while the familiar -Unix tools operate on integer-indexed fields: if the natural data structure for -the latter is the array, then Miller's natural data structure is the -insertion-ordered hash map. This encompasses a **variety of data formats**, -including but not limited to the familiar CSV, TSV, and JSON. (Miller can handle -**positionally-indexed data** as a special case.) - -* Miller is **multi-purpose**: it's useful for **data cleaning**, **data reduction**, **statistical reporting**, **devops**, **system administration**, **log-file processing**, **format conversion**, and **database-query post-processing**. - -* You can use Miller to snarf and munge **log-file data**, including selecting out relevant substreams, then produce CSV format and load that into all-in-memory/data-frame utilities for further statistical and/or graphical processing. - -* Miller complements **data-analysis tools** such as **R**, **pandas**, etc.: you can use Miller to **clean** and **prepare** your data. While you can do **basic statistics** entirely in Miller, its streaming-data feature and single-pass algorithms enable you to **reduce very large data sets**. - -* Miller complements SQL **databases**: you can slice, dice, and reformat data on the client side on its way into or out of a database. (Examples :ref:`here ` and :ref:`here `.) You can also reap some of the benefits of databases for quick, setup-free one-off tasks when you just need to query some data in disk files in a hurry. - -* Miller also goes beyond the classic Unix tools by stepping fully into our modern, **no-SQL** world: its essential record-heterogeneity property allows Miller to operate on data where records with different schema (field names) are interleaved. - -* Miller is **streaming**: most operations need only a single record in memory at a time, rather than ingesting all input before producing any output. For those operations which require deeper retention (``sort``, ``tac``, ``stats1``), Miller retains only as much data as needed. This means that whenever functionally possible, you can operate on files which are larger than your system's available RAM, and you can use Miller in **tail -f** contexts. - -* Miller is **pipe-friendly** and interoperates with the Unix toolkit - -* Miller's I/O formats include **tabular pretty-printing**, **positionally indexed** (Unix-toolkit style), CSV, JSON, and others - -* Miller does **conversion** between formats - -* Miller's **processing is format-aware**: e.g. CSV ``sort`` and ``tac`` keep header lines first - -* Miller has high-throughput **performance** on par with the Unix toolkit - -* Not unlike `jq `_ (for JSON), Miller is written in Go which is a portable, modern language, and Miller has no runtime dependencies. You can download or compile a single binary, ``scp`` it to a faraway machine, and expect it to work. - -Releases and release notes: https://github.com/johnkerl/miller/releases. diff --git a/docs6/features.rst.in b/docs6/features.rst.in deleted file mode 100644 index be5867fe4..000000000 --- a/docs6/features.rst.in +++ /dev/null @@ -1,40 +0,0 @@ -Features -================================================================ - -Miller is like awk, sed, cut, join, and sort for **name-indexed data such as -CSV, TSV, and tabular JSON**. You get to work with your data using named -fields, without needing to count positional column indices. - -This is something the Unix toolkit always could have done, and arguably -always should have done. It operates on key-value-pair data while the familiar -Unix tools operate on integer-indexed fields: if the natural data structure for -the latter is the array, then Miller's natural data structure is the -insertion-ordered hash map. This encompasses a **variety of data formats**, -including but not limited to the familiar CSV, TSV, and JSON. (Miller can handle -**positionally-indexed data** as a special case.) - -* Miller is **multi-purpose**: it's useful for **data cleaning**, **data reduction**, **statistical reporting**, **devops**, **system administration**, **log-file processing**, **format conversion**, and **database-query post-processing**. - -* You can use Miller to snarf and munge **log-file data**, including selecting out relevant substreams, then produce CSV format and load that into all-in-memory/data-frame utilities for further statistical and/or graphical processing. - -* Miller complements **data-analysis tools** such as **R**, **pandas**, etc.: you can use Miller to **clean** and **prepare** your data. While you can do **basic statistics** entirely in Miller, its streaming-data feature and single-pass algorithms enable you to **reduce very large data sets**. - -* Miller complements SQL **databases**: you can slice, dice, and reformat data on the client side on its way into or out of a database. (Examples :ref:`here ` and :ref:`here `.) You can also reap some of the benefits of databases for quick, setup-free one-off tasks when you just need to query some data in disk files in a hurry. - -* Miller also goes beyond the classic Unix tools by stepping fully into our modern, **no-SQL** world: its essential record-heterogeneity property allows Miller to operate on data where records with different schema (field names) are interleaved. - -* Miller is **streaming**: most operations need only a single record in memory at a time, rather than ingesting all input before producing any output. For those operations which require deeper retention (``sort``, ``tac``, ``stats1``), Miller retains only as much data as needed. This means that whenever functionally possible, you can operate on files which are larger than your system's available RAM, and you can use Miller in **tail -f** contexts. - -* Miller is **pipe-friendly** and interoperates with the Unix toolkit - -* Miller's I/O formats include **tabular pretty-printing**, **positionally indexed** (Unix-toolkit style), CSV, JSON, and others - -* Miller does **conversion** between formats - -* Miller's **processing is format-aware**: e.g. CSV ``sort`` and ``tac`` keep header lines first - -* Miller has high-throughput **performance** on par with the Unix toolkit - -* Not unlike `jq `_ (for JSON), Miller is written in Go which is a portable, modern language, and Miller has no runtime dependencies. You can download or compile a single binary, ``scp`` it to a faraway machine, and expect it to work. - -Releases and release notes: https://github.com/johnkerl/miller/releases. diff --git a/docs6/file-formats.rst b/docs6/file-formats.rst deleted file mode 100644 index 77127340d..000000000 --- a/docs6/file-formats.rst +++ /dev/null @@ -1,660 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -File formats -================================================================ - -Miller handles name-indexed data using several formats: some you probably know by name, such as CSV, TSV, and JSON -- and other formats you're likely already seeing and using in your structured data. - -Additionally, Miller gives you the option of including comments within your data. - -Examples ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr help data-formats - CSV/CSV-lite: comma-separated values with separate header line - TSV: same but with tabs in places of commas - +---------------------+ - | apple,bat,cog | - | 1,2,3 | Record 1: "apple => "1", "bat" => "2", "cog" => "3" - | 4,5,6 | Record 2: "apple" => "4", "bat" => "5", "cog" => "6" - +---------------------+ - - JSON (sequence or array of objects): - +---------------------+ - | { | - | "apple": 1, | Record 1: "apple" => "1", "bat" => "2", "cog" => "3" - | "bat": 2, | - | "cog": 3 | - | } | - | { | - | "dish": { | Record 2: "dish:egg" => "7", "dish:flint" => "8", "garlic" => "" - | "egg": 7, | - | "flint": 8 | - | }, | - | "garlic": "" | - | } | - +---------------------+ - - PPRINT: pretty-printed tabular - +---------------------+ - | apple bat cog | - | 1 2 3 | Record 1: "apple => "1", "bat" => "2", "cog" => "3" - | 4 5 6 | Record 2: "apple" => "4", "bat" => "5", "cog" => "6" - +---------------------+ - - Markdown tabular (supported for output only): - +-----------------------+ - | | apple | bat | cog | | - | | --- | --- | --- | | - | | 1 | 2 | 3 | | Record 1: "apple => "1", "bat" => "2", "cog" => "3" - | | 4 | 5 | 6 | | Record 2: "apple" => "4", "bat" => "5", "cog" => "6" - +-----------------------+ - - XTAB: pretty-printed transposed tabular - +---------------------+ - | apple 1 | Record 1: "apple" => "1", "bat" => "2", "cog" => "3" - | bat 2 | - | cog 3 | - | | - | dish 7 | Record 2: "dish" => "7", "egg" => "8" - | egg 8 | - +---------------------+ - - DKVP: delimited key-value pairs (Miller default format) - +---------------------+ - | apple=1,bat=2,cog=3 | Record 1: "apple" => "1", "bat" => "2", "cog" => "3" - | dish=7,egg=8,flint | Record 2: "dish" => "7", "egg" => "8", "3" => "flint" - +---------------------+ - - NIDX: implicitly numerically indexed (Unix-toolkit style) - +---------------------+ - | the quick brown | Record 1: "1" => "the", "2" => "quick", "3" => "brown" - | fox jumped | Record 2: "1" => "fox", "2" => "jumped" - +---------------------+ - -.. _file-formats-csv: - -CSV/TSV/ASV/USV/etc. ----------------------------------------------------------------- - -When ``mlr`` is invoked with the ``--csv`` or ``--csvlite`` option, key names are found on the first record and values are taken from subsequent records. This includes the case of CSV-formatted files. See :doc:`record-heterogeneity` for how Miller handles changes of field names within a single data stream. - -Miller has record separator ``RS`` and field separator ``FS``, just as ``awk`` does. For TSV, use ``--fs tab``; to convert TSV to CSV, use ``--ifs tab --ofs comma``, etc. (See also :ref:`reference-separators`.) - -**TSV (tab-separated values):** the following are synonymous pairs: - -* ``--tsv`` and ``--csv --fs tab`` -* ``--itsv`` and ``--icsv --ifs tab`` -* ``--otsv`` and ``--ocsv --ofs tab`` -* ``--tsvlite`` and ``--csvlite --fs tab`` -* ``--itsvlite`` and ``--icsvlite --ifs tab`` -* ``--otsvlite`` and ``--ocsvlite --ofs tab`` - -**ASV (ASCII-separated values):** the flags ``--asv``, ``--iasv``, ``--oasv``, ``--asvlite``, ``--iasvlite``, and ``--oasvlite`` are analogous except they use ASCII FS and RS 0x1f and 0x1e, respectively. - -**USV (Unicode-separated values):** likewise, the flags ``--usv``, ``--iusv``, ``--ousv``, ``--usvlite``, ``--iusvlite``, and ``--ousvlite`` use Unicode FS and RS U+241F (UTF-8 0x0xe2909f) and U+241E (UTF-8 0xe2909e), respectively. - -Miller's ``--csv`` flag supports `RFC-4180 CSV `_. This includes CRLF line-terminators by default, regardless of platform. - -Here are the differences between CSV and CSV-lite: - -* CSV supports `RFC-4180 `_-style double-quoting, including the ability to have commas and/or LF/CRLF line-endings contained within an input field; CSV-lite does not. - -* CSV does not allow heterogeneous data; CSV-lite does (see also :doc:`record-heterogeneity`). - -* The CSV-lite input-reading code is fractionally more efficient than the CSV input-reader. - -Here are things they have in common: - -* The ability to specify record/field separators other than the default, e.g. CR-LF vs. LF, or tab instead of comma for TSV, and so on. - -* The ``--implicit-csv-header`` flag for input and the ``--headerless-csv-output`` flag for output. - -.. _file-formats-dkvp: - -DKVP: Key-value pairs ----------------------------------------------------------------- - -Miller's default file format is DKVP, for **delimited key-value pairs**. Example: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr cat data/small - a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533 - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797 - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776 - a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729 - -Such data are easy to generate, e.g. in Ruby with - -.. code-block:: none - - puts "host=#{hostname},seconds=#{t2-t1},message=#{msg}" - -.. code-block:: none - - puts mymap.collect{|k,v| "#{k}=#{v}"}.join(',') - -or ``print`` statements in various languages, e.g. - -.. code-block:: none - - echo "type=3,user=$USER,date=$date\n"; - -.. code-block:: none - - logger.log("type=3,user=$USER,date=$date\n"); - -Fields lacking an IPS will have positional index (starting at 1) used as the key, as in NIDX format. For example, ``dish=7,egg=8,flint`` is parsed as ``"dish" => "7", "egg" => "8", "3" => "flint"`` and ``dish,egg,flint`` is parsed as ``"1" => "dish", "2" => "egg", "3" => "flint"``. - -As discussed in :doc:`record-heterogeneity`, Miller handles changes of field names within the same data stream. But using DKVP format this is particularly natural. One of my favorite use-cases for Miller is in application/server logs, where I log all sorts of lines such as - -.. code-block:: none - - resource=/path/to/file,loadsec=0.45,ok=true - record_count=100, resource=/path/to/file - resource=/some/other/path,loadsec=0.97,ok=false - -etc. and I just log them as needed. Then later, I can use ``grep``, ``mlr --opprint group-like``, etc. -to analyze my logs. - -See :doc:`reference-main-io-options` regarding how to specify separators other than the default equals-sign and comma. - -.. _file-formats-nidx: - -NIDX: Index-numbered (toolkit style) ----------------------------------------------------------------- - -With ``--inidx --ifs ' ' --repifs``, Miller splits lines on whitespace and assigns integer field names starting with 1. - -This recapitulates Unix-toolkit behavior. - -Example with index-numbered output: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/small - a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533 - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797 - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776 - a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --onidx --ofs ' ' cat data/small - pan pan 1 0.3467901443380824 0.7268028627434533 - eks pan 2 0.7586799647899636 0.5221511083334797 - wye wye 3 0.20460330576630303 0.33831852551664776 - eks wye 4 0.38139939387114097 0.13418874328430463 - wye pan 5 0.5732889198020006 0.8636244699032729 - -Example with index-numbered input: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/mydata.txt - oh say can you see - by the dawn's - early light - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --inidx --ifs ' ' --odkvp cat data/mydata.txt - 1=oh,2=say,3=can,4=you,5=see - 1=by,2=the,3=dawn's - 1=early,2=light - -Example with index-numbered input and output: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/mydata.txt - oh say can you see - by the dawn's - early light - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --nidx --fs ' ' --repifs cut -f 2,3 data/mydata.txt - say can - the dawn's - light - -.. _file-formats-json: - -Tabular JSON ----------------------------------------------------------------- - -JSON is a format which supports arbitrarily deep nesting of "objects" (hashmaps) and "arrays" (lists), while Miller is a tool for handling **tabular data** only. This means Miller cannot (and should not) handle arbitrary JSON. (Check out `jq `_.) - -But if you have tabular data represented in JSON then Miller can handle that for you. - -By *tabular JSON* I mean the data is either a sequence of one or more objects, or an array consisting of one or more orjects. Miller treats JSON objects as name-indexed records. - -Single-level JSON objects -^^^^^^^^^^^^^^^^^^^^^^^^^ - -An **array of single-level objects** is, quite simply, **a table**: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --json head -n 2 then cut -f color,shape data/json-example-1.json - { - "color": "yellow", - "shape": "triangle" - } - { - "color": "red", - "shape": "square" - } - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --json --jvstack head -n 2 then cut -f color,u,v data/json-example-1.json - { - "color": "yellow", - "u": 0.6321695890307647, - "v": 0.9887207810889004 - } - { - "color": "red", - "u": 0.21966833570651523, - "v": 0.001257332190235938 - } - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --ijson --opprint stats1 -a mean,stddev,count -f u -g shape data/json-example-1.json - shape u_mean u_stddev u_count - triangle 0.5839952367477192 0.13118354465618046 3 - square 0.409355036804889 0.3654281755508655 4 - circle 0.36601268553826866 0.2090944565900053 3 - -Nested JSON objects -^^^^^^^^^^^^^^^^^^^^^^^^^ - -Additionally, Miller can **tabularize nested objects by concatentating keys**: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --json --jvstack head -n 2 data/json-example-2.json - { - "flag": 1, - "i": 11, - "attributes": { - "color": "yellow", - "shape": "triangle" - }, - "values": { - "u": 0.632170, - "v": 0.988721, - "w": 0.436498, - "x": 5.798188 - } - } - { - "flag": 1, - "i": 15, - "attributes": { - "color": "red", - "shape": "square" - }, - "values": { - "u": 0.219668, - "v": 0.001257, - "w": 0.792778, - "x": 2.944117 - } - } - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --ijson --opprint head -n 4 data/json-example-2.json - flag i attributes.color attributes.shape values.u values.v values.w values.x - 1 11 yellow triangle 0.632170 0.988721 0.436498 5.798188 - 1 15 red square 0.219668 0.001257 0.792778 2.944117 - 1 16 red circle 0.209017 0.290052 0.138103 5.065034 - 0 48 red square 0.956274 0.746720 0.775542 7.117831 - -Note in particular that as far as Miller's ``put`` and ``filter``, as well as other I/O formats, are concerned, these are simply field names with colons in them: - -.. code-block:: none - :emphasize-lines: 1-3 - - mlr --json --jvstack head -n 1 \ - then put '${values:uv} = ${values:u} * ${values:v}' \ - data/json-example-2.json - { - "flag": 1, - "i": 11, - "attributes": { - "color": "yellow", - "shape": "triangle" - }, - "values": { - "u": 0.632170, - "v": 0.988721, - "w": 0.436498, - "x": 5.798188 - } - } - -Arrays -^^^^^^^^^^^^^^^^^^^^^^^^^ - -Arrays (TODO: update for Miller6) aren't supported in Miller's ``put``/``filter`` DSL. By default, JSON arrays are read in as integer-keyed maps. - -Suppose we have arrays like this in our input data: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/json-example-3.json - { - "label": "orange", - "values": [12.2, 13.8, 17.2] - } - { - "label": "purple", - "values": [27.0, 32.4] - } - -Then integer indices (starting from 0 and counting up) are used as map keys: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --ijson --oxtab cat data/json-example-3.json - label orange - values.1 12.2 - values.2 13.8 - values.3 17.2 - - label purple - values.1 27.0 - values.2 32.4 - -When the data are written back out as JSON, field names are re-expanded as above, but what were arrays on input are now maps on output: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --json --jvstack cat data/json-example-3.json - { - "label": "orange", - "values": [12.2, 13.8, 17.2] - } - { - "label": "purple", - "values": [27.0, 32.4] - } - -This is non-ideal, but it allows Miller (5.x release being latest as of this writing) to handle JSON arrays at all. - -You might also use ``mlr --json-skip-arrays-on-input`` or ``mlr --json-fatal-arrays-on-input``. - -To truly handle JSON, please use a JSON-processing tool such as `jq `_. - -Formatting JSON options -^^^^^^^^^^^^^^^^^^^^^^^^^ - -JSON isn't a parameterized format, so ``RS``, ``FS``, ``PS`` aren't specifiable. Nonetheless, you can do the following: - -* Use ``--jvstack`` to pretty-print JSON objects with multi-line (vertically stacked) spacing. By default, each Miller record (JSON object) is one per line. - -* Keystroke-savers: ``--jsonx`` simply means ``--json --jvstack``, and ``--ojsonx`` simply means ``--ojson --jvstack``. - -* Use ``--jlistwrap`` to print the sequence of JSON objects wrapped in an outermost ``[`` and ``]``. By default, these aren't printed. - -* Use ``--jquoteall`` to double-quote all object values. By default, integers, floating-point numbers, and booleans ``true`` and ``false`` are not double-quoted when they appear as JSON-object keys. - -* Use ``--jflatsep yourstringhere`` to specify the string used for key concatenation: this defaults to a single colon. - -Again, please see `jq `_ for a truly powerful, JSON-specific tool. - -.. _file-formats-pprint: - -PPRINT: Pretty-printed tabular ----------------------------------------------------------------- - -Miller's pretty-print format is like CSV, but column-aligned. For example, compare - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --ocsv cat data/small - a,b,i,x,y - pan,pan,1,0.3467901443380824,0.7268028627434533 - eks,pan,2,0.7586799647899636,0.5221511083334797 - wye,wye,3,0.20460330576630303,0.33831852551664776 - eks,wye,4,0.38139939387114097,0.13418874328430463 - wye,pan,5,0.5732889198020006,0.8636244699032729 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint cat data/small - a b i x y - pan pan 1 0.3467901443380824 0.7268028627434533 - eks pan 2 0.7586799647899636 0.5221511083334797 - wye wye 3 0.20460330576630303 0.33831852551664776 - eks wye 4 0.38139939387114097 0.13418874328430463 - wye pan 5 0.5732889198020006 0.8636244699032729 - -Note that while Miller is a line-at-a-time processor and retains input lines in memory only where necessary (e.g. for sort), pretty-print output requires it to accumulate all input lines (so that it can compute maximum column widths) before producing any output. This has two consequences: (a) pretty-print output won't work on ``tail -f`` contexts, where Miller will be waiting for an end-of-file marker which never arrives; (b) pretty-print output for large files is constrained by available machine memory. - -See :doc:`record-heterogeneity` for how Miller handles changes of field names within a single data stream. - -For output only (this isn't supported in the input-scanner as of 5.0.0) you can use ``--barred`` with pprint output format: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint --barred cat data/small - +-----+-----+---+---------------------+---------------------+ - | a | b | i | x | y | - +-----+-----+---+---------------------+---------------------+ - | pan | pan | 1 | 0.3467901443380824 | 0.7268028627434533 | - | eks | pan | 2 | 0.7586799647899636 | 0.5221511083334797 | - | wye | wye | 3 | 0.20460330576630303 | 0.33831852551664776 | - | eks | wye | 4 | 0.38139939387114097 | 0.13418874328430463 | - | wye | pan | 5 | 0.5732889198020006 | 0.8636244699032729 | - +-----+-----+---+---------------------+---------------------+ - -.. _file-formats-xtab: - -XTAB: Vertical tabular ----------------------------------------------------------------- - -This is perhaps most useful for looking a very wide and/or multi-column data which causes line-wraps on the screen (but see also -`ngrid `_ for an entirely different, very powerful option). Namely: - -.. code-block:: none - - $ grep -v '^#' /etc/passwd | head -n 6 | mlr --nidx --fs : --opprint cat - 1 2 3 4 5 6 7 - nobody * -2 -2 Unprivileged User /var/empty /usr/bin/false - root * 0 0 System Administrator /var/root /bin/sh - daemon * 1 1 System Services /var/root /usr/bin/false - _uucp * 4 4 Unix to Unix Copy Protocol /var/spool/uucp /usr/sbin/uucico - _taskgated * 13 13 Task Gate Daemon /var/empty /usr/bin/false - _networkd * 24 24 Network Services /var/networkd /usr/bin/false - -.. code-block:: none - - $ grep -v '^#' /etc/passwd | head -n 2 | mlr --nidx --fs : --oxtab cat - 1 nobody - 2 * - 3 -2 - 4 -2 - 5 Unprivileged User - 6 /var/empty - 7 /usr/bin/false - - 1 root - 2 * - 3 0 - 4 0 - 5 System Administrator - 6 /var/root - 7 /bin/sh - -.. code-block:: none - - $ grep -v '^#' /etc/passwd | head -n 2 | \ - mlr --nidx --fs : --ojson --jvstack --jlistwrap label name,password,uid,gid,gecos,home_dir,shell - [ - { - "name": "nobody", - "password": "*", - "uid": -2, - "gid": -2, - "gecos": "Unprivileged User", - "home_dir": "/var/empty", - "shell": "/usr/bin/false" - } - ,{ - "name": "root", - "password": "*", - "uid": 0, - "gid": 0, - "gecos": "System Administrator", - "home_dir": "/var/root", - "shell": "/bin/sh" - } - ] - -Markdown tabular ----------------------------------------------------------------- - -Markdown format looks like this: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --omd cat data/small - | a | b | i | x | y | - | --- | --- | --- | --- | --- | - | pan | pan | 1 | 0.3467901443380824 | 0.7268028627434533 | - | eks | pan | 2 | 0.7586799647899636 | 0.5221511083334797 | - | wye | wye | 3 | 0.20460330576630303 | 0.33831852551664776 | - | eks | wye | 4 | 0.38139939387114097 | 0.13418874328430463 | - | wye | pan | 5 | 0.5732889198020006 | 0.8636244699032729 | - -which renders like this when dropped into various web tools (e.g. github comments): - -.. image:: pix/omd.png - -As of Miller 4.3.0, markdown format is supported only for output, not input. - -Data-conversion keystroke-savers ----------------------------------------------------------------- - -While you can do format conversion using ``mlr --icsv --ojson cat myfile.csv``, there are also keystroke-savers for this purpose, such as ``mlr --c2j cat myfile.csv``. For a complete list: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr help format-conversion - As keystroke-savers for format-conversion you may use the following: - --c2t --c2d --c2n --c2j --c2x --c2p --c2m - --t2c --t2d --t2n --t2j --t2x --t2p --t2m - --d2c --d2t --d2n --d2j --d2x --d2p --d2m - --n2c --n2t --n2d --n2j --n2x --n2p --n2m - --j2c --j2t --j2d --j2n --j2x --j2p --j2m - --x2c --x2t --x2d --x2n --x2j --x2p --x2m - --p2c --p2t --p2d --p2n --p2j --p2x --p2m - The letters c t d n j x p m refer to formats CSV, TSV, DKVP, NIDX, JSON, XTAB, - PPRINT, and markdown, respectively. Note that markdown format is available for - output only. - -Autodetect of line endings ----------------------------------------------------------------- - -Default line endings (``--irs`` and ``--ors``) are ``'auto'`` which means **autodetect from the input file format**, as long as the input file(s) have lines ending in either LF (also known as linefeed, ``'\n'``, ``0x0a``, Unix-style) or CRLF (also known as carriage-return/linefeed pairs, ``'\r\n'``, ``0x0d 0x0a``, Windows style). - -**If both IRS and ORS are auto (which is the default) then LF input will lead to LF output and CRLF input will lead to CRLF output, regardless of the platform you're running on.** - -The line-ending autodetector triggers on the first line ending detected in the input stream. E.g. if you specify a CRLF-terminated file on the command line followed by an LF-terminated file then autodetected line endings will be CRLF. - -If you use ``--ors {something else}`` with (default or explicitly specified) ``--irs auto`` then line endings are autodetected on input and set to what you specify on output. - -If you use ``--irs {something else}`` with (default or explicitly specified) ``--ors auto`` then the output line endings used are LF on Unix/Linux/BSD/MacOSX, and CRLF on Windows. - -See also :ref:`reference-separators` for more information about record/field/pair separators. - -Comments in data ----------------------------------------------------------------- - -You can include comments within your data files, and either have them ignored, or passed directly through to the standard output as soon as they are encountered: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr help comments-in-data - --skip-comments Ignore commented lines (prefixed by "#") - within the input. - --skip-comments-with {string} Ignore commented lines within input, with - specified prefix. - --pass-comments Immediately print commented lines (prefixed by "#") - within the input. - --pass-comments-with {string} Immediately print commented lines within input, with - specified prefix. - - Notes: - * Comments are only honored at the start of a line. - * In the absence of any of the above four options, comments are data like - any other text. - * When pass-comments is used, comment lines are written to standard output - immediately upon being read; they are not part of the record stream. Results - may be counterintuitive. A suggestion is to place comments at the start of - data files. - -Examples: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/budget.csv - # Asana -- here are the budget figures you asked for! - type,quantity - purple,456.78 - green,678.12 - orange,123.45 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --skip-comments --icsv --opprint sort -nr quantity data/budget.csv - type quantity - green 678.12 - purple 456.78 - orange 123.45 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --pass-comments --icsv --opprint sort -nr quantity data/budget.csv - # Asana -- here are the budget figures you asked for! - type quantity - green 678.12 - purple 456.78 - orange 123.45 diff --git a/docs6/file-formats.rst.in b/docs6/file-formats.rst.in deleted file mode 100644 index 5250411a0..000000000 --- a/docs6/file-formats.rst.in +++ /dev/null @@ -1,332 +0,0 @@ -File formats -================================================================ - -Miller handles name-indexed data using several formats: some you probably know by name, such as CSV, TSV, and JSON -- and other formats you're likely already seeing and using in your structured data. - -Additionally, Miller gives you the option of including comments within your data. - -Examples ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr help data-formats -GENRST_EOF - -.. _file-formats-csv: - -CSV/TSV/ASV/USV/etc. ----------------------------------------------------------------- - -When ``mlr`` is invoked with the ``--csv`` or ``--csvlite`` option, key names are found on the first record and values are taken from subsequent records. This includes the case of CSV-formatted files. See :doc:`record-heterogeneity` for how Miller handles changes of field names within a single data stream. - -Miller has record separator ``RS`` and field separator ``FS``, just as ``awk`` does. For TSV, use ``--fs tab``; to convert TSV to CSV, use ``--ifs tab --ofs comma``, etc. (See also :ref:`reference-separators`.) - -**TSV (tab-separated values):** the following are synonymous pairs: - -* ``--tsv`` and ``--csv --fs tab`` -* ``--itsv`` and ``--icsv --ifs tab`` -* ``--otsv`` and ``--ocsv --ofs tab`` -* ``--tsvlite`` and ``--csvlite --fs tab`` -* ``--itsvlite`` and ``--icsvlite --ifs tab`` -* ``--otsvlite`` and ``--ocsvlite --ofs tab`` - -**ASV (ASCII-separated values):** the flags ``--asv``, ``--iasv``, ``--oasv``, ``--asvlite``, ``--iasvlite``, and ``--oasvlite`` are analogous except they use ASCII FS and RS 0x1f and 0x1e, respectively. - -**USV (Unicode-separated values):** likewise, the flags ``--usv``, ``--iusv``, ``--ousv``, ``--usvlite``, ``--iusvlite``, and ``--ousvlite`` use Unicode FS and RS U+241F (UTF-8 0x0xe2909f) and U+241E (UTF-8 0xe2909e), respectively. - -Miller's ``--csv`` flag supports `RFC-4180 CSV `_. This includes CRLF line-terminators by default, regardless of platform. - -Here are the differences between CSV and CSV-lite: - -* CSV supports `RFC-4180 `_-style double-quoting, including the ability to have commas and/or LF/CRLF line-endings contained within an input field; CSV-lite does not. - -* CSV does not allow heterogeneous data; CSV-lite does (see also :doc:`record-heterogeneity`). - -* The CSV-lite input-reading code is fractionally more efficient than the CSV input-reader. - -Here are things they have in common: - -* The ability to specify record/field separators other than the default, e.g. CR-LF vs. LF, or tab instead of comma for TSV, and so on. - -* The ``--implicit-csv-header`` flag for input and the ``--headerless-csv-output`` flag for output. - -.. _file-formats-dkvp: - -DKVP: Key-value pairs ----------------------------------------------------------------- - -Miller's default file format is DKVP, for **delimited key-value pairs**. Example: - -GENRST_RUN_COMMAND -mlr cat data/small -GENRST_EOF - -Such data are easy to generate, e.g. in Ruby with - -GENRST_CARDIFY -puts "host=#{hostname},seconds=#{t2-t1},message=#{msg}" -GENRST_EOF - -GENRST_CARDIFY -puts mymap.collect{|k,v| "#{k}=#{v}"}.join(',') -GENRST_EOF - -or ``print`` statements in various languages, e.g. - -GENRST_CARDIFY -echo "type=3,user=$USER,date=$date\n"; -GENRST_EOF - -GENRST_CARDIFY -logger.log("type=3,user=$USER,date=$date\n"); -GENRST_EOF - -Fields lacking an IPS will have positional index (starting at 1) used as the key, as in NIDX format. For example, ``dish=7,egg=8,flint`` is parsed as ``"dish" => "7", "egg" => "8", "3" => "flint"`` and ``dish,egg,flint`` is parsed as ``"1" => "dish", "2" => "egg", "3" => "flint"``. - -As discussed in :doc:`record-heterogeneity`, Miller handles changes of field names within the same data stream. But using DKVP format this is particularly natural. One of my favorite use-cases for Miller is in application/server logs, where I log all sorts of lines such as - -GENRST_CARDIFY -resource=/path/to/file,loadsec=0.45,ok=true -record_count=100, resource=/path/to/file -resource=/some/other/path,loadsec=0.97,ok=false -GENRST_EOF - -etc. and I just log them as needed. Then later, I can use ``grep``, ``mlr --opprint group-like``, etc. -to analyze my logs. - -See :doc:`reference-main-io-options` regarding how to specify separators other than the default equals-sign and comma. - -.. _file-formats-nidx: - -NIDX: Index-numbered (toolkit style) ----------------------------------------------------------------- - -With ``--inidx --ifs ' ' --repifs``, Miller splits lines on whitespace and assigns integer field names starting with 1. - -This recapitulates Unix-toolkit behavior. - -Example with index-numbered output: - -GENRST_RUN_COMMAND -cat data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --onidx --ofs ' ' cat data/small -GENRST_EOF - -Example with index-numbered input: - -GENRST_RUN_COMMAND -cat data/mydata.txt -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --inidx --ifs ' ' --odkvp cat data/mydata.txt -GENRST_EOF - -Example with index-numbered input and output: - -GENRST_RUN_COMMAND -cat data/mydata.txt -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --nidx --fs ' ' --repifs cut -f 2,3 data/mydata.txt -GENRST_EOF - -.. _file-formats-json: - -Tabular JSON ----------------------------------------------------------------- - -JSON is a format which supports arbitrarily deep nesting of "objects" (hashmaps) and "arrays" (lists), while Miller is a tool for handling **tabular data** only. This means Miller cannot (and should not) handle arbitrary JSON. (Check out `jq `_.) - -But if you have tabular data represented in JSON then Miller can handle that for you. - -By *tabular JSON* I mean the data is either a sequence of one or more objects, or an array consisting of one or more orjects. Miller treats JSON objects as name-indexed records. - -Single-level JSON objects -^^^^^^^^^^^^^^^^^^^^^^^^^ - -An **array of single-level objects** is, quite simply, **a table**: - -GENRST_RUN_COMMAND -mlr --json head -n 2 then cut -f color,shape data/json-example-1.json -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --json --jvstack head -n 2 then cut -f color,u,v data/json-example-1.json -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --ijson --opprint stats1 -a mean,stddev,count -f u -g shape data/json-example-1.json -GENRST_EOF - -Nested JSON objects -^^^^^^^^^^^^^^^^^^^^^^^^^ - -Additionally, Miller can **tabularize nested objects by concatentating keys**: - -GENRST_RUN_COMMAND -mlr --json --jvstack head -n 2 data/json-example-2.json -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --ijson --opprint head -n 4 data/json-example-2.json -GENRST_EOF - -Note in particular that as far as Miller's ``put`` and ``filter``, as well as other I/O formats, are concerned, these are simply field names with colons in them: - -GENRST_RUN_COMMAND -mlr --json --jvstack head -n 1 \ - then put '${values:uv} = ${values:u} * ${values:v}' \ - data/json-example-2.json -GENRST_EOF - -Arrays -^^^^^^^^^^^^^^^^^^^^^^^^^ - -Arrays (TODO: update for Miller6) aren't supported in Miller's ``put``/``filter`` DSL. By default, JSON arrays are read in as integer-keyed maps. - -Suppose we have arrays like this in our input data: - -GENRST_RUN_COMMAND -cat data/json-example-3.json -GENRST_EOF - -Then integer indices (starting from 0 and counting up) are used as map keys: - -GENRST_RUN_COMMAND -mlr --ijson --oxtab cat data/json-example-3.json -GENRST_EOF - -When the data are written back out as JSON, field names are re-expanded as above, but what were arrays on input are now maps on output: - -GENRST_RUN_COMMAND -mlr --json --jvstack cat data/json-example-3.json -GENRST_EOF - -This is non-ideal, but it allows Miller (5.x release being latest as of this writing) to handle JSON arrays at all. - -You might also use ``mlr --json-skip-arrays-on-input`` or ``mlr --json-fatal-arrays-on-input``. - -To truly handle JSON, please use a JSON-processing tool such as `jq `_. - -Formatting JSON options -^^^^^^^^^^^^^^^^^^^^^^^^^ - -JSON isn't a parameterized format, so ``RS``, ``FS``, ``PS`` aren't specifiable. Nonetheless, you can do the following: - -* Use ``--jvstack`` to pretty-print JSON objects with multi-line (vertically stacked) spacing. By default, each Miller record (JSON object) is one per line. - -* Keystroke-savers: ``--jsonx`` simply means ``--json --jvstack``, and ``--ojsonx`` simply means ``--ojson --jvstack``. - -* Use ``--jlistwrap`` to print the sequence of JSON objects wrapped in an outermost ``[`` and ``]``. By default, these aren't printed. - -* Use ``--jquoteall`` to double-quote all object values. By default, integers, floating-point numbers, and booleans ``true`` and ``false`` are not double-quoted when they appear as JSON-object keys. - -* Use ``--jflatsep yourstringhere`` to specify the string used for key concatenation: this defaults to a single colon. - -Again, please see `jq `_ for a truly powerful, JSON-specific tool. - -.. _file-formats-pprint: - -PPRINT: Pretty-printed tabular ----------------------------------------------------------------- - -Miller's pretty-print format is like CSV, but column-aligned. For example, compare - -GENRST_RUN_COMMAND -mlr --ocsv cat data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint cat data/small -GENRST_EOF - -Note that while Miller is a line-at-a-time processor and retains input lines in memory only where necessary (e.g. for sort), pretty-print output requires it to accumulate all input lines (so that it can compute maximum column widths) before producing any output. This has two consequences: (a) pretty-print output won't work on ``tail -f`` contexts, where Miller will be waiting for an end-of-file marker which never arrives; (b) pretty-print output for large files is constrained by available machine memory. - -See :doc:`record-heterogeneity` for how Miller handles changes of field names within a single data stream. - -For output only (this isn't supported in the input-scanner as of 5.0.0) you can use ``--barred`` with pprint output format: - -GENRST_RUN_COMMAND -mlr --opprint --barred cat data/small -GENRST_EOF - -.. _file-formats-xtab: - -XTAB: Vertical tabular ----------------------------------------------------------------- - -This is perhaps most useful for looking a very wide and/or multi-column data which causes line-wraps on the screen (but see also -`ngrid `_ for an entirely different, very powerful option). Namely: - -GENRST_INCLUDE_ESCAPED(data/system-file-opprint-example.txt) - -GENRST_INCLUDE_ESCAPED(data/system-file-oxtab-example.txt) - -GENRST_INCLUDE_ESCAPED(data/system-file-ojson-example.txt) - -Markdown tabular ----------------------------------------------------------------- - -Markdown format looks like this: - -GENRST_RUN_COMMAND -mlr --omd cat data/small -GENRST_EOF - -which renders like this when dropped into various web tools (e.g. github comments): - -.. image:: pix/omd.png - -As of Miller 4.3.0, markdown format is supported only for output, not input. - -Data-conversion keystroke-savers ----------------------------------------------------------------- - -While you can do format conversion using ``mlr --icsv --ojson cat myfile.csv``, there are also keystroke-savers for this purpose, such as ``mlr --c2j cat myfile.csv``. For a complete list: - -GENRST_RUN_COMMAND -mlr help format-conversion -GENRST_EOF - -Autodetect of line endings ----------------------------------------------------------------- - -Default line endings (``--irs`` and ``--ors``) are ``'auto'`` which means **autodetect from the input file format**, as long as the input file(s) have lines ending in either LF (also known as linefeed, ``'\n'``, ``0x0a``, Unix-style) or CRLF (also known as carriage-return/linefeed pairs, ``'\r\n'``, ``0x0d 0x0a``, Windows style). - -**If both IRS and ORS are auto (which is the default) then LF input will lead to LF output and CRLF input will lead to CRLF output, regardless of the platform you're running on.** - -The line-ending autodetector triggers on the first line ending detected in the input stream. E.g. if you specify a CRLF-terminated file on the command line followed by an LF-terminated file then autodetected line endings will be CRLF. - -If you use ``--ors {something else}`` with (default or explicitly specified) ``--irs auto`` then line endings are autodetected on input and set to what you specify on output. - -If you use ``--irs {something else}`` with (default or explicitly specified) ``--ors auto`` then the output line endings used are LF on Unix/Linux/BSD/MacOSX, and CRLF on Windows. - -See also :ref:`reference-separators` for more information about record/field/pair separators. - -Comments in data ----------------------------------------------------------------- - -You can include comments within your data files, and either have them ignored, or passed directly through to the standard output as soon as they are encountered: - -GENRST_RUN_COMMAND -mlr help comments-in-data -GENRST_EOF - -Examples: - -GENRST_RUN_COMMAND -cat data/budget.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --skip-comments --icsv --opprint sort -nr quantity data/budget.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --pass-comments --icsv --opprint sort -nr quantity data/budget.csv -GENRST_EOF diff --git a/docs6/genrst-filter b/docs6/genrst-filter deleted file mode 100755 index 5f825742a..000000000 --- a/docs6/genrst-filter +++ /dev/null @@ -1,164 +0,0 @@ -#!/usr/bin/env ruby - -$us = File.basename $0 - -require 'getoptlong' -require 'fileutils' -require 'json' - -# ---------------------------------------------------------------- -# This is used to run live code for Miller Sphinx docs. -# * Edit foo.rst.in -# * Run this script to generate foo.rst -# * The caller should chmod 400 the foo.rst file -# * See README.md for more information. - -def main - input_handle = $stdin - output_handle = $stdout - - output_handle.puts("..") - output_handle.puts(" PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE.") - output_handle.puts("") - - while true - begin - content_line = input_handle.readline - - if content_line =~ /^GENRST_RUN_COMMAND$/ - cmd_lines = read_until_genrst_eof(input_handle) - run_command(cmd_lines, output_handle) - - elsif content_line =~ /^GENRST_CARDIFY$/ - lines = read_until_genrst_eof(input_handle) - write_card([], lines, output_handle) - - elsif content_line =~ /^GENRST_CARDIFY_HIGHLIGHT_ONE$/ - lines = read_until_genrst_eof(input_handle) - line1 = lines.shift - write_card([line1], lines, output_handle) - - elsif content_line =~ /^GENRST_RUN_COMMAND_TOLERATING_ERROR$/ - cmd_lines = read_until_genrst_eof(input_handle) - run_command_tolerating_error(cmd_lines, output_handle) - - elsif content_line =~ /^GENRST_SHOW_COMMAND$/ - cmd_lines = read_until_genrst_eof(input_handle) - show_command(cmd_lines, output_handle) - - elsif content_line =~ /^GENRST_INCLUDE_ESCAPED\(([^)]+)\)$/ - included_file_name = $1 - include_escaped(included_file_name, output_handle) - - elsif content_line =~ /^GENRST_INCLUDE_AND_RUN_ESCAPED\(([^)]+)\)$/ - included_file_name = $1 - cmd_lines = File.readlines(included_file_name).map{|line| line.chomp} - run_command(cmd_lines, output_handle) - - elsif content_line =~ /^GENRST_RUN_CONTENT_GENERATOR\(([^)]+)\)$/ - cmd = $1 - run_content_generator(cmd, output_handle) - - elsif content_line =~ /^GENRST/ - raise "Unhandled genrst line #{content_line}" - output_handle.write(content_line) - - else - output_handle.write(content_line) - end - rescue EOFError - break - end - end -end - -# ---------------------------------------------------------------- -def read_until_genrst_eof(input_handle) - begin - - lines = [] - while true - line = input_handle.readline.chomp - if line == 'GENRST_EOF' - break - end - lines << line - end - return lines - - rescue EOFError - $stderr.puts "$0: did not find GENRST_EOF" - exit 1 - end -end - -# ---------------------------------------------------------------- -# The command can be multi-line -def run_command(cmd_lines, output_handle) - cmd = cmd_lines.join("\n") - cmd_output = `#{cmd} 2>&1` - status = $?.to_i - if status != 0 - raise "\"#{cmd}\" exited with non-zero code #{status}." - end - write_card(cmd_lines, cmd_output.split(/\n/), output_handle) -end - -# ---------------------------------------------------------------- -def run_command_tolerating_error(cmd_lines, output_handle) - cmd = cmd_lines.join("\n") - cmd_output = `#{cmd} 2>&1` - write_card(cmd_lines, cmd_output.split(/\n/), output_handle) -end - -# ---------------------------------------------------------------- -def include_escaped(included_file_name, output_handle) - write_card([], File.readlines(included_file_name), output_handle).map{|line| line.chomp} -end - -# ---------------------------------------------------------------- -def show_command(cmd_lines, output_handle) - # The command can be multi-line - write_card(cmd_lines, [], output_handle) -end - -# ---------------------------------------------------------------- -def run_content_generator(cmd, output_handle) - cmd_output = `#{cmd} 2>&1` - status = $?.to_i - if status != 0 - raise "\"#{cmd}\" exited with non-zero code #{status}." - end - output_handle.puts(cmd_output) -end - -# ---------------------------------------------------------------- -def write_card(command_lines, output_lines, output_handle) - output_handle.puts(".. code-block:: none") - if command_lines.length > 0 - output_handle.puts(" :emphasize-lines: 1-#{command_lines.length}") # 'hll' in _static/*.css - end - output_handle.puts - - command_lines.each do |command_line| - # The callsite should do the "::", blank line, then this, then blank line - # in order to adhere to Sphinx code-block syntax. (Another option would be - # us here doing the ::, blank line, , then the content line, then the other - # blank line.) - output_handle.write(' ') # four leading spaces for Sphinx, on each line - output_handle.puts(command_line) - end - - output_lines.each do |output_line| - # The callsite should do the "::", blank line, then this, then blank line - # in order to adhere to Sphinx code-block syntax. (Another option would be - # us here doing the ::, blank line, , then the content line, then the other - # blank line.) - output_handle.write(' ') # four leading spaces for Sphinx, on each line - output_handle.puts(output_line) - end - -end - -# ================================================================ -main() diff --git a/docs6/genrsts b/docs6/genrsts deleted file mode 100755 index 971da3956..000000000 --- a/docs6/genrsts +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -# Run the live-code bits within the markup files. See README.md for details. - -if [ $# -ge 1 ]; then - names="$@" - names=$(echo "$names" | sed 's/\.rst\.in//g') -else - names=$(echo *.rst.in | sed 's/\.rst\.in//g') -fi - -for name in $names; do - echo Generating $name.rst - if [ -f $name.rst ]; then # Won't exist yet on first run - chmod u+w $name.rst - fi - genrst-filter < $name.rst.in > $name.rst - chmod 400 $name.rst -done diff --git a/docs6/index.rst b/docs6/index.rst deleted file mode 100644 index edfcfb03f..000000000 --- a/docs6/index.rst +++ /dev/null @@ -1,108 +0,0 @@ -Miller Documentation -==================== - -Getting started ----------------------------------------------------------------- - -.. toctree:: - :maxdepth: 1 - - introduction - 10min - keystroke-savers - programming-language - miller-on-windows - community - -Miller in more detail ----------------------------------------------------------------- - -.. toctree:: - :maxdepth: 1 - - features - feature-comparison - file-formats - record-heterogeneity - internationalization - output-colorization - customization - repl - new-in-miller-6 - contributing - -FAQs and recipes ----------------------------------------------------------------- - -.. toctree:: - :maxdepth: 1 - - csv-with-and-without-headers - shapes-of-data - operating-on-all-fields - special-symbols-and-formatting - dates-and-times - then-chaining - joins - shell-commands - data-diving-examples - log-processing-examples - sql-examples - data-cleaning-examples - statistics-examples - randomizing-examples - two-pass-algorithms - dkvp-examples - programming-examples - misc-examples - -Background ----------------------------------------------------------------- - -.. toctree:: - :maxdepth: 1 - - why - etymology - originality - performance - -Reference ----------------------------------------------------------------- - -.. toctree:: - :maxdepth: 1 - - reference-main-overview - reference-verbs - reference-main-io-options - reference-main-then-chaining - reference-main-auxiliary-commands - reference-main-data-types - reference-dsl-arrays - reference-main-null-data - reference-main-arithmetic - reference-main-regular-expressions - reference-main-env-vars - reference-main-online-help - reference-dsl - reference-dsl-syntax - reference-dsl-variables - reference-dsl-operators - reference-dsl-control-structures - reference-dsl-user-defined-functions - reference-dsl-builtin-functions - reference-dsl-output-statements - reference-dsl-unset-statements - reference-dsl-filter-statements - reference-dsl-errors - reference-dsl-complexity - manpage - release-docs - installation - build - -Index ----------------------------------------------------------------- - -* :ref:`search` diff --git a/docs6/installation.rst b/docs6/installation.rst deleted file mode 100644 index 6af3bb17d..000000000 --- a/docs6/installation.rst +++ /dev/null @@ -1,65 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Installation -================================================================ - -Prebuilt executables via package managers ----------------------------------------------------------------- - -*Note: Miller 6 is in pre-release so the above commands will get you Miller 5. -Once Miller 6 is released, the commands in this section will install Miller 6 for you. -Until then, please see the following sections for how to get Miller 6.* - -`Homebrew `_ installation support for OSX is available via - -.. code-block:: none - :emphasize-lines: 1-1 - - brew update && brew install miller - -...and also via `MacPorts `_: - -.. code-block:: none - :emphasize-lines: 1-1 - - sudo port selfupdate && sudo port install miller - -You may already have the ``mlr`` executable available in your platform's package manager on NetBSD, Debian Linux, Ubuntu Xenial and upward, Arch Linux, or perhaps other distributions. For example, on various Linux distributions you might do one of the following: - -.. code-block:: none - :emphasize-lines: 1-1 - - sudo apt-get install miller - -.. code-block:: none - :emphasize-lines: 1-1 - - sudo apt install miller - -.. code-block:: none - :emphasize-lines: 1-1 - - sudo yum install miller - -On Windows, Miller is available via `Chocolatey `_: - -.. code-block:: none - :emphasize-lines: 1-1 - - choco install miller - -Prebuilt executables via GitHub per release ----------------------------------------------------------------- - -Please see https://github.com/johnkerl/miller/releases where there are builds for OSX Yosemite, Linux x86-64 (dynamically linked), and Windows. - -Prebuilt executables via GitHub per commit ----------------------------------------------------------------- - -Miller is autobuilt for **Linux**, **MacOS**, and **Windows** using **GitHub Actions** on every commit (https://github.com/johnkerl/miller/actions): select the latest build and click _Artifacts_. (These are retained for 5 days after each commit.) - -Building from source ----------------------------------------------------------------- - -Please see :doc:`build`. diff --git a/docs6/installation.rst.in b/docs6/installation.rst.in deleted file mode 100644 index b6d98a9c1..000000000 --- a/docs6/installation.rst.in +++ /dev/null @@ -1,56 +0,0 @@ -Installation -================================================================ - -Prebuilt executables via package managers ----------------------------------------------------------------- - -*Note: Miller 6 is in pre-release so the above commands will get you Miller 5. -Once Miller 6 is released, the commands in this section will install Miller 6 for you. -Until then, please see the following sections for how to get Miller 6.* - -`Homebrew `_ installation support for OSX is available via - -GENRST_CARDIFY_HIGHLIGHT_ONE -brew update && brew install miller -GENRST_EOF - -...and also via `MacPorts `_: - -GENRST_CARDIFY_HIGHLIGHT_ONE -sudo port selfupdate && sudo port install miller -GENRST_EOF - -You may already have the ``mlr`` executable available in your platform's package manager on NetBSD, Debian Linux, Ubuntu Xenial and upward, Arch Linux, or perhaps other distributions. For example, on various Linux distributions you might do one of the following: - -GENRST_CARDIFY_HIGHLIGHT_ONE -sudo apt-get install miller -GENRST_EOF - -GENRST_CARDIFY_HIGHLIGHT_ONE -sudo apt install miller -GENRST_EOF - -GENRST_CARDIFY_HIGHLIGHT_ONE -sudo yum install miller -GENRST_EOF - -On Windows, Miller is available via `Chocolatey `_: - -GENRST_CARDIFY_HIGHLIGHT_ONE -choco install miller -GENRST_EOF - -Prebuilt executables via GitHub per release ----------------------------------------------------------------- - -Please see https://github.com/johnkerl/miller/releases where there are builds for OSX Yosemite, Linux x86-64 (dynamically linked), and Windows. - -Prebuilt executables via GitHub per commit ----------------------------------------------------------------- - -Miller is autobuilt for **Linux**, **MacOS**, and **Windows** using **GitHub Actions** on every commit (https://github.com/johnkerl/miller/actions): select the latest build and click _Artifacts_. (These are retained for 5 days after each commit.) - -Building from source ----------------------------------------------------------------- - -Please see :doc:`build`. diff --git a/docs6/internationalization.rst b/docs6/internationalization.rst deleted file mode 100644 index c8ca70874..000000000 --- a/docs6/internationalization.rst +++ /dev/null @@ -1,15 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Internationalization -================================================================ - -Miller handles ASCII and UTF-8 strings. (I have no plans to support UTF-16 or ISO-8859-1.) - -Support for internationalization includes: - -* Tabular output formats such pprint and xtab (see :doc:`file-formats`) are aligned correctly. -* The :ref:`reference-dsl-strlen` function correctly counts UTF-8 codepoints rather than bytes. -* The :ref:`reference-dsl-toupper`, :ref:`reference-dsl-tolower`, and :ref:`reference-dsl-capitalize` DSL functions operate within the capabilities of the Go libraries. - -Please file an issue at https://github.com/johnkerl/miller if you encounter bugs related to internationalization (or anything else for that matter). diff --git a/docs6/internationalization.rst.in b/docs6/internationalization.rst.in deleted file mode 100644 index d315430e8..000000000 --- a/docs6/internationalization.rst.in +++ /dev/null @@ -1,12 +0,0 @@ -Internationalization -================================================================ - -Miller handles ASCII and UTF-8 strings. (I have no plans to support UTF-16 or ISO-8859-1.) - -Support for internationalization includes: - -* Tabular output formats such pprint and xtab (see :doc:`file-formats`) are aligned correctly. -* The :ref:`reference-dsl-strlen` function correctly counts UTF-8 codepoints rather than bytes. -* The :ref:`reference-dsl-toupper`, :ref:`reference-dsl-tolower`, and :ref:`reference-dsl-capitalize` DSL functions operate within the capabilities of the Go libraries. - -Please file an issue at https://github.com/johnkerl/miller if you encounter bugs related to internationalization (or anything else for that matter). diff --git a/docs6/introduction.rst b/docs6/introduction.rst deleted file mode 100644 index 7263636f2..000000000 --- a/docs6/introduction.rst +++ /dev/null @@ -1,24 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Introduction -============ - -**Miller is a command-line tool for querying, shaping, and reformatting data files in various formats including CSV and JSON.** - -In several senses, Miller is more than one tool: - -**Format conversion:** You can convert CSV files to JSON, or vice versa, or -pretty-print your data horizontally or vertically to make it easier to read. - -**Data manipulation:** With a few keystrokes you can remove columns you don't care about -- or, make new ones using expressions like ``$rate = $units / $seconds``. - -**Pre-processing/post-processing vs standalone use:** You can use Miller to clean data files and put them into standard formats, perhaps in preparation to load them into a database or a hands-off data-processing pipeline. Or you can use it post-process and summary database-query output. As well, you can use Miller to explore and analyze your data interactively. - -**Compact verbs vs programming language:** For low-keystroking you can do things like ``mlr --csv sort -f name input.csv`` or ``mlr --json head -n 1 myfile.json``. The ``sort``, ``head``, etc are called *verbs*. They're analogs of familiar command-line tools like ``sort``, ``head``, and so on -- but they're aware of name-indexed, multi-line file formats like CSV and JSON. In addition, though, using Miller's ``put`` verb you can use programming-language statements for expressions like ``$rate = $units / $seconds`` which allow you to succintly express your own logic. - -**Multiple domains:** People use Miller for data analysis, data science, software engineering, devops/system-administration, journalism, scientific research, and more. - -In the following (color added for the illustration) you can see how CSV, tabular, JSON, and other **file formats** share a common theme which is **lists of key-value-pairs**. Miller embraces this common theme. - -.. image:: coverart/cover-combined.png diff --git a/docs6/introduction.rst.in b/docs6/introduction.rst.in deleted file mode 100644 index ebd7eab5b..000000000 --- a/docs6/introduction.rst.in +++ /dev/null @@ -1,21 +0,0 @@ -Introduction -============ - -**Miller is a command-line tool for querying, shaping, and reformatting data files in various formats including CSV and JSON.** - -In several senses, Miller is more than one tool: - -**Format conversion:** You can convert CSV files to JSON, or vice versa, or -pretty-print your data horizontally or vertically to make it easier to read. - -**Data manipulation:** With a few keystrokes you can remove columns you don't care about -- or, make new ones using expressions like ``$rate = $units / $seconds``. - -**Pre-processing/post-processing vs standalone use:** You can use Miller to clean data files and put them into standard formats, perhaps in preparation to load them into a database or a hands-off data-processing pipeline. Or you can use it post-process and summary database-query output. As well, you can use Miller to explore and analyze your data interactively. - -**Compact verbs vs programming language:** For low-keystroking you can do things like ``mlr --csv sort -f name input.csv`` or ``mlr --json head -n 1 myfile.json``. The ``sort``, ``head``, etc are called *verbs*. They're analogs of familiar command-line tools like ``sort``, ``head``, and so on -- but they're aware of name-indexed, multi-line file formats like CSV and JSON. In addition, though, using Miller's ``put`` verb you can use programming-language statements for expressions like ``$rate = $units / $seconds`` which allow you to succintly express your own logic. - -**Multiple domains:** People use Miller for data analysis, data science, software engineering, devops/system-administration, journalism, scientific research, and more. - -In the following (color added for the illustration) you can see how CSV, tabular, JSON, and other **file formats** share a common theme which is **lists of key-value-pairs**. Miller embraces this common theme. - -.. image:: coverart/cover-combined.png diff --git a/docs6/joins.rst b/docs6/joins.rst deleted file mode 100644 index 842f68908..000000000 --- a/docs6/joins.rst +++ /dev/null @@ -1,180 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Joins -===== - -Why am I not seeing all possible joins occur? ----------------------------------------------------------------- - -**This section describes behavior before Miller 5.1.0. As of 5.1.0, -u is the default.** - -For example, the right file here has nine records, and the left file should add in the ``hostname`` column -- so the join output should also have 9 records: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsvlite --opprint cat data/join-u-left.csv - hostname ipaddr - nadir.east.our.org 10.3.1.18 - zenith.west.our.org 10.3.1.27 - apoapsis.east.our.org 10.4.5.94 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsvlite --opprint cat data/join-u-right.csv - ipaddr timestamp bytes - 10.3.1.27 1448762579 4568 - 10.3.1.18 1448762578 8729 - 10.4.5.94 1448762579 17445 - 10.3.1.27 1448762589 12 - 10.3.1.18 1448762588 44558 - 10.4.5.94 1448762589 8899 - 10.3.1.27 1448762599 0 - 10.3.1.18 1448762598 73425 - 10.4.5.94 1448762599 12200 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsvlite --opprint join -s -j ipaddr -f data/join-u-left.csv data/join-u-right.csv - ipaddr hostname timestamp bytes - 10.3.1.27 zenith.west.our.org 1448762579 4568 - 10.4.5.94 apoapsis.east.our.org 1448762579 17445 - 10.4.5.94 apoapsis.east.our.org 1448762589 8899 - 10.4.5.94 apoapsis.east.our.org 1448762599 12200 - -The issue is that Miller's ``join``, by default (before 5.1.0), took input sorted (lexically ascending) by the sort keys on both the left and right files. This design decision was made intentionally to parallel the Unix/Linux system ``join`` command, which has the same semantics. The benefit of this default is that the joiner program can stream through the left and right files, needing to load neither entirely into memory. The drawback, of course, is that is requires sorted input. - -The solution (besides pre-sorting the input files on the join keys) is to simply use **mlr join -u** (which is now the default). This loads the left file entirely into memory (while the right file is still streamed one line at a time) and does all possible joins without requiring sorted input: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsvlite --opprint join -u -j ipaddr -f data/join-u-left.csv data/join-u-right.csv - ipaddr hostname timestamp bytes - 10.3.1.27 zenith.west.our.org 1448762579 4568 - 10.3.1.18 nadir.east.our.org 1448762578 8729 - 10.4.5.94 apoapsis.east.our.org 1448762579 17445 - 10.3.1.27 zenith.west.our.org 1448762589 12 - 10.3.1.18 nadir.east.our.org 1448762588 44558 - 10.4.5.94 apoapsis.east.our.org 1448762589 8899 - 10.3.1.27 zenith.west.our.org 1448762599 0 - 10.3.1.18 nadir.east.our.org 1448762598 73425 - 10.4.5.94 apoapsis.east.our.org 1448762599 12200 - -General advice is to make sure the left-file is relatively small, e.g. containing name-to-number mappings, while saving large amounts of data for the right file. - -How to rectangularize after joins with unpaired? ----------------------------------------------------------------- - -Suppose you have the following two data files: - -.. code-block:: none - - id,code - 3,0000ff - 2,00ff00 - 4,ff0000 - -.. code-block:: none - - id,color - 4,red - 2,green - -Joining on color the results are as expected: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv join -j id -f data/color-codes.csv data/color-names.csv - id,code,color - 4,ff0000,red - 2,00ff00,green - -However, if we ask for left-unpaireds, since there's no ``color`` column, we get a row not having the same column names as the other: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv join --ul -j id -f data/color-codes.csv data/color-names.csv - id,code,color - 4,ff0000,red - 2,00ff00,green - - id,code - 3,0000ff - -To fix this, we can use **unsparsify**: - -.. code-block:: none - :emphasize-lines: 1-3 - - mlr --csv join --ul -j id -f data/color-codes.csv \ - then unsparsify --fill-with "" \ - data/color-names.csv - id,code,color - 4,ff0000,red - 2,00ff00,green - 3,0000ff, - -Thanks to @aborruso for the tip! - -Doing multiple joins ----------------------------------------------------------------- - -Suppose we have the following data: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat multi-join/input.csv - id,task - 10,chop - 20,puree - 20,wash - 30,fold - 10,bake - 20,mix - 10,knead - 30,clean - -And we want to augment the ``id`` column with lookups from the following data files: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat multi-join/name-lookup.csv - id,name - 30,Alice - 10,Bob - 20,Carol - -.. code-block:: none - :emphasize-lines: 1-1 - - cat multi-join/status-lookup.csv - id,status - 30,occupied - 10,idle - 20,idle - -We can run the input file through multiple ``join`` commands in a ``then``-chain: - -.. code-block:: none - :emphasize-lines: 1-3 - - mlr --icsv --opprint join -f multi-join/name-lookup.csv -j id \ - then join -f multi-join/status-lookup.csv -j id \ - multi-join/input.csv - id status name task - 10 idle Bob chop - 20 idle Carol puree - 20 idle Carol wash - 30 occupied Alice fold - 10 idle Bob bake - 20 idle Carol mix - 10 idle Bob knead - 30 occupied Alice clean diff --git a/docs6/joins.rst.in b/docs6/joins.rst.in deleted file mode 100644 index 7cf89861a..000000000 --- a/docs6/joins.rst.in +++ /dev/null @@ -1,89 +0,0 @@ -Joins -===== - -Why am I not seeing all possible joins occur? ----------------------------------------------------------------- - -**This section describes behavior before Miller 5.1.0. As of 5.1.0, -u is the default.** - -For example, the right file here has nine records, and the left file should add in the ``hostname`` column -- so the join output should also have 9 records: - -GENRST_RUN_COMMAND -mlr --icsvlite --opprint cat data/join-u-left.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --icsvlite --opprint cat data/join-u-right.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --icsvlite --opprint join -s -j ipaddr -f data/join-u-left.csv data/join-u-right.csv -GENRST_EOF - -The issue is that Miller's ``join``, by default (before 5.1.0), took input sorted (lexically ascending) by the sort keys on both the left and right files. This design decision was made intentionally to parallel the Unix/Linux system ``join`` command, which has the same semantics. The benefit of this default is that the joiner program can stream through the left and right files, needing to load neither entirely into memory. The drawback, of course, is that is requires sorted input. - -The solution (besides pre-sorting the input files on the join keys) is to simply use **mlr join -u** (which is now the default). This loads the left file entirely into memory (while the right file is still streamed one line at a time) and does all possible joins without requiring sorted input: - -GENRST_RUN_COMMAND -mlr --icsvlite --opprint join -u -j ipaddr -f data/join-u-left.csv data/join-u-right.csv -GENRST_EOF - -General advice is to make sure the left-file is relatively small, e.g. containing name-to-number mappings, while saving large amounts of data for the right file. - -How to rectangularize after joins with unpaired? ----------------------------------------------------------------- - -Suppose you have the following two data files: - -GENRST_INCLUDE_ESCAPED(data/color-codes.csv) - -GENRST_INCLUDE_ESCAPED(data/color-names.csv) - -Joining on color the results are as expected: - -GENRST_RUN_COMMAND -mlr --csv join -j id -f data/color-codes.csv data/color-names.csv -GENRST_EOF - -However, if we ask for left-unpaireds, since there's no ``color`` column, we get a row not having the same column names as the other: - -GENRST_RUN_COMMAND -mlr --csv join --ul -j id -f data/color-codes.csv data/color-names.csv -GENRST_EOF - -To fix this, we can use **unsparsify**: - -GENRST_RUN_COMMAND -mlr --csv join --ul -j id -f data/color-codes.csv \ - then unsparsify --fill-with "" \ - data/color-names.csv -GENRST_EOF - -Thanks to @aborruso for the tip! - -Doing multiple joins ----------------------------------------------------------------- - -Suppose we have the following data: - -GENRST_RUN_COMMAND -cat multi-join/input.csv -GENRST_EOF - -And we want to augment the ``id`` column with lookups from the following data files: - -GENRST_RUN_COMMAND -cat multi-join/name-lookup.csv -GENRST_EOF - -GENRST_RUN_COMMAND -cat multi-join/status-lookup.csv -GENRST_EOF - -We can run the input file through multiple ``join`` commands in a ``then``-chain: - -GENRST_RUN_COMMAND -mlr --icsv --opprint join -f multi-join/name-lookup.csv -j id \ - then join -f multi-join/status-lookup.csv -j id \ - multi-join/input.csv -GENRST_EOF diff --git a/docs6/keystroke-savers.rst b/docs6/keystroke-savers.rst deleted file mode 100644 index d32b4a1e9..000000000 --- a/docs6/keystroke-savers.rst +++ /dev/null @@ -1,78 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Keystroke-savers -================ - -Short format specifiers -^^^^^^^^^^^^^^^^^^^^^^^ - -In our examples so far we've often made use of ``mlr --icsv --opprint`` or ``mlr --icsv --ojson``. These are such frequently occurring patterns that they have short options like **--c2p** and **--c2j**: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --c2p head -n 2 example.csv - color shape flag index quantity rate - yellow triangle true 11 43.6498 9.8870 - red square true 15 79.2778 0.0130 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --c2j head -n 2 example.csv - { - "color": "yellow", - "shape": "triangle", - "flag": true, - "index": 11, - "quantity": 43.6498, - "rate": 9.8870 - } - { - "color": "red", - "shape": "square", - "flag": true, - "index": 15, - "quantity": 79.2778, - "rate": 0.0130 - } - -You can get the full list here (TODO:linkify). - -File names up front -^^^^^^^^^^^^^^^^^^^ - -Already we saw that you can put the filename first using ``--from``. When you're interacting with your data at the command line, this makes it easier to up-arrow and append to the previous command: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --c2p --from example.csv sort -nr index then head -n 3 - color shape flag index quantity rate - purple square false 91 72.3735 8.2430 - yellow circle true 87 63.5058 8.3350 - yellow circle true 73 63.9785 4.2370 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --c2p --from example.csv sort -nr index then head -n 3 then cut -f shape,quantity - shape quantity - square 72.3735 - circle 63.5058 - circle 63.9785 - -If there's more than one input file, you can use ``--mfrom``, then however many file names, then ``--`` to indicate the end of your input-file-name list: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --c2p --mfrom data/*.csv -- sort -n index - -.mlrrc file -^^^^^^^^^^^ - -If you want the default file format for Miller to be CSV you can simply put ``--csv`` on a line by itself in your ``~/.mlrrc`` file. Then instead of ``mlr --csv cat example.csv`` you can just do ``mlr cat example.csv``. This is just the default, though, so ``mlr --opprint cat example.csv`` will still use default CSV format for input, and PPRINT (tabular) for output. - -You can read more about this at the :doc:`customization` page. diff --git a/docs6/keystroke-savers.rst.in b/docs6/keystroke-savers.rst.in deleted file mode 100644 index 6bf82fca5..000000000 --- a/docs6/keystroke-savers.rst.in +++ /dev/null @@ -1,43 +0,0 @@ -Keystroke-savers -================ - -Short format specifiers -^^^^^^^^^^^^^^^^^^^^^^^ - -In our examples so far we've often made use of ``mlr --icsv --opprint`` or ``mlr --icsv --ojson``. These are such frequently occurring patterns that they have short options like **--c2p** and **--c2j**: - -GENRST_RUN_COMMAND -mlr --c2p head -n 2 example.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --c2j head -n 2 example.csv -GENRST_EOF - -You can get the full list here (TODO:linkify). - -File names up front -^^^^^^^^^^^^^^^^^^^ - -Already we saw that you can put the filename first using ``--from``. When you're interacting with your data at the command line, this makes it easier to up-arrow and append to the previous command: - -GENRST_RUN_COMMAND -mlr --c2p --from example.csv sort -nr index then head -n 3 -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --c2p --from example.csv sort -nr index then head -n 3 then cut -f shape,quantity -GENRST_EOF - -If there's more than one input file, you can use ``--mfrom``, then however many file names, then ``--`` to indicate the end of your input-file-name list: - -GENRST_SHOW_COMMAND -mlr --c2p --mfrom data/*.csv -- sort -n index -GENRST_EOF - -.mlrrc file -^^^^^^^^^^^ - -If you want the default file format for Miller to be CSV you can simply put ``--csv`` on a line by itself in your ``~/.mlrrc`` file. Then instead of ``mlr --csv cat example.csv`` you can just do ``mlr cat example.csv``. This is just the default, though, so ``mlr --opprint cat example.csv`` will still use default CSV format for input, and PPRINT (tabular) for output. - -You can read more about this at the :doc:`customization` page. diff --git a/docs6/log-processing-examples.rst b/docs6/log-processing-examples.rst deleted file mode 100644 index 99c7866a9..000000000 --- a/docs6/log-processing-examples.rst +++ /dev/null @@ -1,217 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Log-processing examples -================================================================ - -Another of my favorite use-cases for Miller is doing ad-hoc processing of log-file data. Here's where DKVP format really shines: one, since the field names and field values are present on every line, every line stands on its own. That means you can ``grep`` or what have you. Also it means not every line needs to have the same list of field names ("schema"). - -Generating and aggregating log-file output ----------------------------------------------------------------- - -Again, all the examples in the CSV section apply here -- just change the input-format flags. But there's more you can do when not all the records have the same shape. - -Writing a program -- in any language whatsoever -- you can have it print out log lines as it goes along, with items for various events jumbled together. After the program has finished running you can sort it all out, filter it, analyze it, and learn from it. - -Suppose your program has printed something like this (`log.txt <./log.txt>`_): - -.. code-block:: none - :emphasize-lines: 1-1 - - cat log.txt - op=enter,time=1472819681 - op=cache,type=A9,hit=0 - op=cache,type=A4,hit=1 - time=1472819690,batch_size=100,num_filtered=237 - op=cache,type=A1,hit=1 - op=cache,type=A9,hit=0 - op=cache,type=A1,hit=1 - op=cache,type=A9,hit=0 - op=cache,type=A9,hit=0 - op=cache,type=A1,hit=1 - time=1472819705,batch_size=100,num_filtered=348 - op=cache,type=A4,hit=1 - op=cache,type=A9,hit=0 - op=cache,type=A9,hit=0 - op=cache,type=A9,hit=0 - op=cache,type=A9,hit=0 - op=cache,type=A4,hit=1 - time=1472819713,batch_size=100,num_filtered=493 - op=cache,type=A9,hit=1 - op=cache,type=A1,hit=1 - op=cache,type=A9,hit=0 - op=cache,type=A9,hit=0 - op=cache,type=A9,hit=1 - time=1472819720,batch_size=100,num_filtered=554 - op=cache,type=A1,hit=0 - op=cache,type=A4,hit=1 - op=cache,type=A9,hit=0 - op=cache,type=A9,hit=0 - op=cache,type=A9,hit=0 - op=cache,type=A4,hit=0 - op=cache,type=A4,hit=0 - op=cache,type=A9,hit=0 - time=1472819736,batch_size=100,num_filtered=612 - op=cache,type=A1,hit=1 - op=cache,type=A9,hit=0 - op=cache,type=A9,hit=0 - op=cache,type=A9,hit=0 - op=cache,type=A9,hit=0 - op=cache,type=A4,hit=1 - op=cache,type=A1,hit=1 - op=cache,type=A9,hit=0 - op=cache,type=A9,hit=0 - time=1472819742,batch_size=100,num_filtered=728 - -Each print statement simply contains local information: the current timestamp, whether a particular cache was hit or not, etc. Then using either the system ``grep`` command, or Miller's ``having-fields``, or ``is_present``, we can pick out the parts we want and analyze them: - -.. code-block:: none - :emphasize-lines: 1-2 - - grep op=cache log.txt \ - | mlr --idkvp --opprint stats1 -a mean -f hit -g type then sort -f type - type hit_mean - A1 0.8571428571428571 - A4 0.7142857142857143 - A9 0.09090909090909091 - -.. code-block:: none - :emphasize-lines: 1-4 - - mlr --from log.txt --opprint \ - filter 'is_present($batch_size)' \ - then step -a delta -f time,num_filtered \ - then sec2gmt time - time batch_size num_filtered time_delta num_filtered_delta - 2016-09-02T12:34:50Z 100 237 0 0 - 2016-09-02T12:35:05Z 100 348 15 111 - 2016-09-02T12:35:13Z 100 493 8 145 - 2016-09-02T12:35:20Z 100 554 7 61 - 2016-09-02T12:35:36Z 100 612 16 58 - 2016-09-02T12:35:42Z 100 728 6 116 - -Alternatively, we can simply group the similar data for a better look: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint group-like log.txt - op time - enter 1472819681 - - op type hit - cache A9 0 - cache A4 1 - cache A1 1 - cache A9 0 - cache A1 1 - cache A9 0 - cache A9 0 - cache A1 1 - cache A4 1 - cache A9 0 - cache A9 0 - cache A9 0 - cache A9 0 - cache A4 1 - cache A9 1 - cache A1 1 - cache A9 0 - cache A9 0 - cache A9 1 - cache A1 0 - cache A4 1 - cache A9 0 - cache A9 0 - cache A9 0 - cache A4 0 - cache A4 0 - cache A9 0 - cache A1 1 - cache A9 0 - cache A9 0 - cache A9 0 - cache A9 0 - cache A4 1 - cache A1 1 - cache A9 0 - cache A9 0 - - time batch_size num_filtered - 1472819690 100 237 - 1472819705 100 348 - 1472819713 100 493 - 1472819720 100 554 - 1472819736 100 612 - 1472819742 100 728 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint group-like then sec2gmt time log.txt - op time - enter 2016-09-02T12:34:41Z - - op type hit - cache A9 0 - cache A4 1 - cache A1 1 - cache A9 0 - cache A1 1 - cache A9 0 - cache A9 0 - cache A1 1 - cache A4 1 - cache A9 0 - cache A9 0 - cache A9 0 - cache A9 0 - cache A4 1 - cache A9 1 - cache A1 1 - cache A9 0 - cache A9 0 - cache A9 1 - cache A1 0 - cache A4 1 - cache A9 0 - cache A9 0 - cache A9 0 - cache A4 0 - cache A4 0 - cache A9 0 - cache A1 1 - cache A9 0 - cache A9 0 - cache A9 0 - cache A9 0 - cache A4 1 - cache A1 1 - cache A9 0 - cache A9 0 - - time batch_size num_filtered - 2016-09-02T12:34:50Z 100 237 - 2016-09-02T12:35:05Z 100 348 - 2016-09-02T12:35:13Z 100 493 - 2016-09-02T12:35:20Z 100 554 - 2016-09-02T12:35:36Z 100 612 - 2016-09-02T12:35:42Z 100 728 - -Parsing log-file output ----------------------------------------------------------------- - -This, of course, depends highly on what's in your log files. But, as an example, suppose you have log-file lines such as - -.. code-block:: none - - 2015-10-08 08:29:09,445 INFO com.company.path.to.ClassName @ [sometext] various/sorts/of data {& punctuation} hits=1 status=0 time=2.378 - -I prefer to pre-filter with ``grep`` and/or ``sed`` to extract the structured text, then hand that to Miller. Example: - -.. code-block:: none - :emphasize-lines: 1-3 - - grep 'various sorts' *.log \ - | sed 's/.*} //' \ - | mlr --fs space --repifs --oxtab stats1 -a min,p10,p50,p90,max -f time -g status diff --git a/docs6/log-processing-examples.rst.in b/docs6/log-processing-examples.rst.in deleted file mode 100644 index e52ce3f31..000000000 --- a/docs6/log-processing-examples.rst.in +++ /dev/null @@ -1,50 +0,0 @@ -Log-processing examples -================================================================ - -Another of my favorite use-cases for Miller is doing ad-hoc processing of log-file data. Here's where DKVP format really shines: one, since the field names and field values are present on every line, every line stands on its own. That means you can ``grep`` or what have you. Also it means not every line needs to have the same list of field names ("schema"). - -Generating and aggregating log-file output ----------------------------------------------------------------- - -Again, all the examples in the CSV section apply here -- just change the input-format flags. But there's more you can do when not all the records have the same shape. - -Writing a program -- in any language whatsoever -- you can have it print out log lines as it goes along, with items for various events jumbled together. After the program has finished running you can sort it all out, filter it, analyze it, and learn from it. - -Suppose your program has printed something like this (`log.txt <./log.txt>`_): - -GENRST_RUN_COMMAND -cat log.txt -GENRST_EOF - -Each print statement simply contains local information: the current timestamp, whether a particular cache was hit or not, etc. Then using either the system ``grep`` command, or Miller's ``having-fields``, or ``is_present``, we can pick out the parts we want and analyze them: - -GENRST_INCLUDE_AND_RUN_ESCAPED(10-1.sh) - -GENRST_INCLUDE_AND_RUN_ESCAPED(10-2.sh) - -Alternatively, we can simply group the similar data for a better look: - -GENRST_RUN_COMMAND -mlr --opprint group-like log.txt -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint group-like then sec2gmt time log.txt -GENRST_EOF - -Parsing log-file output ----------------------------------------------------------------- - -This, of course, depends highly on what's in your log files. But, as an example, suppose you have log-file lines such as - -GENRST_CARDIFY -2015-10-08 08:29:09,445 INFO com.company.path.to.ClassName @ [sometext] various/sorts/of data {& punctuation} hits=1 status=0 time=2.378 -GENRST_EOF - -I prefer to pre-filter with ``grep`` and/or ``sed`` to extract the structured text, then hand that to Miller. Example: - -GENRST_SHOW_COMMAND -grep 'various sorts' *.log \ - | sed 's/.*} //' \ - | mlr --fs space --repifs --oxtab stats1 -a min,p10,p50,p90,max -f time -g status -GENRST_EOF diff --git a/docs6/manpage.rst b/docs6/manpage.rst deleted file mode 100644 index 34d6fa074..000000000 --- a/docs6/manpage.rst +++ /dev/null @@ -1,2381 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Manpage -================================================================ - -This is simply a copy of what you should see on running **man mlr** at a command prompt, once Miller is installed on your system. - -.. code-block:: none - - MILLER(1) MILLER(1) - - - - NAME - miller - like awk, sed, cut, join, and sort for name-indexed data such - as CSV and tabular JSON. - - SYNOPSIS - Usage: mlr [I/O options] {verb} [verb-dependent options ...] {zero or - more file names} - - - DESCRIPTION - Miller operates on key-value-pair data while the familiar Unix tools - operate on integer-indexed fields: if the natural data structure for - the latter is the array, then Miller's natural data structure is the - insertion-ordered hash map. This encompasses a variety of data - formats, including but not limited to the familiar CSV, TSV, and JSON. - (Miller can handle positionally-indexed data as a special case.) This - manpage documents Miller v5.10.1. - - EXAMPLES - COMMAND-LINE SYNTAX - mlr --csv cut -f hostname,uptime mydata.csv - mlr --tsv --rs lf filter '$status != "down" && $upsec >= 10000' *.tsv - mlr --nidx put '$sum = $7 < 0.0 ? 3.5 : $7 + 2.1*$8' *.dat - grep -v '^#' /etc/group | mlr --ifs : --nidx --opprint label group,pass,gid,member then sort -f group - mlr join -j account_id -f accounts.dat then group-by account_name balances.dat - mlr --json put '$attr = sub($attr, "([0-9]+)_([0-9]+)_.*", "\1:\2")' data/*.json - mlr stats1 -a min,mean,max,p10,p50,p90 -f flag,u,v data/* - mlr stats2 -a linreg-pca -f u,v -g shape data/* - mlr put -q '@sum[$a][$b] += $x; end {emit @sum, "a", "b"}' data/* - mlr --from estimates.tbl put ' - for (k,v in $*) { - if (is_numeric(v) && k =~ "^[t-z].*$") { - $sum += v; $count += 1 - } - } - $mean = $sum / $count # no assignment if count unset' - mlr --from infile.dat put -f analyze.mlr - mlr --from infile.dat put 'tee > "./taps/data-".$a."-".$b, $*' - mlr --from infile.dat put 'tee | "gzip > ./taps/data-".$a."-".$b.".gz", $*' - mlr --from infile.dat put -q '@v=$*; dump | "jq .[]"' - mlr --from infile.dat put '(NR % 1000 == 0) { print > stderr, "Checkpoint ".NR}' - - DATA FORMATS - DKVP: delimited key-value pairs (Miller default format) - +---------------------+ - | apple=1,bat=2,cog=3 | Record 1: "apple" => "1", "bat" => "2", "cog" => "3" - | dish=7,egg=8,flint | Record 2: "dish" => "7", "egg" => "8", "3" => "flint" - +---------------------+ - - NIDX: implicitly numerically indexed (Unix-toolkit style) - +---------------------+ - | the quick brown | Record 1: "1" => "the", "2" => "quick", "3" => "brown" - | fox jumped | Record 2: "1" => "fox", "2" => "jumped" - +---------------------+ - - CSV/CSV-lite: comma-separated values with separate header line - +---------------------+ - | apple,bat,cog | - | 1,2,3 | Record 1: "apple => "1", "bat" => "2", "cog" => "3" - | 4,5,6 | Record 2: "apple" => "4", "bat" => "5", "cog" => "6" - +---------------------+ - - Tabular JSON: nested objects are supported, although arrays within them are not: - +---------------------+ - | { | - | "apple": 1, | Record 1: "apple" => "1", "bat" => "2", "cog" => "3" - | "bat": 2, | - | "cog": 3 | - | } | - | { | - | "dish": { | Record 2: "dish:egg" => "7", "dish:flint" => "8", "garlic" => "" - | "egg": 7, | - | "flint": 8 | - | }, | - | "garlic": "" | - | } | - +---------------------+ - - PPRINT: pretty-printed tabular - +---------------------+ - | apple bat cog | - | 1 2 3 | Record 1: "apple => "1", "bat" => "2", "cog" => "3" - | 4 5 6 | Record 2: "apple" => "4", "bat" => "5", "cog" => "6" - +---------------------+ - - XTAB: pretty-printed transposed tabular - +---------------------+ - | apple 1 | Record 1: "apple" => "1", "bat" => "2", "cog" => "3" - | bat 2 | - | cog 3 | - | | - | dish 7 | Record 2: "dish" => "7", "egg" => "8" - | egg 8 | - +---------------------+ - - Markdown tabular (supported for output only): - +-----------------------+ - | | apple | bat | cog | | - | | --- | --- | --- | | - | | 1 | 2 | 3 | | Record 1: "apple => "1", "bat" => "2", "cog" => "3" - | | 4 | 5 | 6 | | Record 2: "apple" => "4", "bat" => "5", "cog" => "6" - +-----------------------+ - - OPTIONS - In the following option flags, the version with "i" designates the - input stream, "o" the output stream, and the version without prefix - sets the option for both input and output stream. For example: --irs - sets the input record separator, --ors the output record separator, and - --rs sets both the input and output separator to the given value. - - HELP OPTIONS - -h or --help Show this message. - --version Show the software version. - {verb name} --help Show verb-specific help. - --help-all-verbs Show help on all verbs. - -l or --list-all-verbs List only verb names. - -L List only verb names, one per line. - -f or --help-all-functions Show help on all built-in functions. - -F Show a bare listing of built-in functions by name. - -k or --help-all-keywords Show help on all keywords. - -K Show a bare listing of keywords by name. - - VERB LIST - altkv bar bootstrap cat check clean-whitespace count count-distinct - count-similar cut decimate fill-down filter format-values fraction grep - group-by group-like having-fields head histogram join label least-frequent - merge-fields most-frequent nest nothing put regularize remove-empty-columns - rename reorder repeat reshape sample sec2gmt sec2gmtdate seqgen shuffle - skip-trivial-records sort sort-within-records stats1 stats2 step tac tail tee - top uniq unsparsify - - FUNCTION LIST - + + - - * / // .+ .+ .- .- .* ./ .// % ** | ^ & ~ << >> bitcount == != =~ !=~ - > >= < <= && || ^^ ! ? : . gsub regextract regextract_or_else strlen sub ssub - substr tolower toupper truncate capitalize lstrip rstrip strip - collapse_whitespace clean_whitespace system abs acos acosh asin asinh atan - atan2 atanh cbrt ceil cos cosh erf erfc exp expm1 floor invqnorm log log10 - log1p logifit madd max mexp min mmul msub pow qnorm round roundm sgn sin sinh - sqrt tan tanh urand urandrange urand32 urandint dhms2fsec dhms2sec fsec2dhms - fsec2hms gmt2sec localtime2sec hms2fsec hms2sec sec2dhms sec2gmt sec2gmt - sec2gmtdate sec2localtime sec2localtime sec2localdate sec2hms strftime - strftime_local strptime strptime_local systime is_absent is_bool is_boolean - is_empty is_empty_map is_float is_int is_map is_nonempty_map is_not_empty - is_not_map is_not_null is_null is_numeric is_present is_string - asserting_absent asserting_bool asserting_boolean asserting_empty - asserting_empty_map asserting_float asserting_int asserting_map - asserting_nonempty_map asserting_not_empty asserting_not_map - asserting_not_null asserting_null asserting_numeric asserting_present - asserting_string boolean float fmtnum hexfmt int string typeof depth haskey - joink joinkv joinv leafcount length mapdiff mapexcept mapselect mapsum splitkv - splitkvx splitnv splitnvx - - Please use "mlr --help-function {function name}" for function-specific help. - - I/O FORMATTING - --idkvp --odkvp --dkvp Delimited key-value pairs, e.g "a=1,b=2" - (this is Miller's default format). - - --inidx --onidx --nidx Implicitly-integer-indexed fields - (Unix-toolkit style). - -T Synonymous with "--nidx --fs tab". - - --icsv --ocsv --csv Comma-separated value (or tab-separated - with --fs tab, etc.) - - --itsv --otsv --tsv Keystroke-savers for "--icsv --ifs tab", - "--ocsv --ofs tab", "--csv --fs tab". - --iasv --oasv --asv Similar but using ASCII FS 0x1f and RS 0x1e - --iusv --ousv --usv Similar but using Unicode FS U+241F (UTF-8 0xe2909f) - and RS U+241E (UTF-8 0xe2909e) - - --icsvlite --ocsvlite --csvlite Comma-separated value (or tab-separated - with --fs tab, etc.). The 'lite' CSV does not handle - RFC-CSV double-quoting rules; is slightly faster; - and handles heterogeneity in the input stream via - empty newline followed by new header line. See also - http://johnkerl.org/miller/doc/file-formats.html#CSV/TSV/etc. - - --itsvlite --otsvlite --tsvlite Keystroke-savers for "--icsvlite --ifs tab", - "--ocsvlite --ofs tab", "--csvlite --fs tab". - -t Synonymous with --tsvlite. - --iasvlite --oasvlite --asvlite Similar to --itsvlite et al. but using ASCII FS 0x1f and RS 0x1e - --iusvlite --ousvlite --usvlite Similar to --itsvlite et al. but using Unicode FS U+241F (UTF-8 0xe2909f) - and RS U+241E (UTF-8 0xe2909e) - - --ipprint --opprint --pprint Pretty-printed tabular (produces no - output until all input is in). - --right Right-justifies all fields for PPRINT output. - --barred Prints a border around PPRINT output - (only available for output). - - --omd Markdown-tabular (only available for output). - - --ixtab --oxtab --xtab Pretty-printed vertical-tabular. - --xvright Right-justifies values for XTAB format. - - --ijson --ojson --json JSON tabular: sequence or list of one-level - maps: {...}{...} or [{...},{...}]. - --json-map-arrays-on-input JSON arrays are unmillerable. --json-map-arrays-on-input - --json-skip-arrays-on-input is the default: arrays are converted to integer-indexed - --json-fatal-arrays-on-input maps. The other two options cause them to be skipped, or - to be treated as errors. Please use the jq tool for full - JSON (pre)processing. - --jvstack Put one key-value pair per line for JSON - output. - --jsonx --ojsonx Keystroke-savers for --json --jvstack - --jsonx --ojsonx and --ojson --jvstack, respectively. - --jlistwrap Wrap JSON output in outermost [ ]. - --jknquoteint Do not quote non-string map keys in JSON output. - --jvquoteall Quote map values in JSON output, even if they're - numeric. - --jflatsep {string} Separator for flattening multi-level JSON keys, - e.g. '{"a":{"b":3}}' becomes a:b => 3 for - non-JSON formats. Defaults to :. - - -p is a keystroke-saver for --nidx --fs space --repifs - - Examples: --csv for CSV-formatted input and output; --idkvp --opprint for - DKVP-formatted input and pretty-printed output. - - Please use --iformat1 --oformat2 rather than --format1 --oformat2. - The latter sets up input and output flags for format1, not all of which - are overridden in all cases by setting output format to format2. - - COMMENTS IN DATA - --skip-comments Ignore commented lines (prefixed by "#") - within the input. - --skip-comments-with {string} Ignore commented lines within input, with - specified prefix. - --pass-comments Immediately print commented lines (prefixed by "#") - within the input. - --pass-comments-with {string} Immediately print commented lines within input, with - specified prefix. - Notes: - * Comments are only honored at the start of a line. - * In the absence of any of the above four options, comments are data like - any other text. - * When pass-comments is used, comment lines are written to standard output - immediately upon being read; they are not part of the record stream. - Results may be counterintuitive. A suggestion is to place comments at the - start of data files. - - FORMAT-CONVERSION KEYSTROKE-SAVERS - As keystroke-savers for format-conversion you may use the following: - --c2t --c2d --c2n --c2j --c2x --c2p --c2m - --t2c --t2d --t2n --t2j --t2x --t2p --t2m - --d2c --d2t --d2n --d2j --d2x --d2p --d2m - --n2c --n2t --n2d --n2j --n2x --n2p --n2m - --j2c --j2t --j2d --j2n --j2x --j2p --j2m - --x2c --x2t --x2d --x2n --x2j --x2p --x2m - --p2c --p2t --p2d --p2n --p2j --p2x --p2m - The letters c t d n j x p m refer to formats CSV, TSV, DKVP, NIDX, JSON, XTAB, - PPRINT, and markdown, respectively. Note that markdown format is available for - output only. - - COMPRESSED I/O - --prepipe {command} This allows Miller to handle compressed inputs. You can do - without this for single input files, e.g. "gunzip < myfile.csv.gz | mlr ...". - - However, when multiple input files are present, between-file separations are - lost; also, the FILENAME variable doesn't iterate. Using --prepipe you can - specify an action to be taken on each input file. This pre-pipe command must - be able to read from standard input; it will be invoked with - {command} < {filename}. - Examples: - mlr --prepipe 'gunzip' - mlr --prepipe 'zcat -cf' - mlr --prepipe 'xz -cd' - mlr --prepipe cat - mlr --prepipe-gunzip - mlr --prepipe-zcat - Note that this feature is quite general and is not limited to decompression - utilities. You can use it to apply per-file filters of your choice. - For output compression (or other) utilities, simply pipe the output: - mlr ... | {your compression command} - - There are shorthands --prepipe-zcat and --prepipe-gunzip which are - valid in .mlrrc files. The --prepipe flag is not valid in .mlrrc - files since that would put execution of the prepipe command under - control of the .mlrrc file. - - SEPARATORS - --rs --irs --ors Record separators, e.g. 'lf' or '\r\n' - --fs --ifs --ofs --repifs Field separators, e.g. comma - --ps --ips --ops Pair separators, e.g. equals sign - - Notes about line endings: - * Default line endings (--irs and --ors) are "auto" which means autodetect from - the input file format, as long as the input file(s) have lines ending in either - LF (also known as linefeed, '\n', 0x0a, Unix-style) or CRLF (also known as - carriage-return/linefeed pairs, '\r\n', 0x0d 0x0a, Windows style). - * If both irs and ors are auto (which is the default) then LF input will lead to LF - output and CRLF input will lead to CRLF output, regardless of the platform you're - running on. - * The line-ending autodetector triggers on the first line ending detected in the input - stream. E.g. if you specify a CRLF-terminated file on the command line followed by an - LF-terminated file then autodetected line endings will be CRLF. - * If you use --ors {something else} with (default or explicitly specified) --irs auto - then line endings are autodetected on input and set to what you specify on output. - * If you use --irs {something else} with (default or explicitly specified) --ors auto - then the output line endings used are LF on Unix/Linux/BSD/MacOSX, and CRLF on Windows. - - Notes about all other separators: - * IPS/OPS are only used for DKVP and XTAB formats, since only in these formats - do key-value pairs appear juxtaposed. - * IRS/ORS are ignored for XTAB format. Nominally IFS and OFS are newlines; - XTAB records are separated by two or more consecutive IFS/OFS -- i.e. - a blank line. Everything above about --irs/--ors/--rs auto becomes --ifs/--ofs/--fs - auto for XTAB format. (XTAB's default IFS/OFS are "auto".) - * OFS must be single-character for PPRINT format. This is because it is used - with repetition for alignment; multi-character separators would make - alignment impossible. - * OPS may be multi-character for XTAB format, in which case alignment is - disabled. - * TSV is simply CSV using tab as field separator ("--fs tab"). - * FS/PS are ignored for markdown format; RS is used. - * All FS and PS options are ignored for JSON format, since they are not relevant - to the JSON format. - * You can specify separators in any of the following ways, shown by example: - - Type them out, quoting as necessary for shell escapes, e.g. - "--fs '|' --ips :" - - C-style escape sequences, e.g. "--rs '\r\n' --fs '\t'". - - To avoid backslashing, you can use any of the following names: - cr crcr newline lf lflf crlf crlfcrlf tab space comma pipe slash colon semicolon equals - * Default separators by format: - File format RS FS PS - gen N/A (N/A) (N/A) - dkvp auto , = - json auto (N/A) (N/A) - nidx auto space (N/A) - csv auto , (N/A) - csvlite auto , (N/A) - markdown auto (N/A) (N/A) - pprint auto space (N/A) - xtab (N/A) auto space - - CSV-SPECIFIC OPTIONS - --implicit-csv-header Use 1,2,3,... as field labels, rather than from line 1 - of input files. Tip: combine with "label" to recreate - missing headers. - --allow-ragged-csv-input|--ragged If a data line has fewer fields than the header line, - fill remaining keys with empty string. If a data line has more - fields than the header line, use integer field labels as in - the implicit-header case. - --headerless-csv-output Print only CSV data lines. - -N Keystroke-saver for --implicit-csv-header --headerless-csv-output. - - DOUBLE-QUOTING FOR CSV/CSVLITE OUTPUT - --quote-all Wrap all fields in double quotes - --quote-none Do not wrap any fields in double quotes, even if they have - OFS or ORS in them - --quote-minimal Wrap fields in double quotes only if they have OFS or ORS - in them (default) - --quote-numeric Wrap fields in double quotes only if they have numbers - in them - --quote-original Wrap fields in double quotes if and only if they were - quoted on input. This isn't sticky for computed fields: - e.g. if fields a and b were quoted on input and you do - "put '$c = $a . $b'" then field c won't inherit a or b's - was-quoted-on-input flag. - - NUMERICAL FORMATTING - --ofmt {format} E.g. %.18lf, %.0lf. Please use sprintf-style codes for - double-precision. Applies to verbs which compute new - values, e.g. put, stats1, stats2. See also the fmtnum - function within mlr put (mlr --help-all-functions). - Defaults to %lf. - - OTHER OPTIONS - --seed {n} with n of the form 12345678 or 0xcafefeed. For put/filter - urand()/urandint()/urand32(). - --nr-progress-mod {m}, with m a positive integer: print filename and record - count to stderr every m input records. - --from {filename} Use this to specify an input file before the verb(s), - rather than after. May be used more than once. Example: - "mlr --from a.dat --from b.dat cat" is the same as - "mlr cat a.dat b.dat". - -n Process no input files, nor standard input either. Useful - for mlr put with begin/end statements only. (Same as --from - /dev/null.) Also useful in "mlr -n put -v '...'" for - analyzing abstract syntax trees (if that's your thing). - -I Process files in-place. For each file name on the command - line, output is written to a temp file in the same - directory, which is then renamed over the original. Each - file is processed in isolation: if the output format is - CSV, CSV headers will be present in each output file; - statistics are only over each file's own records; and so on. - - THEN-CHAINING - Output of one verb may be chained as input to another using "then", e.g. - mlr stats1 -a min,mean,max -f flag,u,v -g color then sort -f color - - AUXILIARY COMMANDS - Miller has a few otherwise-standalone executables packaged within it. - They do not participate in any other parts of Miller. - Available subcommands: - aux-list - lecat - termcvt - hex - unhex - netbsd-strptime - For more information, please invoke mlr {subcommand} --help - - MLRRC - You can set up personal defaults via a $HOME/.mlrrc and/or ./.mlrrc. - For example, if you usually process CSV, then you can put "--csv" in your .mlrrc file - and that will be the default input/output format unless otherwise specified on the command line. - - The .mlrrc file format is one "--flag" or "--option value" per line, with the leading "--" optional. - Hash-style comments and blank lines are ignored. - - Sample .mlrrc: - # Input and output formats are CSV by default (unless otherwise specified - # on the mlr command line): - csv - # These are no-ops for CSV, but when I do use JSON output, I want these - # pretty-printing options to be used: - jvstack - jlistwrap - - How to specify location of .mlrrc: - * If $MLRRC is set: - o If its value is "__none__" then no .mlrrc files are processed. - o Otherwise, its value (as a filename) is loaded and processed. If there are syntax - errors, they abort mlr with a usage message (as if you had mistyped something on the - command line). If the file can't be loaded at all, though, it is silently skipped. - o Any .mlrrc in your home directory or current directory is ignored whenever $MLRRC is - set in the environment. - * Otherwise: - o If $HOME/.mlrrc exists, it's then processed as above. - o If ./.mlrrc exists, it's then also processed as above. - (I.e. current-directory .mlrrc defaults are stacked over home-directory .mlrrc defaults.) - - See also: - https://johnkerl.org/miller/doc/customization.html - - VERBS - altkv - Usage: mlr altkv [no options] - Given fields with values of the form a,b,c,d,e,f emits a=b,c=d,e=f pairs. - - bar - Usage: mlr bar [options] - Replaces a numeric field with a number of asterisks, allowing for cheesy - bar plots. These align best with --opprint or --oxtab output format. - Options: - -f {a,b,c} Field names to convert to bars. - -c {character} Fill character: default '*'. - -x {character} Out-of-bounds character: default '#'. - -b {character} Blank character: default '.'. - --lo {lo} Lower-limit value for min-width bar: default '0.000000'. - --hi {hi} Upper-limit value for max-width bar: default '100.000000'. - -w {n} Bar-field width: default '40'. - --auto Automatically computes limits, ignoring --lo and --hi. - Holds all records in memory before producing any output. - - bootstrap - Usage: mlr bootstrap [options] - Emits an n-sample, with replacement, of the input records. - Options: - -n {number} Number of samples to output. Defaults to number of input records. - Must be non-negative. - See also mlr sample and mlr shuffle. - - cat - Usage: mlr cat [options] - Passes input records directly to output. Most useful for format conversion. - Options: - -n Prepend field "n" to each record with record-counter starting at 1 - -g {comma-separated field name(s)} When used with -n/-N, writes record-counters - keyed by specified field name(s). - -v Write a low-level record-structure dump to stderr. - -N {name} Prepend field {name} to each record with record-counter starting at 1 - - check - Usage: mlr check - Consumes records without printing any output. - Useful for doing a well-formatted check on input data. - - clean-whitespace - Usage: mlr clean-whitespace [options] - For each record, for each field in the record, whitespace-cleans the keys and - values. Whitespace-cleaning entails stripping leading and trailing whitespace, - and replacing multiple whitespace with singles. For finer-grained control, - please see the DSL functions lstrip, rstrip, strip, collapse_whitespace, - and clean_whitespace. - - Options: - -k|--keys-only Do not touch values. - -v|--values-only Do not touch keys. - It is an error to specify -k as well as -v -- to clean keys and values, - leave off -k as well as -v. - - count - Usage: mlr count [options] - Prints number of records, optionally grouped by distinct values for specified field names. - - Options: - -g {a,b,c} Field names for distinct count. - -n Show only the number of distinct values. Not interesting without -g. - -o {name} Field name for output count. Default "count". - - count-distinct - Usage: mlr count-distinct [options] - Prints number of records having distinct values for specified field names. - Same as uniq -c. - - Options: - -f {a,b,c} Field names for distinct count. - -n Show only the number of distinct values. Not compatible with -u. - -o {name} Field name for output count. Default "count". - Ignored with -u. - -u Do unlashed counts for multiple field names. With -f a,b and - without -u, computes counts for distinct combinations of a - and b field values. With -f a,b and with -u, computes counts - for distinct a field values and counts for distinct b field - values separately. - - count-similar - Usage: mlr count-similar [options] - Ingests all records, then emits each record augmented by a count of - the number of other records having the same group-by field values. - Options: - -g {d,e,f} Group-by-field names for counts. - -o {name} Field name for output count. Default "count". - - cut - Usage: mlr cut [options] - Passes through input records with specified fields included/excluded. - -f {a,b,c} Field names to include for cut. - -o Retain fields in the order specified here in the argument list. - Default is to retain them in the order found in the input data. - -x|--complement Exclude, rather than include, field names specified by -f. - -r Treat field names as regular expressions. "ab", "a.*b" will - match any field name containing the substring "ab" or matching - "a.*b", respectively; anchors of the form "^ab$", "^a.*b$" may - be used. The -o flag is ignored when -r is present. - Examples: - mlr cut -f hostname,status - mlr cut -x -f hostname,status - mlr cut -r -f '^status$,sda[0-9]' - mlr cut -r -f '^status$,"sda[0-9]"' - mlr cut -r -f '^status$,"sda[0-9]"i' (this is case-insensitive) - - decimate - Usage: mlr decimate [options] - -n {count} Decimation factor; default 10 - -b Decimate by printing first of every n. - -e Decimate by printing last of every n (default). - -g {a,b,c} Optional group-by-field names for decimate counts - Passes through one of every n records, optionally by category. - - fill-down - Usage: mlr fill-down [options] - -f {a,b,c} Field names for fill-down - -a|--only-if-absent Field names for fill-down - If a given record has a missing value for a given field, fill that from - the corresponding value from a previous record, if any. - By default, a 'missing' field either is absent, or has the empty-string value. - With -a, a field is 'missing' only if it is absent. - - filter - Usage: mlr filter [options] {expression} - Prints records for which {expression} evaluates to true. - If there are multiple semicolon-delimited expressions, all of them are - evaluated and the last one is used as the filter criterion. - - Conversion options: - -S: Keeps field values as strings with no type inference to int or float. - -F: Keeps field values as strings or floats with no inference to int. - All field values are type-inferred to int/float/string unless this behavior is - suppressed with -S or -F. - - Output/formatting options: - --oflatsep {string}: Separator to use when flattening multi-level @-variables - to output records for emit. Default ":". - --jknquoteint: For dump output (JSON-formatted), do not quote map keys if non-string. - --jvquoteall: For dump output (JSON-formatted), quote map values even if non-string. - Any of the output-format command-line flags (see mlr -h). Example: using - mlr --icsv --opprint ... then put --ojson 'tee > "mytap-".$a.".dat", $*' then ... - the input is CSV, the output is pretty-print tabular, but the tee-file output - is written in JSON format. - --no-fflush: for emit, tee, print, and dump, don't call fflush() after every - record. - - Expression-specification options: - -f {filename}: the DSL expression is taken from the specified file rather - than from the command line. Outer single quotes wrapping the expression - should not be placed in the file. If -f is specified more than once, - all input files specified using -f are concatenated to produce the expression. - (For example, you can define functions in one file and call them from another.) - -e {expression}: You can use this after -f to add an expression. Example use - case: define functions/subroutines in a file you specify with -f, then call - them with an expression you specify with -e. - (If you mix -e and -f then the expressions are evaluated in the order encountered. - Since the expression pieces are simply concatenated, please be sure to use intervening - semicolons to separate expressions.) - - -s name=value: Predefines out-of-stream variable @name to have value "value". - Thus mlr filter put -s foo=97 '$column += @foo' is like - mlr filter put 'begin {@foo = 97} $column += @foo'. - The value part is subject to type-inferencing as specified by -S/-F. - May be specified more than once, e.g. -s name1=value1 -s name2=value2. - Note: the value may be an environment variable, e.g. -s sequence=$SEQUENCE - - Tracing options: - -v: Prints the expressions's AST (abstract syntax tree), which gives - full transparency on the precedence and associativity rules of - Miller's grammar, to stdout. - -a: Prints a low-level stack-allocation trace to stdout. - -t: Prints a low-level parser trace to stderr. - -T: Prints a every statement to stderr as it is executed. - - Other options: - -x: Prints records for which {expression} evaluates to false. - - Please use a dollar sign for field names and double-quotes for string - literals. If field names have special characters such as "." then you might - use braces, e.g. '${field.name}'. Miller built-in variables are - NF NR FNR FILENUM FILENAME M_PI M_E, and ENV["namegoeshere"] to access environment - variables. The environment-variable name may be an expression, e.g. a field - value. - - Use # to comment to end of line. - - Examples: - mlr filter 'log10($count) > 4.0' - mlr filter 'FNR == 2' (second record in each file) - mlr filter 'urand() < 0.001' (subsampling) - mlr filter '$color != "blue" && $value > 4.2' - mlr filter '($x<.5 && $y<.5) || ($x>.5 && $y>.5)' - mlr filter '($name =~ "^sys.*east$") || ($name =~ "^dev.[0-9]+"i)' - mlr filter '$ab = $a+$b; $cd = $c+$d; $ab != $cd' - mlr filter ' - NR == 1 || - #NR == 2 || - NR == 3 - ' - - Please see https://miller.readthedocs.io/en/latest/reference.html for more information - including function list. Or "mlr -f". Please also see "mlr grep" which is - useful when you don't yet know which field name(s) you're looking for. - Please see in particular: - http://www.johnkerl.org/miller/doc/reference-verbs.html#filter - - format-values - Usage: mlr format-values [options] - Applies format strings to all field values, depending on autodetected type. - * If a field value is detected to be integer, applies integer format. - * Else, if a field value is detected to be float, applies float format. - * Else, applies string format. - - Note: this is a low-keystroke way to apply formatting to many fields. To get - finer control, please see the fmtnum function within the mlr put DSL. - - Note: this verb lets you apply arbitrary format strings, which can produce - undefined behavior and/or program crashes. See your system's "man printf". - - Options: - -i {integer format} Defaults to "%lld". - Examples: "%06lld", "%08llx". - Note that Miller integers are long long so you must use - formats which apply to long long, e.g. with ll in them. - Undefined behavior results otherwise. - -f {float format} Defaults to "%lf". - Examples: "%8.3lf", "%.6le". - Note that Miller floats are double-precision so you must - use formats which apply to double, e.g. with l[efg] in them. - Undefined behavior results otherwise. - -s {string format} Defaults to "%s". - Examples: "_%s", "%08s". - Note that you must use formats which apply to string, e.g. - with s in them. Undefined behavior results otherwise. - -n Coerce field values autodetected as int to float, and then - apply the float format. - - fraction - Usage: mlr fraction [options] - For each record's value in specified fields, computes the ratio of that - value to the sum of values in that field over all input records. - E.g. with input records x=1 x=2 x=3 and x=4, emits output records - x=1,x_fraction=0.1 x=2,x_fraction=0.2 x=3,x_fraction=0.3 and x=4,x_fraction=0.4 - - Note: this is internally a two-pass algorithm: on the first pass it retains - input records and accumulates sums; on the second pass it computes quotients - and emits output records. This means it produces no output until all input is read. - - Options: - -f {a,b,c} Field name(s) for fraction calculation - -g {d,e,f} Optional group-by-field name(s) for fraction counts - -p Produce percents [0..100], not fractions [0..1]. Output field names - end with "_percent" rather than "_fraction" - -c Produce cumulative distributions, i.e. running sums: each output - value folds in the sum of the previous for the specified group - E.g. with input records x=1 x=2 x=3 and x=4, emits output records - x=1,x_cumulative_fraction=0.1 x=2,x_cumulative_fraction=0.3 - x=3,x_cumulative_fraction=0.6 and x=4,x_cumulative_fraction=1.0 - - grep - Usage: mlr grep [options] {regular expression} - Passes through records which match {regex}. - Options: - -i Use case-insensitive search. - -v Invert: pass through records which do not match the regex. - Note that "mlr filter" is more powerful, but requires you to know field names. - By contrast, "mlr grep" allows you to regex-match the entire record. It does - this by formatting each record in memory as DKVP, using command-line-specified - ORS/OFS/OPS, and matching the resulting line against the regex specified - here. In particular, the regex is not applied to the input stream: if you - have CSV with header line "x,y,z" and data line "1,2,3" then the regex will - be matched, not against either of these lines, but against the DKVP line - "x=1,y=2,z=3". Furthermore, not all the options to system grep are supported, - and this command is intended to be merely a keystroke-saver. To get all the - features of system grep, you can do - "mlr --odkvp ... | grep ... | mlr --idkvp ..." - - group-by - Usage: mlr group-by {comma-separated field names} - Outputs records in batches having identical values at specified field names. - - group-like - Usage: mlr group-like - Outputs records in batches having identical field names. - - having-fields - Usage: mlr having-fields [options] - Conditionally passes through records depending on each record's field names. - Options: - --at-least {comma-separated names} - --which-are {comma-separated names} - --at-most {comma-separated names} - --all-matching {regular expression} - --any-matching {regular expression} - --none-matching {regular expression} - Examples: - mlr having-fields --which-are amount,status,owner - mlr having-fields --any-matching 'sda[0-9]' - mlr having-fields --any-matching '"sda[0-9]"' - mlr having-fields --any-matching '"sda[0-9]"i' (this is case-insensitive) - - head - Usage: mlr head [options] - -n {count} Head count to print; default 10 - -g {a,b,c} Optional group-by-field names for head counts - Passes through the first n records, optionally by category. - Without -g, ceases consuming more input (i.e. is fast) when n - records have been read. - - histogram - Usage: mlr histogram [options] - -f {a,b,c} Value-field names for histogram counts - --lo {lo} Histogram low value - --hi {hi} Histogram high value - --nbins {n} Number of histogram bins - --auto Automatically computes limits, ignoring --lo and --hi. - Holds all values in memory before producing any output. - -o {prefix} Prefix for output field name. Default: no prefix. - Just a histogram. Input values < lo or > hi are not counted. - - join - Usage: mlr join [options] - Joins records from specified left file name with records from all file names - at the end of the Miller argument list. - Functionality is essentially the same as the system "join" command, but for - record streams. - Options: - -f {left file name} - -j {a,b,c} Comma-separated join-field names for output - -l {a,b,c} Comma-separated join-field names for left input file; - defaults to -j values if omitted. - -r {a,b,c} Comma-separated join-field names for right input file(s); - defaults to -j values if omitted. - --lp {text} Additional prefix for non-join output field names from - the left file - --rp {text} Additional prefix for non-join output field names from - the right file(s) - --np Do not emit paired records - --ul Emit unpaired records from the left file - --ur Emit unpaired records from the right file(s) - -s|--sorted-input Require sorted input: records must be sorted - lexically by their join-field names, else not all records will - be paired. The only likely use case for this is with a left - file which is too big to fit into system memory otherwise. - -u Enable unsorted input. (This is the default even without -u.) - In this case, the entire left file will be loaded into memory. - --prepipe {command} As in main input options; see mlr --help for details. - If you wish to use a prepipe command for the main input as well - as here, it must be specified there as well as here. - File-format options default to those for the right file names on the Miller - argument list, but may be overridden for the left file as follows. Please see - the main "mlr --help" for more information on syntax for these arguments. - -i {one of csv,dkvp,nidx,pprint,xtab} - --irs {record-separator character} - --ifs {field-separator character} - --ips {pair-separator character} - --repifs - --repips - Please use "mlr --usage-separator-options" for information on specifying separators. - Please see https://miller.readthedocs.io/en/latest/reference-verbs.html#join for more information - including examples. - - label - Usage: mlr label {new1,new2,new3,...} - Given n comma-separated names, renames the first n fields of each record to - have the respective name. (Fields past the nth are left with their original - names.) Particularly useful with --inidx or --implicit-csv-header, to give - useful names to otherwise integer-indexed fields. - Examples: - "echo 'a b c d' | mlr --inidx --odkvp cat" gives "1=a,2=b,3=c,4=d" - "echo 'a b c d' | mlr --inidx --odkvp label s,t" gives "s=a,t=b,3=c,4=d" - - least-frequent - Usage: mlr least-frequent [options] - Shows the least frequently occurring distinct values for specified field names. - The first entry is the statistical anti-mode; the remaining are runners-up. - Options: - -f {one or more comma-separated field names}. Required flag. - -n {count}. Optional flag defaulting to 10. - -b Suppress counts; show only field values. - -o {name} Field name for output count. Default "count". - See also "mlr most-frequent". - - merge-fields - Usage: mlr merge-fields [options] - Computes univariate statistics for each input record, accumulated across - specified fields. - Options: - -a {sum,count,...} Names of accumulators. One or more of: - count Count instances of fields - mode Find most-frequently-occurring values for fields; first-found wins tie - antimode Find least-frequently-occurring values for fields; first-found wins tie - sum Compute sums of specified fields - mean Compute averages (sample means) of specified fields - stddev Compute sample standard deviation of specified fields - var Compute sample variance of specified fields - meaneb Estimate error bars for averages (assuming no sample autocorrelation) - skewness Compute sample skewness of specified fields - kurtosis Compute sample kurtosis of specified fields - min Compute minimum values of specified fields - max Compute maximum values of specified fields - -f {a,b,c} Value-field names on which to compute statistics. Requires -o. - -r {a,b,c} Regular expressions for value-field names on which to compute - statistics. Requires -o. - -c {a,b,c} Substrings for collapse mode. All fields which have the same names - after removing substrings will be accumulated together. Please see - examples below. - -i Use interpolated percentiles, like R's type=7; default like type=1. - Not sensical for string-valued fields. - -o {name} Output field basename for -f/-r. - -k Keep the input fields which contributed to the output statistics; - the default is to omit them. - -F Computes integerable things (e.g. count) in floating point. - - String-valued data make sense unless arithmetic on them is required, - e.g. for sum, mean, interpolated percentiles, etc. In case of mixed data, - numbers are less than strings. - - Example input data: "a_in_x=1,a_out_x=2,b_in_y=4,b_out_x=8". - Example: mlr merge-fields -a sum,count -f a_in_x,a_out_x -o foo - produces "b_in_y=4,b_out_x=8,foo_sum=3,foo_count=2" since "a_in_x,a_out_x" are - summed over. - Example: mlr merge-fields -a sum,count -r in_,out_ -o bar - produces "bar_sum=15,bar_count=4" since all four fields are summed over. - Example: mlr merge-fields -a sum,count -c in_,out_ - produces "a_x_sum=3,a_x_count=2,b_y_sum=4,b_y_count=1,b_x_sum=8,b_x_count=1" - since "a_in_x" and "a_out_x" both collapse to "a_x", "b_in_y" collapses to - "b_y", and "b_out_x" collapses to "b_x". - - most-frequent - Usage: mlr most-frequent [options] - Shows the most frequently occurring distinct values for specified field names. - The first entry is the statistical mode; the remaining are runners-up. - Options: - -f {one or more comma-separated field names}. Required flag. - -n {count}. Optional flag defaulting to 10. - -b Suppress counts; show only field values. - -o {name} Field name for output count. Default "count". - See also "mlr least-frequent". - - nest - Usage: mlr nest [options] - Explodes specified field values into separate fields/records, or reverses this. - Options: - --explode,--implode One is required. - --values,--pairs One is required. - --across-records,--across-fields One is required. - -f {field name} Required. - --nested-fs {string} Defaults to ";". Field separator for nested values. - --nested-ps {string} Defaults to ":". Pair separator for nested key-value pairs. - --evar {string} Shorthand for --explode --values ---across-records --nested-fs {string} - --ivar {string} Shorthand for --implode --values ---across-records --nested-fs {string} - Please use "mlr --usage-separator-options" for information on specifying separators. - - Examples: - - mlr nest --explode --values --across-records -f x - with input record "x=a;b;c,y=d" produces output records - "x=a,y=d" - "x=b,y=d" - "x=c,y=d" - Use --implode to do the reverse. - - mlr nest --explode --values --across-fields -f x - with input record "x=a;b;c,y=d" produces output records - "x_1=a,x_2=b,x_3=c,y=d" - Use --implode to do the reverse. - - mlr nest --explode --pairs --across-records -f x - with input record "x=a:1;b:2;c:3,y=d" produces output records - "a=1,y=d" - "b=2,y=d" - "c=3,y=d" - - mlr nest --explode --pairs --across-fields -f x - with input record "x=a:1;b:2;c:3,y=d" produces output records - "a=1,b=2,c=3,y=d" - - Notes: - * With --pairs, --implode doesn't make sense since the original field name has - been lost. - * The combination "--implode --values --across-records" is non-streaming: - no output records are produced until all input records have been read. In - particular, this means it won't work in tail -f contexts. But all other flag - combinations result in streaming (tail -f friendly) data processing. - * It's up to you to ensure that the nested-fs is distinct from your data's IFS: - e.g. by default the former is semicolon and the latter is comma. - See also mlr reshape. - - nothing - Usage: mlr nothing - Drops all input records. Useful for testing, or after tee/print/etc. have - produced other output. - - put - Usage: mlr put [options] {expression} - Adds/updates specified field(s). Expressions are semicolon-separated and must - either be assignments, or evaluate to boolean. Booleans with following - statements in curly braces control whether those statements are executed; - booleans without following curly braces do nothing except side effects (e.g. - regex-captures into \1, \2, etc.). - - Conversion options: - -S: Keeps field values as strings with no type inference to int or float. - -F: Keeps field values as strings or floats with no inference to int. - All field values are type-inferred to int/float/string unless this behavior is - suppressed with -S or -F. - - Output/formatting options: - --oflatsep {string}: Separator to use when flattening multi-level @-variables - to output records for emit. Default ":". - --jknquoteint: For dump output (JSON-formatted), do not quote map keys if non-string. - --jvquoteall: For dump output (JSON-formatted), quote map values even if non-string. - Any of the output-format command-line flags (see mlr -h). Example: using - mlr --icsv --opprint ... then put --ojson 'tee > "mytap-".$a.".dat", $*' then ... - the input is CSV, the output is pretty-print tabular, but the tee-file output - is written in JSON format. - --no-fflush: for emit, tee, print, and dump, don't call fflush() after every - record. - - Expression-specification options: - -f {filename}: the DSL expression is taken from the specified file rather - than from the command line. Outer single quotes wrapping the expression - should not be placed in the file. If -f is specified more than once, - all input files specified using -f are concatenated to produce the expression. - (For example, you can define functions in one file and call them from another.) - -e {expression}: You can use this after -f to add an expression. Example use - case: define functions/subroutines in a file you specify with -f, then call - them with an expression you specify with -e. - (If you mix -e and -f then the expressions are evaluated in the order encountered. - Since the expression pieces are simply concatenated, please be sure to use intervening - semicolons to separate expressions.) - - -s name=value: Predefines out-of-stream variable @name to have value "value". - Thus mlr put put -s foo=97 '$column += @foo' is like - mlr put put 'begin {@foo = 97} $column += @foo'. - The value part is subject to type-inferencing as specified by -S/-F. - May be specified more than once, e.g. -s name1=value1 -s name2=value2. - Note: the value may be an environment variable, e.g. -s sequence=$SEQUENCE - - Tracing options: - -v: Prints the expressions's AST (abstract syntax tree), which gives - full transparency on the precedence and associativity rules of - Miller's grammar, to stdout. - -a: Prints a low-level stack-allocation trace to stdout. - -t: Prints a low-level parser trace to stderr. - -T: Prints a every statement to stderr as it is executed. - - Other options: - -q: Does not include the modified record in the output stream. Useful for when - all desired output is in begin and/or end blocks. - - Please use a dollar sign for field names and double-quotes for string - literals. If field names have special characters such as "." then you might - use braces, e.g. '${field.name}'. Miller built-in variables are - NF NR FNR FILENUM FILENAME M_PI M_E, and ENV["namegoeshere"] to access environment - variables. The environment-variable name may be an expression, e.g. a field - value. - - Use # to comment to end of line. - - Examples: - mlr put '$y = log10($x); $z = sqrt($y)' - mlr put '$x>0.0 { $y=log10($x); $z=sqrt($y) }' # does {...} only if $x > 0.0 - mlr put '$x>0.0; $y=log10($x); $z=sqrt($y)' # does all three statements - mlr put '$a =~ "([a-z]+)_([0-9]+); $b = "left_\1"; $c = "right_\2"' - mlr put '$a =~ "([a-z]+)_([0-9]+) { $b = "left_\1"; $c = "right_\2" }' - mlr put '$filename = FILENAME' - mlr put '$colored_shape = $color . "_" . $shape' - mlr put '$y = cos($theta); $z = atan2($y, $x)' - mlr put '$name = sub($name, "http.*com"i, "")' - mlr put -q '@sum += $x; end {emit @sum}' - mlr put -q '@sum[$a] += $x; end {emit @sum, "a"}' - mlr put -q '@sum[$a][$b] += $x; end {emit @sum, "a", "b"}' - mlr put -q '@min=min(@min,$x);@max=max(@max,$x); end{emitf @min, @max}' - mlr put -q 'is_null(@xmax) || $x > @xmax {@xmax=$x; @recmax=$*}; end {emit @recmax}' - mlr put ' - $x = 1; - #$y = 2; - $z = 3 - ' - - Please see also 'mlr -k' for examples using redirected output. - - Please see https://miller.readthedocs.io/en/latest/reference.html for more information - including function list. Or "mlr -f". - Please see in particular: - http://www.johnkerl.org/miller/doc/reference-verbs.html#put - - regularize - Usage: mlr regularize - For records seen earlier in the data stream with same field names in - a different order, outputs them with field names in the previously - encountered order. - Example: input records a=1,c=2,b=3, then e=4,d=5, then c=7,a=6,b=8 - output as a=1,c=2,b=3, then e=4,d=5, then a=6,c=7,b=8 - - remove-empty-columns - Usage: mlr remove-empty-columns - Omits fields which are empty on every input row. Non-streaming. - - rename - Usage: mlr rename [options] {old1,new1,old2,new2,...} - Renames specified fields. - Options: - -r Treat old field names as regular expressions. "ab", "a.*b" - will match any field name containing the substring "ab" or - matching "a.*b", respectively; anchors of the form "^ab$", - "^a.*b$" may be used. New field names may be plain strings, - or may contain capture groups of the form "\1" through - "\9". Wrapping the regex in double quotes is optional, but - is required if you wish to follow it with 'i' to indicate - case-insensitivity. - -g Do global replacement within each field name rather than - first-match replacement. - Examples: - mlr rename old_name,new_name' - mlr rename old_name_1,new_name_1,old_name_2,new_name_2' - mlr rename -r 'Date_[0-9]+,Date,' Rename all such fields to be "Date" - mlr rename -r '"Date_[0-9]+",Date' Same - mlr rename -r 'Date_([0-9]+).*,\1' Rename all such fields to be of the form 20151015 - mlr rename -r '"name"i,Name' Rename "name", "Name", "NAME", etc. to "Name" - - reorder - Usage: mlr reorder [options] - -f {a,b,c} Field names to reorder. - -e Put specified field names at record end: default is to put - them at record start. - Examples: - mlr reorder -f a,b sends input record "d=4,b=2,a=1,c=3" to "a=1,b=2,d=4,c=3". - mlr reorder -e -f a,b sends input record "d=4,b=2,a=1,c=3" to "d=4,c=3,a=1,b=2". - - repeat - Usage: mlr repeat [options] - Copies input records to output records multiple times. - Options must be exactly one of the following: - -n {repeat count} Repeat each input record this many times. - -f {field name} Same, but take the repeat count from the specified - field name of each input record. - Example: - echo x=0 | mlr repeat -n 4 then put '$x=urand()' - produces: - x=0.488189 - x=0.484973 - x=0.704983 - x=0.147311 - Example: - echo a=1,b=2,c=3 | mlr repeat -f b - produces: - a=1,b=2,c=3 - a=1,b=2,c=3 - Example: - echo a=1,b=2,c=3 | mlr repeat -f c - produces: - a=1,b=2,c=3 - a=1,b=2,c=3 - a=1,b=2,c=3 - - reshape - Usage: mlr reshape [options] - Wide-to-long options: - -i {input field names} -o {key-field name,value-field name} - -r {input field regexes} -o {key-field name,value-field name} - These pivot/reshape the input data such that the input fields are removed - and separate records are emitted for each key/value pair. - Note: this works with tail -f and produces output records for each input - record seen. - Long-to-wide options: - -s {key-field name,value-field name} - These pivot/reshape the input data to undo the wide-to-long operation. - Note: this does not work with tail -f; it produces output records only after - all input records have been read. - - Examples: - - Input file "wide.txt": - time X Y - 2009-01-01 0.65473572 2.4520609 - 2009-01-02 -0.89248112 0.2154713 - 2009-01-03 0.98012375 1.3179287 - - mlr --pprint reshape -i X,Y -o item,value wide.txt - time item value - 2009-01-01 X 0.65473572 - 2009-01-01 Y 2.4520609 - 2009-01-02 X -0.89248112 - 2009-01-02 Y 0.2154713 - 2009-01-03 X 0.98012375 - 2009-01-03 Y 1.3179287 - - mlr --pprint reshape -r '[A-Z]' -o item,value wide.txt - time item value - 2009-01-01 X 0.65473572 - 2009-01-01 Y 2.4520609 - 2009-01-02 X -0.89248112 - 2009-01-02 Y 0.2154713 - 2009-01-03 X 0.98012375 - 2009-01-03 Y 1.3179287 - - Input file "long.txt": - time item value - 2009-01-01 X 0.65473572 - 2009-01-01 Y 2.4520609 - 2009-01-02 X -0.89248112 - 2009-01-02 Y 0.2154713 - 2009-01-03 X 0.98012375 - 2009-01-03 Y 1.3179287 - - mlr --pprint reshape -s item,value long.txt - time X Y - 2009-01-01 0.65473572 2.4520609 - 2009-01-02 -0.89248112 0.2154713 - 2009-01-03 0.98012375 1.3179287 - See also mlr nest. - - sample - Usage: mlr sample [options] - Reservoir sampling (subsampling without replacement), optionally by category. - -k {count} Required: number of records to output, total, or by group if using -g. - -g {a,b,c} Optional: group-by-field names for samples. - See also mlr bootstrap and mlr shuffle. - - sec2gmt - Usage: mlr sec2gmt [options] {comma-separated list of field names} - Replaces a numeric field representing seconds since the epoch with the - corresponding GMT timestamp; leaves non-numbers as-is. This is nothing - more than a keystroke-saver for the sec2gmt function: - mlr sec2gmt time1,time2 - is the same as - mlr put '$time1=sec2gmt($time1);$time2=sec2gmt($time2)' - Options: - -1 through -9: format the seconds using 1..9 decimal places, respectively. - - sec2gmtdate - Usage: mlr sec2gmtdate {comma-separated list of field names} - Replaces a numeric field representing seconds since the epoch with the - corresponding GMT year-month-day timestamp; leaves non-numbers as-is. - This is nothing more than a keystroke-saver for the sec2gmtdate function: - mlr sec2gmtdate time1,time2 - is the same as - mlr put '$time1=sec2gmtdate($time1);$time2=sec2gmtdate($time2)' - - seqgen - Usage: mlr seqgen [options] - Produces a sequence of counters. Discards the input record stream. Produces - output as specified by the following options: - -f {name} Field name for counters; default "i". - --start {number} Inclusive start value; default "1". - --stop {number} Inclusive stop value; default "100". - --step {number} Step value; default "1". - Start, stop, and/or step may be floating-point. Output is integer if start, - stop, and step are all integers. Step may be negative. It may not be zero - unless start == stop. - - shuffle - Usage: mlr shuffle {no options} - Outputs records randomly permuted. No output records are produced until - all input records are read. - See also mlr bootstrap and mlr sample. - - skip-trivial-records - Usage: mlr skip-trivial-records [options] - Passes through all records except: - * those with zero fields; - * those for which all fields have empty value. - - sort - Usage: mlr sort {flags} - Flags: - -f {comma-separated field names} Lexical ascending - -n {comma-separated field names} Numerical ascending; nulls sort last - -nf {comma-separated field names} Same as -n - -r {comma-separated field names} Lexical descending - -nr {comma-separated field names} Numerical descending; nulls sort first - Sorts records primarily by the first specified field, secondarily by the second - field, and so on. (Any records not having all specified sort keys will appear - at the end of the output, in the order they were encountered, regardless of the - specified sort order.) The sort is stable: records that compare equal will sort - in the order they were encountered in the input record stream. - - Example: - mlr sort -f a,b -nr x,y,z - which is the same as: - mlr sort -f a -f b -nr x -nr y -nr z - - sort-within-records - Usage: mlr sort-within-records [no options] - Outputs records sorted lexically ascending by keys. - - stats1 - Usage: mlr stats1 [options] - Computes univariate statistics for one or more given fields, accumulated across - the input record stream. - Options: - -a {sum,count,...} Names of accumulators: p10 p25.2 p50 p98 p100 etc. and/or - one or more of: - count Count instances of fields - mode Find most-frequently-occurring values for fields; first-found wins tie - antimode Find least-frequently-occurring values for fields; first-found wins tie - sum Compute sums of specified fields - mean Compute averages (sample means) of specified fields - stddev Compute sample standard deviation of specified fields - var Compute sample variance of specified fields - meaneb Estimate error bars for averages (assuming no sample autocorrelation) - skewness Compute sample skewness of specified fields - kurtosis Compute sample kurtosis of specified fields - min Compute minimum values of specified fields - max Compute maximum values of specified fields - -f {a,b,c} Value-field names on which to compute statistics - --fr {regex} Regex for value-field names on which to compute statistics - (compute statistics on values in all field names matching regex) - --fx {regex} Inverted regex for value-field names on which to compute statistics - (compute statistics on values in all field names not matching regex) - -g {d,e,f} Optional group-by-field names - --gr {regex} Regex for optional group-by-field names - (group by values in field names matching regex) - --gx {regex} Inverted regex for optional group-by-field names - (group by values in field names not matching regex) - --grfx {regex} Shorthand for --gr {regex} --fx {that same regex} - -i Use interpolated percentiles, like R's type=7; default like type=1. - Not sensical for string-valued fields. - -s Print iterative stats. Useful in tail -f contexts (in which - case please avoid pprint-format output since end of input - stream will never be seen). - -F Computes integerable things (e.g. count) in floating point. - Example: mlr stats1 -a min,p10,p50,p90,max -f value -g size,shape - Example: mlr stats1 -a count,mode -f size - Example: mlr stats1 -a count,mode -f size -g shape - Example: mlr stats1 -a count,mode --fr '^[a-h].*$' -gr '^k.*$' - This computes count and mode statistics on all field names beginning - with a through h, grouped by all field names starting with k. - Notes: - * p50 and median are synonymous. - * min and max output the same results as p0 and p100, respectively, but use - less memory. - * String-valued data make sense unless arithmetic on them is required, - e.g. for sum, mean, interpolated percentiles, etc. In case of mixed data, - numbers are less than strings. - * count and mode allow text input; the rest require numeric input. - In particular, 1 and 1.0 are distinct text for count and mode. - * When there are mode ties, the first-encountered datum wins. - - stats2 - Usage: mlr stats2 [options] - Computes bivariate statistics for one or more given field-name pairs, - accumulated across the input record stream. - -a {linreg-ols,corr,...} Names of accumulators: one or more of: - linreg-pca Linear regression using principal component analysis - linreg-ols Linear regression using ordinary least squares - r2 Quality metric for linreg-ols (linreg-pca emits its own) - logireg Logistic regression - corr Sample correlation - cov Sample covariance - covx Sample-covariance matrix - -f {a,b,c,d} Value-field name-pairs on which to compute statistics. - There must be an even number of names. - -g {e,f,g} Optional group-by-field names. - -v Print additional output for linreg-pca. - -s Print iterative stats. Useful in tail -f contexts (in which - case please avoid pprint-format output since end of input - stream will never be seen). - --fit Rather than printing regression parameters, applies them to - the input data to compute new fit fields. All input records are - held in memory until end of input stream. Has effect only for - linreg-ols, linreg-pca, and logireg. - Only one of -s or --fit may be used. - Example: mlr stats2 -a linreg-pca -f x,y - Example: mlr stats2 -a linreg-ols,r2 -f x,y -g size,shape - Example: mlr stats2 -a corr -f x,y - - step - Usage: mlr step [options] - Computes values dependent on the previous record, optionally grouped - by category. - - Options: - -a {delta,rsum,...} Names of steppers: comma-separated, one or more of: - delta Compute differences in field(s) between successive records - shift Include value(s) in field(s) from previous record, if any - from-first Compute differences in field(s) from first record - ratio Compute ratios in field(s) between successive records - rsum Compute running sums of field(s) between successive records - counter Count instances of field(s) between successive records - ewma Exponentially weighted moving average over successive records - -f {a,b,c} Value-field names on which to compute statistics - -g {d,e,f} Optional group-by-field names - -F Computes integerable things (e.g. counter) in floating point. - -d {x,y,z} Weights for ewma. 1 means current sample gets all weight (no - smoothing), near under under 1 is light smoothing, near over 0 is - heavy smoothing. Multiple weights may be specified, e.g. - "mlr step -a ewma -f sys_load -d 0.01,0.1,0.9". Default if omitted - is "-d 0.5". - -o {a,b,c} Custom suffixes for EWMA output fields. If omitted, these default to - the -d values. If supplied, the number of -o values must be the same - as the number of -d values. - - Examples: - mlr step -a rsum -f request_size - mlr step -a delta -f request_size -g hostname - mlr step -a ewma -d 0.1,0.9 -f x,y - mlr step -a ewma -d 0.1,0.9 -o smooth,rough -f x,y - mlr step -a ewma -d 0.1,0.9 -o smooth,rough -f x,y -g group_name - - Please see https://miller.readthedocs.io/en/latest/reference-verbs.html#filter or - https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average - for more information on EWMA. - - tac - Usage: mlr tac - Prints records in reverse order from the order in which they were encountered. - - tail - Usage: mlr tail [options] - -n {count} Tail count to print; default 10 - -g {a,b,c} Optional group-by-field names for tail counts - Passes through the last n records, optionally by category. - - tee - Usage: mlr tee [options] {filename} - Passes through input records (like mlr cat) but also writes to specified output - file, using output-format flags from the command line (e.g. --ocsv). See also - the "tee" keyword within mlr put, which allows data-dependent filenames. - Options: - -a: append to existing file, if any, rather than overwriting. - --no-fflush: don't call fflush() after every record. - Any of the output-format command-line flags (see mlr -h). Example: using - mlr --icsv --opprint put '...' then tee --ojson ./mytap.dat then stats1 ... - the input is CSV, the output is pretty-print tabular, but the tee-file output - is written in JSON format. - - top - Usage: mlr top [options] - -f {a,b,c} Value-field names for top counts. - -g {d,e,f} Optional group-by-field names for top counts. - -n {count} How many records to print per category; default 1. - -a Print all fields for top-value records; default is - to print only value and group-by fields. Requires a single - value-field name only. - --min Print top smallest values; default is top largest values. - -F Keep top values as floats even if they look like integers. - -o {name} Field name for output indices. Default "top_idx". - Prints the n records with smallest/largest values at specified fields, - optionally by category. - - uniq - Usage: mlr uniq [options] - Prints distinct values for specified field names. With -c, same as - count-distinct. For uniq, -f is a synonym for -g. - - Options: - -g {d,e,f} Group-by-field names for uniq counts. - -c Show repeat counts in addition to unique values. - -n Show only the number of distinct values. - -o {name} Field name for output count. Default "count". - -a Output each unique record only once. Incompatible with -g. - With -c, produces unique records, with repeat counts for each. - With -n, produces only one record which is the unique-record count. - With neither -c nor -n, produces unique records. - - unsparsify - Usage: mlr unsparsify [options] - Prints records with the union of field names over all input records. - For field names absent in a given record but present in others, fills in a - value. Without -f, this verb retains all input before producing any output. - - Options: - --fill-with {filler string} What to fill absent fields with. Defaults to - the empty string. - -f {a,b,c} Specify field names to be operated on. Any other fields won't be - modified, and operation will be streaming. - - Example: if the input is two records, one being 'a=1,b=2' and the other - being 'b=3,c=4', then the output is the two records 'a=1,b=2,c=' and - 'a=,b=3,c=4'. - - FUNCTIONS FOR FILTER/PUT - + - (class=arithmetic #args=2): Addition. - - + (class=arithmetic #args=1): Unary plus. - - - - (class=arithmetic #args=2): Subtraction. - - - (class=arithmetic #args=1): Unary minus. - - * - (class=arithmetic #args=2): Multiplication. - - / - (class=arithmetic #args=2): Division. - - // - (class=arithmetic #args=2): Integer division: rounds to negative (pythonic). - - .+ - (class=arithmetic #args=2): Addition, with integer-to-integer overflow - - .+ (class=arithmetic #args=1): Unary plus, with integer-to-integer overflow. - - .- - (class=arithmetic #args=2): Subtraction, with integer-to-integer overflow. - - .- (class=arithmetic #args=1): Unary minus, with integer-to-integer overflow. - - .* - (class=arithmetic #args=2): Multiplication, with integer-to-integer overflow. - - ./ - (class=arithmetic #args=2): Division, with integer-to-integer overflow. - - .// - (class=arithmetic #args=2): Integer division: rounds to negative (pythonic), with integer-to-integer overflow. - - % - (class=arithmetic #args=2): Remainder; never negative-valued (pythonic). - - ** - (class=arithmetic #args=2): Exponentiation; same as pow, but as an infix - operator. - - | - (class=arithmetic #args=2): Bitwise OR. - - ^ - (class=arithmetic #args=2): Bitwise XOR. - - & - (class=arithmetic #args=2): Bitwise AND. - - ~ - (class=arithmetic #args=1): Bitwise NOT. Beware '$y=~$x' since =~ is the - regex-match operator: try '$y = ~$x'. - - << - (class=arithmetic #args=2): Bitwise left-shift. - - >> - (class=arithmetic #args=2): Bitwise right-shift. - - bitcount - (class=arithmetic #args=1): Count of 1-bits - - == - (class=boolean #args=2): String/numeric equality. Mixing number and string - results in string compare. - - != - (class=boolean #args=2): String/numeric inequality. Mixing number and string - results in string compare. - - =~ - (class=boolean #args=2): String (left-hand side) matches regex (right-hand - side), e.g. '$name =~ "^a.*b$"'. - - !=~ - (class=boolean #args=2): String (left-hand side) does not match regex - (right-hand side), e.g. '$name !=~ "^a.*b$"'. - - > - (class=boolean #args=2): String/numeric greater-than. Mixing number and string - results in string compare. - - >= - (class=boolean #args=2): String/numeric greater-than-or-equals. Mixing number - and string results in string compare. - - < - (class=boolean #args=2): String/numeric less-than. Mixing number and string - results in string compare. - - <= - (class=boolean #args=2): String/numeric less-than-or-equals. Mixing number - and string results in string compare. - - && - (class=boolean #args=2): Logical AND. - - || - (class=boolean #args=2): Logical OR. - - ^^ - (class=boolean #args=2): Logical XOR. - - ! - (class=boolean #args=1): Logical negation. - - ? : - (class=boolean #args=3): Ternary operator. - - . - (class=string #args=2): String concatenation. - - gsub - (class=string #args=3): Example: '$name=gsub($name, "old", "new")' - (replace all). - - regextract - (class=string #args=2): Example: '$name=regextract($name, "[A-Z]{3}[0-9]{2}")' - . - - regextract_or_else - (class=string #args=3): Example: '$name=regextract_or_else($name, "[A-Z]{3}[0-9]{2}", "default")' - . - - strlen - (class=string #args=1): String length. - - sub - (class=string #args=3): Example: '$name=sub($name, "old", "new")' - (replace once). - - ssub - (class=string #args=3): Like sub but does no regexing. No characters are special. - - substr - (class=string #args=3): substr(s,m,n) gives substring of s from 0-up position m to n - inclusive. Negative indices -len .. -1 alias to 0 .. len-1. - - tolower - (class=string #args=1): Convert string to lowercase. - - toupper - (class=string #args=1): Convert string to uppercase. - - truncate - (class=string #args=2): Truncates string first argument to max length of int second argument. - - capitalize - (class=string #args=1): Convert string's first character to uppercase. - - lstrip - (class=string #args=1): Strip leading whitespace from string. - - rstrip - (class=string #args=1): Strip trailing whitespace from string. - - strip - (class=string #args=1): Strip leading and trailing whitespace from string. - - collapse_whitespace - (class=string #args=1): Strip repeated whitespace from string. - - clean_whitespace - (class=string #args=1): Same as collapse_whitespace and strip. - - system - (class=string #args=1): Run command string, yielding its stdout minus final carriage return. - - abs - (class=math #args=1): Absolute value. - - acos - (class=math #args=1): Inverse trigonometric cosine. - - acosh - (class=math #args=1): Inverse hyperbolic cosine. - - asin - (class=math #args=1): Inverse trigonometric sine. - - asinh - (class=math #args=1): Inverse hyperbolic sine. - - atan - (class=math #args=1): One-argument arctangent. - - atan2 - (class=math #args=2): Two-argument arctangent. - - atanh - (class=math #args=1): Inverse hyperbolic tangent. - - cbrt - (class=math #args=1): Cube root. - - ceil - (class=math #args=1): Ceiling: nearest integer at or above. - - cos - (class=math #args=1): Trigonometric cosine. - - cosh - (class=math #args=1): Hyperbolic cosine. - - erf - (class=math #args=1): Error function. - - erfc - (class=math #args=1): Complementary error function. - - exp - (class=math #args=1): Exponential function e**x. - - expm1 - (class=math #args=1): e**x - 1. - - floor - (class=math #args=1): Floor: nearest integer at or below. - - invqnorm - (class=math #args=1): Inverse of normal cumulative distribution - function. Note that invqorm(urand()) is normally distributed. - - log - (class=math #args=1): Natural (base-e) logarithm. - - log10 - (class=math #args=1): Base-10 logarithm. - - log1p - (class=math #args=1): log(1-x). - - logifit - (class=math #args=3): Given m and b from logistic regression, compute - fit: $yhat=logifit($x,$m,$b). - - madd - (class=math #args=3): a + b mod m (integers) - - max - (class=math variadic): max of n numbers; null loses - - mexp - (class=math #args=3): a ** b mod m (integers) - - min - (class=math variadic): Min of n numbers; null loses - - mmul - (class=math #args=3): a * b mod m (integers) - - msub - (class=math #args=3): a - b mod m (integers) - - pow - (class=math #args=2): Exponentiation; same as **. - - qnorm - (class=math #args=1): Normal cumulative distribution function. - - round - (class=math #args=1): Round to nearest integer. - - roundm - (class=math #args=2): Round to nearest multiple of m: roundm($x,$m) is - the same as round($x/$m)*$m - - sgn - (class=math #args=1): +1 for positive input, 0 for zero input, -1 for - negative input. - - sin - (class=math #args=1): Trigonometric sine. - - sinh - (class=math #args=1): Hyperbolic sine. - - sqrt - (class=math #args=1): Square root. - - tan - (class=math #args=1): Trigonometric tangent. - - tanh - (class=math #args=1): Hyperbolic tangent. - - urand - (class=math #args=0): Floating-point numbers uniformly distributed on the unit interval. - Int-valued example: '$n=floor(20+urand()*11)'. - - urandrange - (class=math #args=2): Floating-point numbers uniformly distributed on the interval [a, b). - - urand32 - (class=math #args=0): Integer uniformly distributed 0 and 2**32-1 - inclusive. - - urandint - (class=math #args=2): Integer uniformly distributed between inclusive - integer endpoints. - - dhms2fsec - (class=time #args=1): Recovers floating-point seconds as in - dhms2fsec("5d18h53m20.250000s") = 500000.250000 - - dhms2sec - (class=time #args=1): Recovers integer seconds as in - dhms2sec("5d18h53m20s") = 500000 - - fsec2dhms - (class=time #args=1): Formats floating-point seconds as in - fsec2dhms(500000.25) = "5d18h53m20.250000s" - - fsec2hms - (class=time #args=1): Formats floating-point seconds as in - fsec2hms(5000.25) = "01:23:20.250000" - - gmt2sec - (class=time #args=1): Parses GMT timestamp as integer seconds since - the epoch. - - localtime2sec - (class=time #args=1): Parses local timestamp as integer seconds since - the epoch. Consults $TZ environment variable. - - hms2fsec - (class=time #args=1): Recovers floating-point seconds as in - hms2fsec("01:23:20.250000") = 5000.250000 - - hms2sec - (class=time #args=1): Recovers integer seconds as in - hms2sec("01:23:20") = 5000 - - sec2dhms - (class=time #args=1): Formats integer seconds as in sec2dhms(500000) - = "5d18h53m20s" - - sec2gmt - (class=time #args=1): Formats seconds since epoch (integer part) - as GMT timestamp, e.g. sec2gmt(1440768801.7) = "2015-08-28T13:33:21Z". - Leaves non-numbers as-is. - - sec2gmt (class=time #args=2): Formats seconds since epoch as GMT timestamp with n - decimal places for seconds, e.g. sec2gmt(1440768801.7,1) = "2015-08-28T13:33:21.7Z". - Leaves non-numbers as-is. - - sec2gmtdate - (class=time #args=1): Formats seconds since epoch (integer part) - as GMT timestamp with year-month-date, e.g. sec2gmtdate(1440768801.7) = "2015-08-28". - Leaves non-numbers as-is. - - sec2localtime - (class=time #args=1): Formats seconds since epoch (integer part) - as local timestamp, e.g. sec2localtime(1440768801.7) = "2015-08-28T13:33:21Z". - Consults $TZ environment variable. Leaves non-numbers as-is. - - sec2localtime (class=time #args=2): Formats seconds since epoch as local timestamp with n - decimal places for seconds, e.g. sec2localtime(1440768801.7,1) = "2015-08-28T13:33:21.7Z". - Consults $TZ environment variable. Leaves non-numbers as-is. - - sec2localdate - (class=time #args=1): Formats seconds since epoch (integer part) - as local timestamp with year-month-date, e.g. sec2localdate(1440768801.7) = "2015-08-28". - Consults $TZ environment variable. Leaves non-numbers as-is. - - sec2hms - (class=time #args=1): Formats integer seconds as in - sec2hms(5000) = "01:23:20" - - strftime - (class=time #args=2): Formats seconds since the epoch as timestamp, e.g. - strftime(1440768801.7,"%Y-%m-%dT%H:%M:%SZ") = "2015-08-28T13:33:21Z", and - strftime(1440768801.7,"%Y-%m-%dT%H:%M:%3SZ") = "2015-08-28T13:33:21.700Z". - Format strings are as in the C library (please see "man strftime" on your system), - with the Miller-specific addition of "%1S" through "%9S" which format the seconds - with 1 through 9 decimal places, respectively. ("%S" uses no decimal places.) - See also strftime_local. - - strftime_local - (class=time #args=2): Like strftime but consults the $TZ environment variable to get local time zone. - - strptime - (class=time #args=2): Parses timestamp as floating-point seconds since the epoch, - e.g. strptime("2015-08-28T13:33:21Z","%Y-%m-%dT%H:%M:%SZ") = 1440768801.000000, - and strptime("2015-08-28T13:33:21.345Z","%Y-%m-%dT%H:%M:%SZ") = 1440768801.345000. - See also strptime_local. - - strptime_local - (class=time #args=2): Like strptime, but consults $TZ environment variable to find and use local timezone. - - systime - (class=time #args=0): Floating-point seconds since the epoch, - e.g. 1440768801.748936. - - is_absent - (class=typing #args=1): False if field is present in input, true otherwise - - is_bool - (class=typing #args=1): True if field is present with boolean value. Synonymous with is_boolean. - - is_boolean - (class=typing #args=1): True if field is present with boolean value. Synonymous with is_bool. - - is_empty - (class=typing #args=1): True if field is present in input with empty string value, false otherwise. - - is_empty_map - (class=typing #args=1): True if argument is a map which is empty. - - is_float - (class=typing #args=1): True if field is present with value inferred to be float - - is_int - (class=typing #args=1): True if field is present with value inferred to be int - - is_map - (class=typing #args=1): True if argument is a map. - - is_nonempty_map - (class=typing #args=1): True if argument is a map which is non-empty. - - is_not_empty - (class=typing #args=1): False if field is present in input with empty value, true otherwise - - is_not_map - (class=typing #args=1): True if argument is not a map. - - is_not_null - (class=typing #args=1): False if argument is null (empty or absent), true otherwise. - - is_null - (class=typing #args=1): True if argument is null (empty or absent), false otherwise. - - is_numeric - (class=typing #args=1): True if field is present with value inferred to be int or float - - is_present - (class=typing #args=1): True if field is present in input, false otherwise. - - is_string - (class=typing #args=1): True if field is present with string (including empty-string) value - - asserting_absent - (class=typing #args=1): Returns argument if it is absent in the input data, else - throws an error. - - asserting_bool - (class=typing #args=1): Returns argument if it is present with boolean value, else - throws an error. - - asserting_boolean - (class=typing #args=1): Returns argument if it is present with boolean value, else - throws an error. - - asserting_empty - (class=typing #args=1): Returns argument if it is present in input with empty value, - else throws an error. - - asserting_empty_map - (class=typing #args=1): Returns argument if it is a map with empty value, else - throws an error. - - asserting_float - (class=typing #args=1): Returns argument if it is present with float value, else - throws an error. - - asserting_int - (class=typing #args=1): Returns argument if it is present with int value, else - throws an error. - - asserting_map - (class=typing #args=1): Returns argument if it is a map, else throws an error. - - asserting_nonempty_map - (class=typing #args=1): Returns argument if it is a non-empty map, else throws - an error. - - asserting_not_empty - (class=typing #args=1): Returns argument if it is present in input with non-empty - value, else throws an error. - - asserting_not_map - (class=typing #args=1): Returns argument if it is not a map, else throws an error. - - asserting_not_null - (class=typing #args=1): Returns argument if it is non-null (non-empty and non-absent), - else throws an error. - - asserting_null - (class=typing #args=1): Returns argument if it is null (empty or absent), else throws - an error. - - asserting_numeric - (class=typing #args=1): Returns argument if it is present with int or float value, - else throws an error. - - asserting_present - (class=typing #args=1): Returns argument if it is present in input, else throws - an error. - - asserting_string - (class=typing #args=1): Returns argument if it is present with string (including - empty-string) value, else throws an error. - - boolean - (class=conversion #args=1): Convert int/float/bool/string to boolean. - - float - (class=conversion #args=1): Convert int/float/bool/string to float. - - fmtnum - (class=conversion #args=2): Convert int/float/bool to string using - printf-style format string, e.g. '$s = fmtnum($n, "%06lld")'. WARNING: Miller numbers - are all long long or double. If you use formats like %d or %f, behavior is undefined. - - hexfmt - (class=conversion #args=1): Convert int to string, e.g. 255 to "0xff". - - int - (class=conversion #args=1): Convert int/float/bool/string to int. - - string - (class=conversion #args=1): Convert int/float/bool/string to string. - - typeof - (class=conversion #args=1): Convert argument to type of argument (e.g. - MT_STRING). For debug. - - depth - (class=maps #args=1): Prints maximum depth of hashmap: ''. Scalars have depth 0. - - haskey - (class=maps #args=2): True/false if map has/hasn't key, e.g. 'haskey($*, "a")' or - 'haskey(mymap, mykey)'. Error if 1st argument is not a map. - - joink - (class=maps #args=2): Makes string from map keys. E.g. 'joink($*, ",")'. - - joinkv - (class=maps #args=3): Makes string from map key-value pairs. E.g. 'joinkv(@v[2], "=", ",")' - - joinv - (class=maps #args=2): Makes string from map values. E.g. 'joinv(mymap, ",")'. - - leafcount - (class=maps #args=1): Counts total number of terminal values in hashmap. For single-level maps, - same as length. - - length - (class=maps #args=1): Counts number of top-level entries in hashmap. Scalars have length 1. - - mapdiff - (class=maps variadic): With 0 args, returns empty map. With 1 arg, returns copy of arg. - With 2 or more, returns copy of arg 1 with all keys from any of remaining argument maps removed. - - mapexcept - (class=maps variadic): Returns a map with keys from remaining arguments, if any, unset. - E.g. 'mapexcept({1:2,3:4,5:6}, 1, 5, 7)' is '{3:4}'. - - mapselect - (class=maps variadic): Returns a map with only keys from remaining arguments set. - E.g. 'mapselect({1:2,3:4,5:6}, 1, 5, 7)' is '{1:2,5:6}'. - - mapsum - (class=maps variadic): With 0 args, returns empty map. With >= 1 arg, returns a map with - key-value pairs from all arguments. Rightmost collisions win, e.g. 'mapsum({1:2,3:4},{1:5})' is '{1:5,3:4}'. - - splitkv - (class=maps #args=3): Splits string by separators into map with type inference. - E.g. 'splitkv("a=1,b=2,c=3", "=", ",")' gives '{"a" : 1, "b" : 2, "c" : 3}'. - - splitkvx - (class=maps #args=3): Splits string by separators into map without type inference (keys and - values are strings). E.g. 'splitkv("a=1,b=2,c=3", "=", ",")' gives - '{"a" : "1", "b" : "2", "c" : "3"}'. - - splitnv - (class=maps #args=2): Splits string by separator into integer-indexed map with type inference. - E.g. 'splitnv("a,b,c" , ",")' gives '{1 : "a", 2 : "b", 3 : "c"}'. - - splitnvx - (class=maps #args=2): Splits string by separator into integer-indexed map without type - inference (values are strings). E.g. 'splitnv("4,5,6" , ",")' gives '{1 : "4", 2 : "5", 3 : "6"}'. - - KEYWORDS FOR PUT AND FILTER - all - all: used in "emit", "emitp", and "unset" as a synonym for @* - - begin - begin: defines a block of statements to be executed before input records - are ingested. The body statements must be wrapped in curly braces. - Example: 'begin { @count = 0 }' - - bool - bool: declares a boolean local variable in the current curly-braced scope. - Type-checking happens at assignment: 'bool b = 1' is an error. - - break - break: causes execution to continue after the body of the current - for/while/do-while loop. - - call - call: used for invoking a user-defined subroutine. - Example: 'subr s(k,v) { print k . " is " . v} call s("a", $a)' - - continue - continue: causes execution to skip the remaining statements in the body of - the current for/while/do-while loop. For-loop increments are still applied. - - do - do: with "while", introduces a do-while loop. The body statements must be wrapped - in curly braces. - - dump - dump: prints all currently defined out-of-stream variables immediately - to stdout as JSON. - - With >, >>, or |, the data do not become part of the output record stream but - are instead redirected. - - The > and >> are for write and append, as in the shell, but (as with awk) the - file-overwrite for > is on first write, not per record. The | is for piping to - a process which will process the data. There will be one open file for each - distinct file name (for > and >>) or one subordinate process for each distinct - value of the piped-to command (for |). Output-formatting flags are taken from - the main command line. - - Example: mlr --from f.dat put -q '@v[NR]=$*; end { dump }' - Example: mlr --from f.dat put -q '@v[NR]=$*; end { dump > "mytap.dat"}' - Example: mlr --from f.dat put -q '@v[NR]=$*; end { dump >> "mytap.dat"}' - Example: mlr --from f.dat put -q '@v[NR]=$*; end { dump | "jq .[]"}' - - edump - edump: prints all currently defined out-of-stream variables immediately - to stderr as JSON. - - Example: mlr --from f.dat put -q '@v[NR]=$*; end { edump }' - - elif - elif: the way Miller spells "else if". The body statements must be wrapped - in curly braces. - - else - else: terminates an if/elif/elif chain. The body statements must be wrapped - in curly braces. - - emit - emit: inserts an out-of-stream variable into the output record stream. Hashmap - indices present in the data but not slotted by emit arguments are not output. - - With >, >>, or |, the data do not become part of the output record stream but - are instead redirected. - - The > and >> are for write and append, as in the shell, but (as with awk) the - file-overwrite for > is on first write, not per record. The | is for piping to - a process which will process the data. There will be one open file for each - distinct file name (for > and >>) or one subordinate process for each distinct - value of the piped-to command (for |). Output-formatting flags are taken from - the main command line. - - You can use any of the output-format command-line flags, e.g. --ocsv, --ofs, - etc., to control the format of the output if the output is redirected. See also mlr -h. - - Example: mlr --from f.dat put 'emit > "/tmp/data-".$a, $*' - Example: mlr --from f.dat put 'emit > "/tmp/data-".$a, mapexcept($*, "a")' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emit @sums' - Example: mlr --from f.dat put --ojson '@sums[$a][$b]+=$x; emit > "tap-".$a.$b.".dat", @sums' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emit @sums, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emit @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emit > "mytap.dat", @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emit >> "mytap.dat", @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emit | "gzip > mytap.dat.gz", @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emit > stderr, @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emit | "grep somepattern", @*, "index1", "index2"' - - Please see http://johnkerl.org/miller/doc for more information. - - emitf - emitf: inserts non-indexed out-of-stream variable(s) side-by-side into the - output record stream. - - With >, >>, or |, the data do not become part of the output record stream but - are instead redirected. - - The > and >> are for write and append, as in the shell, but (as with awk) the - file-overwrite for > is on first write, not per record. The | is for piping to - a process which will process the data. There will be one open file for each - distinct file name (for > and >>) or one subordinate process for each distinct - value of the piped-to command (for |). Output-formatting flags are taken from - the main command line. - - You can use any of the output-format command-line flags, e.g. --ocsv, --ofs, - etc., to control the format of the output if the output is redirected. See also mlr -h. - - Example: mlr --from f.dat put '@a=$i;@b+=$x;@c+=$y; emitf @a' - Example: mlr --from f.dat put --oxtab '@a=$i;@b+=$x;@c+=$y; emitf > "tap-".$i.".dat", @a' - Example: mlr --from f.dat put '@a=$i;@b+=$x;@c+=$y; emitf @a, @b, @c' - Example: mlr --from f.dat put '@a=$i;@b+=$x;@c+=$y; emitf > "mytap.dat", @a, @b, @c' - Example: mlr --from f.dat put '@a=$i;@b+=$x;@c+=$y; emitf >> "mytap.dat", @a, @b, @c' - Example: mlr --from f.dat put '@a=$i;@b+=$x;@c+=$y; emitf > stderr, @a, @b, @c' - Example: mlr --from f.dat put '@a=$i;@b+=$x;@c+=$y; emitf | "grep somepattern", @a, @b, @c' - Example: mlr --from f.dat put '@a=$i;@b+=$x;@c+=$y; emitf | "grep somepattern > mytap.dat", @a, @b, @c' - - Please see http://johnkerl.org/miller/doc for more information. - - emitp - emitp: inserts an out-of-stream variable into the output record stream. - Hashmap indices present in the data but not slotted by emitp arguments are - output concatenated with ":". - - With >, >>, or |, the data do not become part of the output record stream but - are instead redirected. - - The > and >> are for write and append, as in the shell, but (as with awk) the - file-overwrite for > is on first write, not per record. The | is for piping to - a process which will process the data. There will be one open file for each - distinct file name (for > and >>) or one subordinate process for each distinct - value of the piped-to command (for |). Output-formatting flags are taken from - the main command line. - - You can use any of the output-format command-line flags, e.g. --ocsv, --ofs, - etc., to control the format of the output if the output is redirected. See also mlr -h. - - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp @sums' - Example: mlr --from f.dat put --opprint '@sums[$a][$b]+=$x; emitp > "tap-".$a.$b.".dat", @sums' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp @sums, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp > "mytap.dat", @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp >> "mytap.dat", @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp | "gzip > mytap.dat.gz", @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp > stderr, @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp | "grep somepattern", @*, "index1", "index2"' - - Please see http://johnkerl.org/miller/doc for more information. - - end - end: defines a block of statements to be executed after input records - are ingested. The body statements must be wrapped in curly braces. - Example: 'end { emit @count }' - Example: 'end { eprint "Final count is " . @count }' - - eprint - eprint: prints expression immediately to stderr. - Example: mlr --from f.dat put -q 'eprint "The sum of x and y is ".($x+$y)' - Example: mlr --from f.dat put -q 'for (k, v in $*) { eprint k . " => " . v }' - Example: mlr --from f.dat put '(NR % 1000 == 0) { eprint "Checkpoint ".NR}' - - eprintn - eprintn: prints expression immediately to stderr, without trailing newline. - Example: mlr --from f.dat put -q 'eprintn "The sum of x and y is ".($x+$y); eprint ""' - - false - false: the boolean literal value. - - filter - filter: includes/excludes the record in the output record stream. - - Example: mlr --from f.dat put 'filter (NR == 2 || $x > 5.4)' - - Instead of put with 'filter false' you can simply use put -q. The following - uses the input record to accumulate data but only prints the running sum - without printing the input record: - - Example: mlr --from f.dat put -q '@running_sum += $x * $y; emit @running_sum' - - float - float: declares a floating-point local variable in the current curly-braced scope. - Type-checking happens at assignment: 'float x = 0' is an error. - - for - for: defines a for-loop using one of three styles. The body statements must - be wrapped in curly braces. - For-loop over stream record: - Example: 'for (k, v in $*) { ... }' - For-loop over out-of-stream variables: - Example: 'for (k, v in @counts) { ... }' - Example: 'for ((k1, k2), v in @counts) { ... }' - Example: 'for ((k1, k2, k3), v in @*) { ... }' - C-style for-loop: - Example: 'for (var i = 0, var b = 1; i < 10; i += 1, b *= 2) { ... }' - - func - func: used for defining a user-defined function. - Example: 'func f(a,b) { return sqrt(a**2+b**2)} $d = f($x, $y)' - - if - if: starts an if/elif/elif chain. The body statements must be wrapped - in curly braces. - - in - in: used in for-loops over stream records or out-of-stream variables. - - int - int: declares an integer local variable in the current curly-braced scope. - Type-checking happens at assignment: 'int x = 0.0' is an error. - - map - map: declares an map-valued local variable in the current curly-braced scope. - Type-checking happens at assignment: 'map b = 0' is an error. map b = {} is - always OK. map b = a is OK or not depending on whether a is a map. - - num - num: declares an int/float local variable in the current curly-braced scope. - Type-checking happens at assignment: 'num b = true' is an error. - - print - print: prints expression immediately to stdout. - Example: mlr --from f.dat put -q 'print "The sum of x and y is ".($x+$y)' - Example: mlr --from f.dat put -q 'for (k, v in $*) { print k . " => " . v }' - Example: mlr --from f.dat put '(NR % 1000 == 0) { print > stderr, "Checkpoint ".NR}' - - printn - printn: prints expression immediately to stdout, without trailing newline. - Example: mlr --from f.dat put -q 'printn "."; end { print "" }' - - return - return: specifies the return value from a user-defined function. - Omitted return statements (including via if-branches) result in an absent-null - return value, which in turns results in a skipped assignment to an LHS. - - stderr - stderr: Used for tee, emit, emitf, emitp, print, and dump in place of filename - to print to standard error. - - stdout - stdout: Used for tee, emit, emitf, emitp, print, and dump in place of filename - to print to standard output. - - str - str: declares a string local variable in the current curly-braced scope. - Type-checking happens at assignment. - - subr - subr: used for defining a subroutine. - Example: 'subr s(k,v) { print k . " is " . v} call s("a", $a)' - - tee - tee: prints the current record to specified file. - This is an immediate print to the specified file (except for pprint format - which of course waits until the end of the input stream to format all output). - - The > and >> are for write and append, as in the shell, but (as with awk) the - file-overwrite for > is on first write, not per record. The | is for piping to - a process which will process the data. There will be one open file for each - distinct file name (for > and >>) or one subordinate process for each distinct - value of the piped-to command (for |). Output-formatting flags are taken from - the main command line. - - You can use any of the output-format command-line flags, e.g. --ocsv, --ofs, - etc., to control the format of the output. See also mlr -h. - - emit with redirect and tee with redirect are identical, except tee can only - output $*. - - Example: mlr --from f.dat put 'tee > "/tmp/data-".$a, $*' - Example: mlr --from f.dat put 'tee >> "/tmp/data-".$a.$b, $*' - Example: mlr --from f.dat put 'tee > stderr, $*' - Example: mlr --from f.dat put -q 'tee | "tr [a-z\] [A-Z\]", $*' - Example: mlr --from f.dat put -q 'tee | "tr [a-z\] [A-Z\] > /tmp/data-".$a, $*' - Example: mlr --from f.dat put -q 'tee | "gzip > /tmp/data-".$a.".gz", $*' - Example: mlr --from f.dat put -q --ojson 'tee | "gzip > /tmp/data-".$a.".gz", $*' - - true - true: the boolean literal value. - - unset - unset: clears field(s) from the current record, or an out-of-stream or local variable. - - Example: mlr --from f.dat put 'unset $x' - Example: mlr --from f.dat put 'unset $*' - Example: mlr --from f.dat put 'for (k, v in $*) { if (k =~ "a.*") { unset $[k] } }' - Example: mlr --from f.dat put '...; unset @sums' - Example: mlr --from f.dat put '...; unset @sums["green"]' - Example: mlr --from f.dat put '...; unset @*' - - var - var: declares an untyped local variable in the current curly-braced scope. - Examples: 'var a=1', 'var xyz=""' - - while - while: introduces a while loop, or with "do", introduces a do-while loop. - The body statements must be wrapped in curly braces. - - ENV - ENV: access to environment variables by name, e.g. '$home = ENV["HOME"]' - - FILENAME - FILENAME: evaluates to the name of the current file being processed. - - FILENUM - FILENUM: evaluates to the number of the current file being processed, - starting with 1. - - FNR - FNR: evaluates to the number of the current record within the current file - being processed, starting with 1. Resets at the start of each file. - - IFS - IFS: evaluates to the input field separator from the command line. - - IPS - IPS: evaluates to the input pair separator from the command line. - - IRS - IRS: evaluates to the input record separator from the command line, - or to LF or CRLF from the input data if in autodetect mode (which is - the default). - - M_E - M_E: the mathematical constant e. - - M_PI - M_PI: the mathematical constant pi. - - NF - NF: evaluates to the number of fields in the current record. - - NR - NR: evaluates to the number of the current record over all files - being processed, starting with 1. Does not reset at the start of each file. - - OFS - OFS: evaluates to the output field separator from the command line. - - OPS - OPS: evaluates to the output pair separator from the command line. - - ORS - ORS: evaluates to the output record separator from the command line, - or to LF or CRLF from the input data if in autodetect mode (which is - the default). - - AUTHOR - Miller is written by John Kerl . - - This manual page has been composed from Miller's help output by Eric - MSP Veith . - - SEE ALSO - awk(1), sed(1), cut(1), join(1), sort(1), RFC 4180: Common Format and - MIME Type for Comma-Separated Values (CSV) Files, the miller website - http://johnkerl.org/miller/doc - - - - 2021-03-22 MILLER(1) diff --git a/docs6/manpage.rst.in b/docs6/manpage.rst.in deleted file mode 100644 index 5cc676598..000000000 --- a/docs6/manpage.rst.in +++ /dev/null @@ -1,6 +0,0 @@ -Manpage -================================================================ - -This is simply a copy of what you should see on running **man mlr** at a command prompt, once Miller is installed on your system. - -GENRST_INCLUDE_ESCAPED(manpage.txt) diff --git a/docs6/miller-on-windows.rst b/docs6/miller-on-windows.rst deleted file mode 100644 index dc56f475b..000000000 --- a/docs6/miller-on-windows.rst +++ /dev/null @@ -1,48 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Miller on Windows -================================================================ - -Native builds as of Miller 6 ----------------------------------------------------------------- - -Miller was originally developed for Unix-like operating systems including Linux and MacOS. Since the initial release of Miller in 2015, support for Windows has been partial. But as of version 6.0.0, Miller builds directly on Windows. - -The experience is now almost the same as on Linux, NetBSD/FreeBSD, and MacOS. - -MSYS2 is no longer required, although you can use Miller from within MSYS2 if you like. There is now simply a single ``mlr.exe``, with no ``msys2.dll`` alongside anymore. - -See :doc:`installation` for how to get a copy of ``mlr.exe``. - -Setup ----------------------------------------------------------------- - -Simply place ``mlr.exe`` somewhere within your ``PATH`` variable. - -.. image:: pix/miller-windows.png - -To use Miller from within MSYS2/Cygwin, also make sure ``mlr.exe`` is within the ``PATH`` variable. - -.. image:: pix/miller-msys.png - -Differences ----------------------------------------------------------------- - -:doc:`output-colorization` doesn't work on Windows, outside of MSYS2. - -The Windows-support code within Miller makes effort to support Linux/Unix/MacOS-like command-line syntax including single-quoting of expressions for ``mlr put`` and ``mlr filter`` -- and in the examples above, this often works. However, there are still some cases where more complex expressions aren't successfully parsed from the Windows prompt, even though they are from MSYS2: - -.. image:: pix/miller-windows-complex.png - -.. image:: pix/miller-msys-complex.png - -Single quotes with ``&&`` or ``||`` inside are fundamentally unhandleable within Windows; there is nothing Miller can do here as the Windows command line is split before Miller ever receives it. - -One workaround is to use MSYS2. Another workaround is to put more complex DSL expressions into a file: - -.. image:: pix/miller-windows-complex-workaround.png - -A third workaround is to replace ``"`` with ``"""``, then ``'`` with ``"``: - -.. image:: pix/miller-windows-triple-double-quote.png diff --git a/docs6/miller-on-windows.rst.in b/docs6/miller-on-windows.rst.in deleted file mode 100644 index 11ab7c485..000000000 --- a/docs6/miller-on-windows.rst.in +++ /dev/null @@ -1,45 +0,0 @@ -Miller on Windows -================================================================ - -Native builds as of Miller 6 ----------------------------------------------------------------- - -Miller was originally developed for Unix-like operating systems including Linux and MacOS. Since the initial release of Miller in 2015, support for Windows has been partial. But as of version 6.0.0, Miller builds directly on Windows. - -The experience is now almost the same as on Linux, NetBSD/FreeBSD, and MacOS. - -MSYS2 is no longer required, although you can use Miller from within MSYS2 if you like. There is now simply a single ``mlr.exe``, with no ``msys2.dll`` alongside anymore. - -See :doc:`installation` for how to get a copy of ``mlr.exe``. - -Setup ----------------------------------------------------------------- - -Simply place ``mlr.exe`` somewhere within your ``PATH`` variable. - -.. image:: pix/miller-windows.png - -To use Miller from within MSYS2/Cygwin, also make sure ``mlr.exe`` is within the ``PATH`` variable. - -.. image:: pix/miller-msys.png - -Differences ----------------------------------------------------------------- - -:doc:`output-colorization` doesn't work on Windows, outside of MSYS2. - -The Windows-support code within Miller makes effort to support Linux/Unix/MacOS-like command-line syntax including single-quoting of expressions for ``mlr put`` and ``mlr filter`` -- and in the examples above, this often works. However, there are still some cases where more complex expressions aren't successfully parsed from the Windows prompt, even though they are from MSYS2: - -.. image:: pix/miller-windows-complex.png - -.. image:: pix/miller-msys-complex.png - -Single quotes with ``&&`` or ``||`` inside are fundamentally unhandleable within Windows; there is nothing Miller can do here as the Windows command line is split before Miller ever receives it. - -One workaround is to use MSYS2. Another workaround is to put more complex DSL expressions into a file: - -.. image:: pix/miller-windows-complex-workaround.png - -A third workaround is to replace ``"`` with ``"""``, then ``'`` with ``"``: - -.. image:: pix/miller-windows-triple-double-quote.png diff --git a/docs6/misc-examples.rst b/docs6/misc-examples.rst deleted file mode 100644 index d5cb55ba3..000000000 --- a/docs6/misc-examples.rst +++ /dev/null @@ -1,344 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Miscellaneous examples -================================================================ - -Column select: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv cut -f hostname,uptime mydata.csv - -Add new columns as function of other columns: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --nidx put '$sum = $7 < 0.0 ? 3.5 : $7 + 2.1*$8' *.dat - -Row filter: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv filter '$status != "down" && $upsec >= 10000' *.csv - -Apply column labels and pretty-print: - -.. code-block:: none - :emphasize-lines: 1-1 - - grep -v '^#' /etc/group | mlr --ifs : --nidx --opprint label group,pass,gid,member then sort -f group - -Join multiple data sources on key columns: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr join -j account_id -f accounts.dat then group-by account_name balances.dat - -Mulltiple formats including JSON: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --json put '$attr = sub($attr, "([0-9]+)_([0-9]+)_.*", "\1:\2")' data/*.json - -Aggregate per-column statistics: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr stats1 -a min,mean,max,p10,p50,p90 -f flag,u,v data/* - -Linear regression: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr stats2 -a linreg-pca -f u,v -g shape data/* - -Aggregate custom per-column statistics: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put -q '@sum[$a][$b] += $x; end {emit @sum, "a", "b"}' data/* - -Iterate over data using DSL expressions: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --from estimates.tbl put ' - for (k,v in $*) { - if (is_numeric(v) && k =~ "^[t-z].*$") { - $sum += v; $count += 1 - } - } - $mean = $sum / $count # no assignment if count unset - ' - -Run DSL expressions from a script file: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --from infile.dat put -f analyze.mlr - -Split/reduce output to multiple filenames: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --from infile.dat put 'tee > "./taps/data-".$a."-".$b, $*' - -Compressed I/O: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --from infile.dat put 'tee | "gzip > ./taps/data-".$a."-".$b.".gz", $*' - -Interoperate with other data-processing tools using standard pipes: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --from infile.dat put -q '@v=$*; dump | "jq .[]"' - -Tap/trace: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --from infile.dat put '(NR % 1000 == 0) { print > stderr, "Checkpoint ".NR}' - -Program timing ----------------------------------------------------------------- - -This admittedly artificial example demonstrates using Miller time and stats functions to introspectively acquire some information about Miller's own runtime. The ``delta`` function computes the difference between successive timestamps. - -.. code-block:: none - - $ ruby -e '10000.times{|i|puts "i=#{i+1}"}' > lines.txt - - $ head -n 5 lines.txt - i=1 - i=2 - i=3 - i=4 - i=5 - - mlr --ofmt '%.9le' --opprint put '$t=systime()' then step -a delta -f t lines.txt | head -n 7 - i t t_delta - 1 1430603027.018016 1.430603027e+09 - 2 1430603027.018043 2.694129944e-05 - 3 1430603027.018048 5.006790161e-06 - 4 1430603027.018052 4.053115845e-06 - 5 1430603027.018055 2.861022949e-06 - 6 1430603027.018058 3.099441528e-06 - - mlr --ofmt '%.9le' --oxtab \ - put '$t=systime()' then \ - step -a delta -f t then \ - filter '$i>1' then \ - stats1 -a min,mean,max -f t_delta \ - lines.txt - t_delta_min 2.861022949e-06 - t_delta_mean 4.077508505e-06 - t_delta_max 5.388259888e-05 - -Showing differences between successive queries ----------------------------------------------------------------- - -Suppose you have a database query which you run at one point in time, producing the output on the left, then again later producing the output on the right: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/previous_counters.csv - color,count - red,3472 - blue,6838 - orange,694 - purple,12 - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/current_counters.csv - color,count - red,3467 - orange,670 - yellow,27 - blue,6944 - -And, suppose you want to compute the differences in the counters between adjacent keys. Since the color names aren't all in the same order, nor are they all present on both sides, we can't just paste the two files side-by-side and do some column-four-minus-column-two arithmetic. - -First, rename counter columns to make them distinct: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv rename count,previous_count data/previous_counters.csv > data/prevtemp.csv - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/prevtemp.csv - color,previous_count - red,3472 - blue,6838 - orange,694 - purple,12 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv rename count,current_count data/current_counters.csv > data/currtemp.csv - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/currtemp.csv - color,current_count - red,3467 - orange,670 - yellow,27 - blue,6944 - -Then, join on the key field(s), and use unsparsify to zero-fill counters absent on one side but present on the other. Use ``--ul`` and ``--ur`` to emit unpaired records (namely, purple on the left and yellow on the right): - -.. code-block:: none - :emphasize-lines: 1-5 - - mlr --icsv --opprint \ - join -j color --ul --ur -f data/prevtemp.csv \ - then unsparsify --fill-with 0 \ - then put '$count_delta = $current_count - $previous_count' \ - data/currtemp.csv - color previous_count current_count count_delta - red 3472 3467 -5 - orange 694 670 -24 - yellow 0 27 (error) - blue 6838 6944 106 - purple 12 0 (error) - -.. _cookbook-memoization-with-oosvars: - -Memoization with out-of-stream variables ----------------------------------------------------------------- - -The recursive function for the Fibonacci sequence is famous for its computational complexity. Namely, using f(0)=1, f(1)=1, f(n)=f(n-1)+f(n-2) for n>=2, the evaluation tree branches left as well as right at each non-trivial level, resulting in millions or more paths to the root 0/1 nodes for larger n. This program - -.. code-block:: none - - mlr --ofmt '%.9lf' --opprint seqgen --start 1 --stop 28 then put ' - func f(n) { - @fcount += 1; # count number of calls to the function - if (n < 2) { - return 1 - } else { - return f(n-1) + f(n-2) # recurse - } - } - - @fcount = 0; - $o = f($i); - $fcount = @fcount; - - ' then put '$seconds=systime()' then step -a delta -f seconds then cut -x -f seconds - -produces output like this: - -.. code-block:: none - - i o fcount seconds_delta - 1 1 1 0 - 2 2 3 0.000039101 - 3 3 5 0.000015974 - 4 5 9 0.000019073 - 5 8 15 0.000026941 - 6 13 25 0.000036955 - 7 21 41 0.000056028 - 8 34 67 0.000086069 - 9 55 109 0.000134945 - 10 89 177 0.000217915 - 11 144 287 0.000355959 - 12 233 465 0.000506163 - 13 377 753 0.000811815 - 14 610 1219 0.001297235 - 15 987 1973 0.001960993 - 16 1597 3193 0.003417969 - 17 2584 5167 0.006215811 - 18 4181 8361 0.008294106 - 19 6765 13529 0.012095928 - 20 10946 21891 0.019592047 - 21 17711 35421 0.031193972 - 22 28657 57313 0.057254076 - 23 46368 92735 0.080307961 - 24 75025 150049 0.129482031 - 25 121393 242785 0.213325977 - 26 196418 392835 0.334423065 - 27 317811 635621 0.605969906 - 28 514229 1028457 0.971235037 - -Note that the time it takes to evaluate the function is blowing up exponentially as the input argument increases. Using ``@``-variables, which persist across records, we can cache and reuse the results of previous computations: - -.. code-block:: none - - mlr --ofmt '%.9lf' --opprint seqgen --start 1 --stop 28 then put ' - func f(n) { - @fcount += 1; # count number of calls to the function - if (is_present(@fcache[n])) { # cache hit - return @fcache[n] - } else { # cache miss - num rv = 1; - if (n >= 2) { - rv = f(n-1) + f(n-2) # recurse - } - @fcache[n] = rv; - return rv - } - } - @fcount = 0; - $o = f($i); - $fcount = @fcount; - ' then put '$seconds=systime()' then step -a delta -f seconds then cut -x -f seconds - -with output like this: - -.. code-block:: none - - i o fcount seconds_delta - 1 1 1 0 - 2 2 3 0.000053883 - 3 3 3 0.000035048 - 4 5 3 0.000045061 - 5 8 3 0.000014067 - 6 13 3 0.000028849 - 7 21 3 0.000028133 - 8 34 3 0.000027895 - 9 55 3 0.000014067 - 10 89 3 0.000015020 - 11 144 3 0.000012875 - 12 233 3 0.000033140 - 13 377 3 0.000014067 - 14 610 3 0.000012875 - 15 987 3 0.000029087 - 16 1597 3 0.000013828 - 17 2584 3 0.000013113 - 18 4181 3 0.000012875 - 19 6765 3 0.000013113 - 20 10946 3 0.000012875 - 21 17711 3 0.000013113 - 22 28657 3 0.000013113 - 23 46368 3 0.000015974 - 24 75025 3 0.000012875 - 25 121393 3 0.000013113 - 26 196418 3 0.000012875 - 27 317811 3 0.000013113 - 28 514229 3 0.000012875 diff --git a/docs6/misc-examples.rst.in b/docs6/misc-examples.rst.in deleted file mode 100644 index f6d087643..000000000 --- a/docs6/misc-examples.rst.in +++ /dev/null @@ -1,224 +0,0 @@ -Miscellaneous examples -================================================================ - -Column select: - -GENRST_SHOW_COMMAND -mlr --csv cut -f hostname,uptime mydata.csv -GENRST_EOF - -Add new columns as function of other columns: - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr --nidx put '$sum = $7 < 0.0 ? 3.5 : $7 + 2.1*$8' *.dat -GENRST_EOF - -Row filter: - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr --csv filter '$status != "down" && $upsec >= 10000' *.csv -GENRST_EOF - -Apply column labels and pretty-print: - -GENRST_CARDIFY_HIGHLIGHT_ONE -grep -v '^#' /etc/group | mlr --ifs : --nidx --opprint label group,pass,gid,member then sort -f group -GENRST_EOF - -Join multiple data sources on key columns: - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr join -j account_id -f accounts.dat then group-by account_name balances.dat -GENRST_EOF - -Mulltiple formats including JSON: - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr --json put '$attr = sub($attr, "([0-9]+)_([0-9]+)_.*", "\1:\2")' data/*.json -GENRST_EOF - -Aggregate per-column statistics: - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr stats1 -a min,mean,max,p10,p50,p90 -f flag,u,v data/* -GENRST_EOF - -Linear regression: - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr stats2 -a linreg-pca -f u,v -g shape data/* -GENRST_EOF - -Aggregate custom per-column statistics: - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr put -q '@sum[$a][$b] += $x; end {emit @sum, "a", "b"}' data/* -GENRST_EOF - -Iterate over data using DSL expressions: - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr --from estimates.tbl put ' - for (k,v in $*) { - if (is_numeric(v) && k =~ "^[t-z].*$") { - $sum += v; $count += 1 - } - } - $mean = $sum / $count # no assignment if count unset -' -GENRST_EOF - -Run DSL expressions from a script file: - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr --from infile.dat put -f analyze.mlr -GENRST_EOF - -Split/reduce output to multiple filenames: - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr --from infile.dat put 'tee > "./taps/data-".$a."-".$b, $*' -GENRST_EOF - -Compressed I/O: - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr --from infile.dat put 'tee | "gzip > ./taps/data-".$a."-".$b.".gz", $*' -GENRST_EOF - -Interoperate with other data-processing tools using standard pipes: - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr --from infile.dat put -q '@v=$*; dump | "jq .[]"' -GENRST_EOF - -Tap/trace: - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr --from infile.dat put '(NR % 1000 == 0) { print > stderr, "Checkpoint ".NR}' -GENRST_EOF - -Program timing ----------------------------------------------------------------- - -This admittedly artificial example demonstrates using Miller time and stats functions to introspectively acquire some information about Miller's own runtime. The ``delta`` function computes the difference between successive timestamps. - -GENRST_INCLUDE_ESCAPED(data/timing-example.txt) - -Showing differences between successive queries ----------------------------------------------------------------- - -Suppose you have a database query which you run at one point in time, producing the output on the left, then again later producing the output on the right: - -GENRST_RUN_COMMAND -cat data/previous_counters.csv -GENRST_EOF - -GENRST_RUN_COMMAND -cat data/current_counters.csv -GENRST_EOF - -And, suppose you want to compute the differences in the counters between adjacent keys. Since the color names aren't all in the same order, nor are they all present on both sides, we can't just paste the two files side-by-side and do some column-four-minus-column-two arithmetic. - -First, rename counter columns to make them distinct: - -GENRST_RUN_COMMAND -mlr --csv rename count,previous_count data/previous_counters.csv > data/prevtemp.csv -GENRST_EOF - -GENRST_RUN_COMMAND -cat data/prevtemp.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --csv rename count,current_count data/current_counters.csv > data/currtemp.csv -GENRST_EOF - -GENRST_RUN_COMMAND -cat data/currtemp.csv -GENRST_EOF - -Then, join on the key field(s), and use unsparsify to zero-fill counters absent on one side but present on the other. Use ``--ul`` and ``--ur`` to emit unpaired records (namely, purple on the left and yellow on the right): - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/previous-to-current.sh) - -.. _cookbook-memoization-with-oosvars: - -Memoization with out-of-stream variables ----------------------------------------------------------------- - -The recursive function for the Fibonacci sequence is famous for its computational complexity. Namely, using f(0)=1, f(1)=1, f(n)=f(n-1)+f(n-2) for n>=2, the evaluation tree branches left as well as right at each non-trivial level, resulting in millions or more paths to the root 0/1 nodes for larger n. This program - -GENRST_INCLUDE_ESCAPED(data/fibo-uncached.sh) - -produces output like this: - -GENRST_CARDIFY -i o fcount seconds_delta -1 1 1 0 -2 2 3 0.000039101 -3 3 5 0.000015974 -4 5 9 0.000019073 -5 8 15 0.000026941 -6 13 25 0.000036955 -7 21 41 0.000056028 -8 34 67 0.000086069 -9 55 109 0.000134945 -10 89 177 0.000217915 -11 144 287 0.000355959 -12 233 465 0.000506163 -13 377 753 0.000811815 -14 610 1219 0.001297235 -15 987 1973 0.001960993 -16 1597 3193 0.003417969 -17 2584 5167 0.006215811 -18 4181 8361 0.008294106 -19 6765 13529 0.012095928 -20 10946 21891 0.019592047 -21 17711 35421 0.031193972 -22 28657 57313 0.057254076 -23 46368 92735 0.080307961 -24 75025 150049 0.129482031 -25 121393 242785 0.213325977 -26 196418 392835 0.334423065 -27 317811 635621 0.605969906 -28 514229 1028457 0.971235037 -GENRST_EOF - -Note that the time it takes to evaluate the function is blowing up exponentially as the input argument increases. Using ``@``-variables, which persist across records, we can cache and reuse the results of previous computations: - -GENRST_INCLUDE_ESCAPED(data/fibo-cached.sh) - -with output like this: - -GENRST_CARDIFY -i o fcount seconds_delta -1 1 1 0 -2 2 3 0.000053883 -3 3 3 0.000035048 -4 5 3 0.000045061 -5 8 3 0.000014067 -6 13 3 0.000028849 -7 21 3 0.000028133 -8 34 3 0.000027895 -9 55 3 0.000014067 -10 89 3 0.000015020 -11 144 3 0.000012875 -12 233 3 0.000033140 -13 377 3 0.000014067 -14 610 3 0.000012875 -15 987 3 0.000029087 -16 1597 3 0.000013828 -17 2584 3 0.000013113 -18 4181 3 0.000012875 -19 6765 3 0.000013113 -20 10946 3 0.000012875 -21 17711 3 0.000013113 -22 28657 3 0.000013113 -23 46368 3 0.000015974 -24 75025 3 0.000012875 -25 121393 3 0.000013113 -26 196418 3 0.000012875 -27 317811 3 0.000013113 -28 514229 3 0.000012875 -GENRST_EOF diff --git a/docs6/mk-func-h2s.sh b/docs6/mk-func-h2s.sh deleted file mode 100755 index d7965d84f..000000000 --- a/docs6/mk-func-h2s.sh +++ /dev/null @@ -1,115 +0,0 @@ -#!/bin/bash - -# In case the user running this has a .mlrrc -export MLRRC=__none__ - -mlr help list-functions | grep -v '^[a-zA-Z]' | uniq | while read funcname; do - displayname=$funcname - linkname="$funcname" - if [ "$funcname" = '+' ]; then - displayname='\+' - linkname='plus' - elif [ "$funcname" = '-' ]; then - displayname='\-' - linkname='minus' - elif [ "$funcname" = '*' ]; then - displayname='\*' - linkname='times' - elif [ "$funcname" = '**' ]; then - displayname='\**' - linkname='exponentiation' - elif [ "$funcname" = '|' ]; then - displayname='\|' - linkname='bitwise-or' - elif [ "$funcname" = '?' ]; then - displayname='\?' - linkname='question-mark' - elif [ "$funcname" = ':' ]; then - displayname='\:' - linkname='colon' - elif [ "$funcname" = '!' ]; then - displayname='\!' - linkname='colon' - elif [ "$funcname" = '? :' ]; then - displayname='\?' - linkname='question-mark-colon' - elif [ "$funcname" = '?:' ]; then - displayname='\?' - linkname='question-mark-colon' - elif [ "$funcname" = '>>' ]; then - displayname='\>\>' - linkname='srsh' - elif [ "$funcname" = '>>>' ]; then - displayname='\>\>\>' - linkname='ursh' - elif [ "$funcname" = '>>>=' ]; then - displayname='\>\>\>=' - linkname='ursheq' - fi - - echo "" - echo ".. _reference-dsl-${linkname}:" - echo "" - echo "$displayname" - echo "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" - echo "" - echo '.. code-block:: none' - echo '' - mlr help function "$funcname" | sed 's/^/ /' - echo '' - echo '' -done - -mlr help list-functions | grep '^[a-zA-Z]' | sort -u | while read funcname; do - displayname=$funcname - linkname="$funcname" - if [ "$funcname" = '+' ]; then - displayname='\+' - linkname='plus' - elif [ "$funcname" = '-' ]; then - displayname='\-' - linkname='minus' - elif [ "$funcname" = '*' ]; then - displayname='\*' - linkname='times' - elif [ "$funcname" = '**' ]; then - displayname='\**' - linkname='exponentiation' - elif [ "$funcname" = '|' ]; then - displayname='\|' - linkname='bitwise-or' - elif [ "$funcname" = '?' ]; then - displayname='\?' - linkname='question-mark' - elif [ "$funcname" = ':' ]; then - displayname='\:' - linkname='colon' - elif [ "$funcname" = '!' ]; then - displayname='\!' - linkname='colon' - elif [ "$funcname" = '? :' ]; then - displayname='\?' - linkname='question-mark-colon' - elif [ "$funcname" = '>>' ]; then - displayname='\>\>' - linkname='srsh' - elif [ "$funcname" = '>>>' ]; then - displayname='\>\>\>' - linkname='ursh' - elif [ "$funcname" = '>>>=' ]; then - displayname='\>\>\>=' - linkname='ursheq' - fi - - echo "" - echo ".. _reference-dsl-${linkname}:" - echo "" - echo "$displayname" - echo "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" - echo "" - echo '.. code-block:: none' - echo '' - mlr help function "$funcname" | sed 's/^/ /' - echo '' - echo '' -done diff --git a/docs6b/mkdocs.yml b/docs6/mkdocs.yml similarity index 100% rename from docs6b/mkdocs.yml rename to docs6/mkdocs.yml diff --git a/docs6/morph b/docs6/morph deleted file mode 100755 index 5fed65a00..000000000 --- a/docs6/morph +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env ruby - -while true - begin - line = $stdin.readline.chomp - rescue EOFError - break - end - - if line =~ /GENRST_RUN_COMMAND{{.*}}HERE/ - line.sub!("GENRST_RUN_COMMAND{{", "") - line.sub!("}}HERE", "") - puts 'GENRST_RUN_COMMAND' - puts line - puts 'GENRST_EOF' - else - puts line - end -end diff --git a/docs6/morphs b/docs6/morphs deleted file mode 100755 index a3fa56335..000000000 --- a/docs6/morphs +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -if [ $# -ge 1 ]; then - for f in $*; do - echo $f ... - ./morph < $f > tmp.$f && mv tmp.$f $f - done -else - for f in *.rst.in; do - echo $f ... - ./morph < $f > tmp.$f && mv tmp.$f $f - done -fi diff --git a/docs6/new-in-miller-6.rst b/docs6/new-in-miller-6.rst deleted file mode 100644 index 9c12d835d..000000000 --- a/docs6/new-in-miller-6.rst +++ /dev/null @@ -1,141 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -What's new in Miller 6 -================================================================ - -See also the `list of issues tagged with go-port `_. - -Documentation improvements ----------------------------------------------------------------- - -Documentation (what you're reading here) and on-line help (``mlr --help``) have been completely reworked. - -In the initial release, the focus was convincing users already familiar with -``awk``/``grep``/``cut`` that Miller was a viable option. Over time it's become -clear that many users aren't expert with these. The focus has shifted toward a -higher quantity of more introductory/accessible material for command-line data -processing. - -Similarly, the FAQ/recipe material has been expanded to include more, and simpler, -use-cases including resolved questions from -https://github.com/johnkerl/miller/issues and -https://github.com/johnkerl/miller/discussions. More complex/niche material has -been pushed farther down. The long reference pages have been split up into -separate pages. - -Since CSV is overwhelmingly the most popular data format for Miller, it is -now discussed first, and more examples use CSV. - -JSON support, and arrays ----------------------------------------------------------------- - -Arrays are now supported in Miller's ``put``/``filter`` programming language, -as described at :doc:`reference-dsl-arrays`. Also, ``array`` is now a keyword -so this is no longer usable as a local-variable or UDF name. - -JSON support is improved: - -* Direct support for arrays means that you can now use Miller to process more JSON files. -* Streamable JSON parsing: Miller's internal record-processing pipeline starts as soon as the first record is read (which was already the case for other file formats). This means that, unless records are wrapped with outermost ``[...]``, Miller now handles JSON in ``tail -f`` contexts like it does for other file formats. -* Flatten/unflatten -- TODO pick a name and link to a separate page/section - -Improved Windows experience ----------------------------------------------------------------- - -Stronger support for Windows (with or without MSYS2), with a couple of -exceptions. See :doc:`miller-on-windows` for more information. - -Binaries are reliably available using GitHub Actions: see also :doc:`installation`. - -In-process support for compressed input ----------------------------------------------------------------- - -In addition to ``--prepipe gunzip``, you can now use the ``--gzin`` flag. In -fact, if your files end in ``.gz`` you don't even need to do that -- Miller -will autodetect by file extension and automatically uncompress ``mlr --csv cat -foo.csv.gz``. Similarly for ``.z`` and ``.bz2`` files. Please see section -[TODO:linkify] for more information. - -Output colorization ----------------------------------------------------------------- - -Miller uses separate, customizable colors for keys and values whenever the output is to a terminal. See :doc:`output-colorization`. - -Improved numeric conversion ----------------------------------------------------------------- - -The most central part of Miller 6 is a deep refactor of how data values are parsed -from file contents, how types are inferred, and how they're converted back to -text into output files. - -This was all initiated by https://github.com/johnkerl/miller/issues/151. - -In Miller 5 and below, all values were stored as strings, then only converted -to int/float as-needed, for example when a particular field was referenced in -the ``stats1`` or ``put`` verbs. This led to awkwardnesses such as the ``-S`` -and ``-F`` flags for ``put`` and ``filter``. - -In Miller 6, things parseable as int/float are treated as such from the moment -the input data is read, and these are passed along through the verb chain. All -values are typed from when they're read, and their types are passed along. -Meanwhile the original string representation of each value is also retained. If -a numeric field isn't modified during the processing chain, it's printed out -the way it arrived. Also, quoted values in JSON strings are flagged as being -strings throughout the processing chain. - -For example (see https://github.com/johnkerl/miller/issues/178) you can now do - -.. code-block:: none - :emphasize-lines: 1-1 - - echo '{ "a": "0123" }' | mlr --json cat - { - "a": "0123" - } - -.. code-block:: none - :emphasize-lines: 1-1 - - echo '{ "x": 1.230, "y": 1.230000000 }' | mlr --json cat - { - "x": 1.230, - "y": 1.230000000 - } - -REPL ----------------------------------------------------------------- - -Miller now has a read-evaluate-print-loop (:doc:`repl`) where you can single-step through your data-file record, express arbitrary statements to converse with the data, etc. - -New DSL functions / operators ----------------------------------------------------------------- - -* String-hashing functions :ref:`reference-dsl-md5`, :ref:`reference-dsl-sha1`, :ref:`reference-dsl-sha256`, and :ref:`reference-dsl-sha512`. -* Platform-property functions :ref:`reference-dsl-hostname`, :ref:`reference-dsl-os`, and :ref:`reference-dsl-version`. -* Unsigned right-shift :ref:`reference-dsl-ursh` along with ``>>>=``. - -Improved command-line parsing ----------------------------------------------------------------- - -Miller 6 has getoptish command-line parsing (https://github.com/johnkerl/miller/pull/467): - -* ``-xyz`` expands automatically to ``-x -y -z``, so (for example) ``mlr cut -of shape,flag`` is the same as ``mlr cut -o -f shape,flag``. -* ``--foo=bar`` expands automatically to ``--foo bar``, so (for example) ``mlr --ifs=comma`` is the same as ``mlr --ifs comma``. -* ``--mfrom``, ``--load``, ``--mload`` as described at [TODO:linkify]. - -Improved error messages for DSL parsing ----------------------------------------------------------------- - -For ``mlr put`` and ``mlr filter``, parse-error messages now include location information: - -.. code-block:: none - - mlr: cannot parse DSL expression. - Parse error on token ">" at line 63 columnn 7. - -Developer-specific aspects ----------------------------------------------------------------- - -* Miller has been ported from C to Go. Developer notes: https://github.com/johnkerl/miller/blob/main/go/README.md -* Completely reworked regression testing, including running on Windows diff --git a/docs6/new-in-miller-6.rst.in b/docs6/new-in-miller-6.rst.in deleted file mode 100644 index d6a98b571..000000000 --- a/docs6/new-in-miller-6.rst.in +++ /dev/null @@ -1,129 +0,0 @@ -What's new in Miller 6 -================================================================ - -See also the `list of issues tagged with go-port `_. - -Documentation improvements ----------------------------------------------------------------- - -Documentation (what you're reading here) and on-line help (``mlr --help``) have been completely reworked. - -In the initial release, the focus was convincing users already familiar with -``awk``/``grep``/``cut`` that Miller was a viable option. Over time it's become -clear that many users aren't expert with these. The focus has shifted toward a -higher quantity of more introductory/accessible material for command-line data -processing. - -Similarly, the FAQ/recipe material has been expanded to include more, and simpler, -use-cases including resolved questions from -https://github.com/johnkerl/miller/issues and -https://github.com/johnkerl/miller/discussions. More complex/niche material has -been pushed farther down. The long reference pages have been split up into -separate pages. - -Since CSV is overwhelmingly the most popular data format for Miller, it is -now discussed first, and more examples use CSV. - -JSON support, and arrays ----------------------------------------------------------------- - -Arrays are now supported in Miller's ``put``/``filter`` programming language, -as described at :doc:`reference-dsl-arrays`. Also, ``array`` is now a keyword -so this is no longer usable as a local-variable or UDF name. - -JSON support is improved: - -* Direct support for arrays means that you can now use Miller to process more JSON files. -* Streamable JSON parsing: Miller's internal record-processing pipeline starts as soon as the first record is read (which was already the case for other file formats). This means that, unless records are wrapped with outermost ``[...]``, Miller now handles JSON in ``tail -f`` contexts like it does for other file formats. -* Flatten/unflatten -- TODO pick a name and link to a separate page/section - -Improved Windows experience ----------------------------------------------------------------- - -Stronger support for Windows (with or without MSYS2), with a couple of -exceptions. See :doc:`miller-on-windows` for more information. - -Binaries are reliably available using GitHub Actions: see also :doc:`installation`. - -In-process support for compressed input ----------------------------------------------------------------- - -In addition to ``--prepipe gunzip``, you can now use the ``--gzin`` flag. In -fact, if your files end in ``.gz`` you don't even need to do that -- Miller -will autodetect by file extension and automatically uncompress ``mlr --csv cat -foo.csv.gz``. Similarly for ``.z`` and ``.bz2`` files. Please see section -[TODO:linkify] for more information. - -Output colorization ----------------------------------------------------------------- - -Miller uses separate, customizable colors for keys and values whenever the output is to a terminal. See :doc:`output-colorization`. - -Improved numeric conversion ----------------------------------------------------------------- - -The most central part of Miller 6 is a deep refactor of how data values are parsed -from file contents, how types are inferred, and how they're converted back to -text into output files. - -This was all initiated by https://github.com/johnkerl/miller/issues/151. - -In Miller 5 and below, all values were stored as strings, then only converted -to int/float as-needed, for example when a particular field was referenced in -the ``stats1`` or ``put`` verbs. This led to awkwardnesses such as the ``-S`` -and ``-F`` flags for ``put`` and ``filter``. - -In Miller 6, things parseable as int/float are treated as such from the moment -the input data is read, and these are passed along through the verb chain. All -values are typed from when they're read, and their types are passed along. -Meanwhile the original string representation of each value is also retained. If -a numeric field isn't modified during the processing chain, it's printed out -the way it arrived. Also, quoted values in JSON strings are flagged as being -strings throughout the processing chain. - -For example (see https://github.com/johnkerl/miller/issues/178) you can now do - -GENRST_RUN_COMMAND -echo '{ "a": "0123" }' | mlr --json cat -GENRST_EOF - -GENRST_RUN_COMMAND -echo '{ "x": 1.230, "y": 1.230000000 }' | mlr --json cat -GENRST_EOF - -REPL ----------------------------------------------------------------- - -Miller now has a read-evaluate-print-loop (:doc:`repl`) where you can single-step through your data-file record, express arbitrary statements to converse with the data, etc. - -New DSL functions / operators ----------------------------------------------------------------- - -* String-hashing functions :ref:`reference-dsl-md5`, :ref:`reference-dsl-sha1`, :ref:`reference-dsl-sha256`, and :ref:`reference-dsl-sha512`. -* Platform-property functions :ref:`reference-dsl-hostname`, :ref:`reference-dsl-os`, and :ref:`reference-dsl-version`. -* Unsigned right-shift :ref:`reference-dsl-ursh` along with ``>>>=``. - -Improved command-line parsing ----------------------------------------------------------------- - -Miller 6 has getoptish command-line parsing (https://github.com/johnkerl/miller/pull/467): - -* ``-xyz`` expands automatically to ``-x -y -z``, so (for example) ``mlr cut -of shape,flag`` is the same as ``mlr cut -o -f shape,flag``. -* ``--foo=bar`` expands automatically to ``--foo bar``, so (for example) ``mlr --ifs=comma`` is the same as ``mlr --ifs comma``. -* ``--mfrom``, ``--load``, ``--mload`` as described at [TODO:linkify]. - -Improved error messages for DSL parsing ----------------------------------------------------------------- - -For ``mlr put`` and ``mlr filter``, parse-error messages now include location information: - -GENRST_CARDIFY -mlr: cannot parse DSL expression. -Parse error on token ">" at line 63 columnn 7. -GENRST_EOF - -Developer-specific aspects ----------------------------------------------------------------- - -* Miller has been ported from C to Go. Developer notes: https://github.com/johnkerl/miller/blob/main/go/README.md -* Completely reworked regression testing, including running on Windows diff --git a/docs6/operating-on-all-fields.rst b/docs6/operating-on-all-fields.rst deleted file mode 100644 index 479a4579d..000000000 --- a/docs6/operating-on-all-fields.rst +++ /dev/null @@ -1,128 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Operating on all fields -======================= - -Bulk rename of fields ----------------------------------------------------------------- - -Suppose you want to replace spaces with underscores in your column names: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/spaces.csv - a b c,def,g h i - 123,4567,890 - 2468,1357,3579 - 9987,3312,4543 - -The simplest way is to use ``mlr rename`` with ``-g`` (for global replace, not just first occurrence of space within each field) and ``-r`` for pattern-matching (rather than explicit single-column renames): - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv rename -g -r ' ,_' data/spaces.csv - a_b_c,def,g_h_i - 123,4567,890 - 2468,1357,3579 - 9987,3312,4543 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv --opprint rename -g -r ' ,_' data/spaces.csv - a_b_c def g_h_i - 123 4567 890 - 2468 1357 3579 - 9987 3312 4543 - -You can also do this with a for-loop: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/bulk-rename-for-loop.mlr - map newrec = {}; - for (oldk, v in $*) { - newrec[gsub(oldk, " ", "_")] = v; - } - $* = newrec - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --opprint put -f data/bulk-rename-for-loop.mlr data/spaces.csv - a_b_c def g_h_i - 123 4567 890 - 2468 1357 3579 - 9987 3312 4543 - -Search-and-replace over all fields ----------------------------------------------------------------- - -How to do ``$name = gsub($name, "old", "new")`` for all fields? - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/sar.csv - a,b,c - the quick,brown fox,jumped - over,the,lazy dogs - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/sar.mlr - for (k in $*) { - $[k] = gsub($[k], "e", "X"); - } - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv put -f data/sar.mlr data/sar.csv - a,b,c - thX quick,brown fox,jumpXd - ovXr,thX,lazy dogs - -Full field renames and reassigns ----------------------------------------------------------------- - -Using Miller 5.0.0's map literals and assigning to ``$*``, you can fully generalize :ref:`mlr rename `, :ref:`mlr reorder `, etc. - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/small - a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533 - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797 - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776 - a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729 - -.. code-block:: none - :emphasize-lines: 1-15 - - mlr put ' - begin { - @i_cumu = 0; - } - - @i_cumu += $i; - $* = { - "z": $x + y, - "KEYFIELD": $a, - "i": @i_cumu, - "b": $b, - "y": $x, - "x": $y, - }; - ' data/small - z=0.3467901443380824,KEYFIELD=pan,i=1,b=pan,y=0.3467901443380824,x=0.7268028627434533 - z=0.7586799647899636,KEYFIELD=eks,i=3,b=pan,y=0.7586799647899636,x=0.5221511083334797 - z=0.20460330576630303,KEYFIELD=wye,i=6,b=wye,y=0.20460330576630303,x=0.33831852551664776 - z=0.38139939387114097,KEYFIELD=eks,i=10,b=wye,y=0.38139939387114097,x=0.13418874328430463 - z=0.5732889198020006,KEYFIELD=wye,i=15,b=pan,y=0.5732889198020006,x=0.8636244699032729 diff --git a/docs6/operating-on-all-fields.rst.in b/docs6/operating-on-all-fields.rst.in deleted file mode 100644 index e7a523cbd..000000000 --- a/docs6/operating-on-all-fields.rst.in +++ /dev/null @@ -1,59 +0,0 @@ -Operating on all fields -======================= - -Bulk rename of fields ----------------------------------------------------------------- - -Suppose you want to replace spaces with underscores in your column names: - -GENRST_RUN_COMMAND -cat data/spaces.csv -GENRST_EOF - -The simplest way is to use ``mlr rename`` with ``-g`` (for global replace, not just first occurrence of space within each field) and ``-r`` for pattern-matching (rather than explicit single-column renames): - -GENRST_RUN_COMMAND -mlr --csv rename -g -r ' ,_' data/spaces.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --csv --opprint rename -g -r ' ,_' data/spaces.csv -GENRST_EOF - -You can also do this with a for-loop: - -GENRST_RUN_COMMAND -cat data/bulk-rename-for-loop.mlr -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --icsv --opprint put -f data/bulk-rename-for-loop.mlr data/spaces.csv -GENRST_EOF - -Search-and-replace over all fields ----------------------------------------------------------------- - -How to do ``$name = gsub($name, "old", "new")`` for all fields? - -GENRST_RUN_COMMAND -cat data/sar.csv -GENRST_EOF - -GENRST_RUN_COMMAND -cat data/sar.mlr -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --csv put -f data/sar.mlr data/sar.csv -GENRST_EOF - -Full field renames and reassigns ----------------------------------------------------------------- - -Using Miller 5.0.0's map literals and assigning to ``$*``, you can fully generalize :ref:`mlr rename `, :ref:`mlr reorder `, etc. - -GENRST_RUN_COMMAND -cat data/small -GENRST_EOF - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/full-reorg.sh) diff --git a/docs6/originality.rst b/docs6/originality.rst deleted file mode 100644 index 3bc33f68c..000000000 --- a/docs6/originality.rst +++ /dev/null @@ -1,43 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -How original is Miller? -================================================================ - -It isn't. Miller is one of many, many participants in the online-analytical-processing culture. Other key participants include ``awk``, SQL, spreadsheets, etc. etc. etc. Far from being an original concept, Miller explicitly strives to imitate several existing tools: - -**The Unix toolkit**: Intentional similarities as described in :doc:`feature-comparison`. - -Recipes abound for command-line data analysis using the Unix toolkit. Here are just a couple of my favorites: - -* http://en.wikibooks.org/wiki/Ad_Hoc_Data_Analysis_From_The_Unix_Command_Line -* http://www.gregreda.com/2013/07/15/unix-commands-for-data-science -* https://github.com/dbohdan/structured-text-tools - -**RecordStream**: Miller owes particular inspiration to `RecordStream `_. The key difference is that RecordStream is a Perl-based tool for manipulating JSON (including requiring it to separately manipulate other formats such as CSV into and out of JSON), while Miller is fast Go which handles its formats natively. The similarities include the ``sort``, ``stats1`` (analog of RecordStream's ``collate``), and ``delta`` operations, as well as ``filter`` and ``put``, and pretty-print formatting. - -**stats_m**: A third source of lineage is my Python `stats_m `_ module. This includes simple single-pass algorithms which form Miller's ``stats1`` and ``stats2`` subcommands. - -**SQL**: Fourthly, Miller's ``group-by`` command name is from SQL, as is the term ``aggregate``. - -**Added value**: Miller's added values include: - -* Name-indexing, compared to the Unix toolkit's positional indexing. -* Raw speed, compared to ``awk``, RecordStream, ``stats_m``, or various other kinds of Python/Ruby/etc. scripts one can easily create. -* Compact keystroking for many common tasks, with a decent amount of flexibility. -* Ability to handle text files on the Unix pipe, without need for creating database tables, compared to SQL databases. -* Various file formats, and on-the-fly format conversion. - -**jq**: Miller does for name-indexed text what `jq `_ does for JSON. If you're not already familiar with ``jq``, please check it out!. - -**What about similar tools?** - -Here's a comprehensive list: https://github.com/dbohdan/structured-text-tools. Last I knew it doesn't mention `rows `_ so here's a plug for that as well. As it turns out, I learned about most of these after writing Miller. - -**What about DOTADIW?** One of the key points of the `Unix philosophy `_ is that a tool should do one thing and do it well. Hence ``sort`` and ``cut`` do just one thing. Why does Miller put ``awk``-like processing, a few SQL-like operations, and statistical reduction all into one tool? This is a fair question. First note that many standard tools, such as ``awk`` and ``perl``, do quite a few things -- as does ``jq``. But I could have pushed for putting format awareness and name-indexing options into ``cut``, ``awk``, and so on (so you could do ``cut -f hostname,uptime`` or ``awk '{sum += $x*$y}END{print sum}'``). Patching ``cut``, ``sort``, etc. on multiple operating systems is a non-starter in terms of uptake. Moreover, it makes sense for me to have Miller be a tool which collects together format-aware record-stream processing into one place, with good reuse of Miller-internal library code for its various features. - -**Why not use Perl/Python/Ruby etc.?** Maybe you should. With those tools you'll get far more expressive power, and sufficiently quick turnaround time for small-to-medium-sized data. Using Miller you'll get something less than a complete programming language, but which is fast, with moderate amounts of flexibility and much less keystroking. - -When I was first developing Miller I made a survey of several languages. Using low-level implementation languages like C, Go, Rust, and Nim, I'd need to create my own domain-specific language (DSL) which would always be less featured than a full programming language, but I'd get better performance. Using high-level interpreted languages such as Perl/Python/Ruby I'd get the language's ``eval`` for free and I wouldn't need a DSL; Miller would have mainly been a set of format-specific I/O hooks. If I'd gotten good enough performance from the latter I'd have done it without question and Miller would be far more flexible. But high-level languages win the performance criteria by a landslide so we have Miller in Go with a custom DSL. - -**No, really, why one more command-line data-manipulation tool?** I wrote Miller because I was frustrated with tools like ``grep``, ``sed``, and so on being *line-aware* without being *format-aware*. The single most poignant example I can think of is seeing people grep data lines out of their CSV files and sadly losing their header lines. While some lighter-than-SQL processing is very nice to have, at core I wanted the format-awareness of `RecordStream `_ combined with the raw speed of the Unix toolkit. Miller does precisely that. diff --git a/docs6/originality.rst.in b/docs6/originality.rst.in deleted file mode 100644 index 53ba2d3c9..000000000 --- a/docs6/originality.rst.in +++ /dev/null @@ -1,40 +0,0 @@ -How original is Miller? -================================================================ - -It isn't. Miller is one of many, many participants in the online-analytical-processing culture. Other key participants include ``awk``, SQL, spreadsheets, etc. etc. etc. Far from being an original concept, Miller explicitly strives to imitate several existing tools: - -**The Unix toolkit**: Intentional similarities as described in :doc:`feature-comparison`. - -Recipes abound for command-line data analysis using the Unix toolkit. Here are just a couple of my favorites: - -* http://en.wikibooks.org/wiki/Ad_Hoc_Data_Analysis_From_The_Unix_Command_Line -* http://www.gregreda.com/2013/07/15/unix-commands-for-data-science -* https://github.com/dbohdan/structured-text-tools - -**RecordStream**: Miller owes particular inspiration to `RecordStream `_. The key difference is that RecordStream is a Perl-based tool for manipulating JSON (including requiring it to separately manipulate other formats such as CSV into and out of JSON), while Miller is fast Go which handles its formats natively. The similarities include the ``sort``, ``stats1`` (analog of RecordStream's ``collate``), and ``delta`` operations, as well as ``filter`` and ``put``, and pretty-print formatting. - -**stats_m**: A third source of lineage is my Python `stats_m `_ module. This includes simple single-pass algorithms which form Miller's ``stats1`` and ``stats2`` subcommands. - -**SQL**: Fourthly, Miller's ``group-by`` command name is from SQL, as is the term ``aggregate``. - -**Added value**: Miller's added values include: - -* Name-indexing, compared to the Unix toolkit's positional indexing. -* Raw speed, compared to ``awk``, RecordStream, ``stats_m``, or various other kinds of Python/Ruby/etc. scripts one can easily create. -* Compact keystroking for many common tasks, with a decent amount of flexibility. -* Ability to handle text files on the Unix pipe, without need for creating database tables, compared to SQL databases. -* Various file formats, and on-the-fly format conversion. - -**jq**: Miller does for name-indexed text what `jq `_ does for JSON. If you're not already familiar with ``jq``, please check it out!. - -**What about similar tools?** - -Here's a comprehensive list: https://github.com/dbohdan/structured-text-tools. Last I knew it doesn't mention `rows `_ so here's a plug for that as well. As it turns out, I learned about most of these after writing Miller. - -**What about DOTADIW?** One of the key points of the `Unix philosophy `_ is that a tool should do one thing and do it well. Hence ``sort`` and ``cut`` do just one thing. Why does Miller put ``awk``-like processing, a few SQL-like operations, and statistical reduction all into one tool? This is a fair question. First note that many standard tools, such as ``awk`` and ``perl``, do quite a few things -- as does ``jq``. But I could have pushed for putting format awareness and name-indexing options into ``cut``, ``awk``, and so on (so you could do ``cut -f hostname,uptime`` or ``awk '{sum += $x*$y}END{print sum}'``). Patching ``cut``, ``sort``, etc. on multiple operating systems is a non-starter in terms of uptake. Moreover, it makes sense for me to have Miller be a tool which collects together format-aware record-stream processing into one place, with good reuse of Miller-internal library code for its various features. - -**Why not use Perl/Python/Ruby etc.?** Maybe you should. With those tools you'll get far more expressive power, and sufficiently quick turnaround time for small-to-medium-sized data. Using Miller you'll get something less than a complete programming language, but which is fast, with moderate amounts of flexibility and much less keystroking. - -When I was first developing Miller I made a survey of several languages. Using low-level implementation languages like C, Go, Rust, and Nim, I'd need to create my own domain-specific language (DSL) which would always be less featured than a full programming language, but I'd get better performance. Using high-level interpreted languages such as Perl/Python/Ruby I'd get the language's ``eval`` for free and I wouldn't need a DSL; Miller would have mainly been a set of format-specific I/O hooks. If I'd gotten good enough performance from the latter I'd have done it without question and Miller would be far more flexible. But high-level languages win the performance criteria by a landslide so we have Miller in Go with a custom DSL. - -**No, really, why one more command-line data-manipulation tool?** I wrote Miller because I was frustrated with tools like ``grep``, ``sed``, and so on being *line-aware* without being *format-aware*. The single most poignant example I can think of is seeing people grep data lines out of their CSV files and sadly losing their header lines. While some lighter-than-SQL processing is very nice to have, at core I wanted the format-awareness of `RecordStream `_ combined with the raw speed of the Unix toolkit. Miller does precisely that. diff --git a/docs6/output-colorization.rst b/docs6/output-colorization.rst deleted file mode 100644 index 339e145c1..000000000 --- a/docs6/output-colorization.rst +++ /dev/null @@ -1,56 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Output colorization -================================================================ - -As of version 6.0.0, Miller supports output-colorization. Here are examples using side-by-side black-background and white-background terminals: - -.. image:: pix/colorization.png - -Things having colors: - -* Keys in CSV header lines, JSON keys, etc -* Values in CSV data lines, JSON scalar values, etc -* "PASS" and "FAIL" in regression-test output -* Some online-help strings - -Rules for colorization: - -* By default, colorize output only if writing to stdout and stdout is a TTY. - - * Example: color: ``mlr --csv cat foo.csv`` - * Example: no color: ``mlr --csv cat foo.csv > bar.csv`` - * Example: no color: ``mlr --csv cat foo.csv | less`` - -* The default colors were chosen since they look OK with white or black terminal background, and are differentiable with common varieties of human color vision. - -Mechanisms for colorization: - -* Miller uses ANSI escape sequences only. This does not work on Windows except on Cygwin. -* Requires ``TERM`` environment variable to be set to non-empty string. -* Doesn't try to check to see whether the terminal is capable of 256-color ANSI vs 16-color ANSI. Note that if colors are in the range 0..15 then 16-color ANSI escapes are used, so this is in the user's control. - -How you can control colorization: - -* Suppression/unsuppression: - - * ``export MLR_NO_COLOR=true`` means Miller won't color even when it normally would. - * ``export MLR_ALWAYS_COLOR=true`` means Miller will color even when it normally would not. For example, you might want to use this when piping ``mlr`` output to ``less -r``. - * Command-line flags ``--no-color`` or ``-M``, ``--always-color`` or ``-C``. - - -* Color choices can be specified by using environment variables or command-line flags, with values 0..255: - - * ``export MLR_KEY_COLOR=208`` - * ``export MLR_VALUE_COLOR=33`` - * Likewise for ``MLR_PASS_COLOR``, ``MLR_FAIL_COLOR``, ``MLR_HELP_COLOR``, ``MLR_REPL_PS1_COLOR``, and ``MLR_REPL_PS2_COLOR``. - * Command-line flags ``--key-color 208``, ``--value-color 33``, etc., and likewise for ``--pass-color``, ``--fail-color``, ``--repl-ps1-color``, ``--repl-ps2-color``, and ``--help-color``. - * This is particularly useful if your terminal's background color clashes with current settings. - -If environment-variable settings and command-line flags are both provided, the latter take precedence. - -Please do ``mlr --list-color-codes`` to see the available color codes (like ``170``), and ``mlr --list-color-names`` to see available names (like ``orchid``). - -.. image:: pix/colorization2.png - diff --git a/docs6/output-colorization.rst.in b/docs6/output-colorization.rst.in deleted file mode 100644 index bd2b4b50b..000000000 --- a/docs6/output-colorization.rst.in +++ /dev/null @@ -1,53 +0,0 @@ -Output colorization -================================================================ - -As of version 6.0.0, Miller supports output-colorization. Here are examples using side-by-side black-background and white-background terminals: - -.. image:: pix/colorization.png - -Things having colors: - -* Keys in CSV header lines, JSON keys, etc -* Values in CSV data lines, JSON scalar values, etc -* "PASS" and "FAIL" in regression-test output -* Some online-help strings - -Rules for colorization: - -* By default, colorize output only if writing to stdout and stdout is a TTY. - - * Example: color: ``mlr --csv cat foo.csv`` - * Example: no color: ``mlr --csv cat foo.csv > bar.csv`` - * Example: no color: ``mlr --csv cat foo.csv | less`` - -* The default colors were chosen since they look OK with white or black terminal background, and are differentiable with common varieties of human color vision. - -Mechanisms for colorization: - -* Miller uses ANSI escape sequences only. This does not work on Windows except on Cygwin. -* Requires ``TERM`` environment variable to be set to non-empty string. -* Doesn't try to check to see whether the terminal is capable of 256-color ANSI vs 16-color ANSI. Note that if colors are in the range 0..15 then 16-color ANSI escapes are used, so this is in the user's control. - -How you can control colorization: - -* Suppression/unsuppression: - - * ``export MLR_NO_COLOR=true`` means Miller won't color even when it normally would. - * ``export MLR_ALWAYS_COLOR=true`` means Miller will color even when it normally would not. For example, you might want to use this when piping ``mlr`` output to ``less -r``. - * Command-line flags ``--no-color`` or ``-M``, ``--always-color`` or ``-C``. - - -* Color choices can be specified by using environment variables or command-line flags, with values 0..255: - - * ``export MLR_KEY_COLOR=208`` - * ``export MLR_VALUE_COLOR=33`` - * Likewise for ``MLR_PASS_COLOR``, ``MLR_FAIL_COLOR``, ``MLR_HELP_COLOR``, ``MLR_REPL_PS1_COLOR``, and ``MLR_REPL_PS2_COLOR``. - * Command-line flags ``--key-color 208``, ``--value-color 33``, etc., and likewise for ``--pass-color``, ``--fail-color``, ``--repl-ps1-color``, ``--repl-ps2-color``, and ``--help-color``. - * This is particularly useful if your terminal's background color clashes with current settings. - -If environment-variable settings and command-line flags are both provided, the latter take precedence. - -Please do ``mlr --list-color-codes`` to see the available color codes (like ``170``), and ``mlr --list-color-names`` to see available names (like ``orchid``). - -.. image:: pix/colorization2.png - diff --git a/docs6/performance.rst b/docs6/performance.rst deleted file mode 100644 index 2d1d9d010..000000000 --- a/docs6/performance.rst +++ /dev/null @@ -1,23 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Performance -================================================================ - -Disclaimer ----------------------------------------------------------------- - -In a previous version of this page, I compared Miller to some items in the Unix toolkit in terms of run time. But such comparisons are very much not apples-to-apples: - -* Miller's principal strength is that it handles **key-value data in various formats** while the system tools **do not**. So if you time ``mlr sort`` on a CSV file against system ``sort``, it's not relevant to say which is faster by how many percent -- Miller will respect the header line, leaving it in place, while the system sort will move it, sorting it along with all the other header lines. This would be comparing the run times of two programs produce different outputs. Likewise, ``awk`` doesn't respect header lines, although you can code up some CSV-handling using ``if (NR==1) { ... } else { ... }``. And that's just CSV: I don't know any simple way to get ``sort``, ``awk``, etc. to handle DKVP, JSON, etc. -- which is the main reason I wrote Miller. - -* **Implementations differ by platform**: one ``awk`` may be fundamentally faster than another, and ``mawk`` has a very efficient bytecode implementation -- which handles positionally indexed data far faster than Miller does. - -* The system ``sort`` command will, on some systems, handle too-large-for-RAM datasets by spilling to disk; Miller (as of version 5.2.0, mid-2017) does not. Miller sorts are always stable; GNU supports stable and unstable variants. - -* Etc. - -Summary ----------------------------------------------------------------- - -Miller can do many kinds of processing on key-value-pair data using elapsed time roughly of the same order of magnitude as items in the Unix toolkit can handle positionally indexed data. Specific results vary widely by platform, implementation details, multi-core use (or not). Lastly, specific special-purpose non-record-aware processing will run far faster in ``grep``, ``sed``, etc. diff --git a/docs6/performance.rst.in b/docs6/performance.rst.in deleted file mode 100644 index 1c83ae055..000000000 --- a/docs6/performance.rst.in +++ /dev/null @@ -1,20 +0,0 @@ -Performance -================================================================ - -Disclaimer ----------------------------------------------------------------- - -In a previous version of this page, I compared Miller to some items in the Unix toolkit in terms of run time. But such comparisons are very much not apples-to-apples: - -* Miller's principal strength is that it handles **key-value data in various formats** while the system tools **do not**. So if you time ``mlr sort`` on a CSV file against system ``sort``, it's not relevant to say which is faster by how many percent -- Miller will respect the header line, leaving it in place, while the system sort will move it, sorting it along with all the other header lines. This would be comparing the run times of two programs produce different outputs. Likewise, ``awk`` doesn't respect header lines, although you can code up some CSV-handling using ``if (NR==1) { ... } else { ... }``. And that's just CSV: I don't know any simple way to get ``sort``, ``awk``, etc. to handle DKVP, JSON, etc. -- which is the main reason I wrote Miller. - -* **Implementations differ by platform**: one ``awk`` may be fundamentally faster than another, and ``mawk`` has a very efficient bytecode implementation -- which handles positionally indexed data far faster than Miller does. - -* The system ``sort`` command will, on some systems, handle too-large-for-RAM datasets by spilling to disk; Miller (as of version 5.2.0, mid-2017) does not. Miller sorts are always stable; GNU supports stable and unstable variants. - -* Etc. - -Summary ----------------------------------------------------------------- - -Miller can do many kinds of processing on key-value-pair data using elapsed time roughly of the same order of magnitude as items in the Unix toolkit can handle positionally indexed data. Specific results vary widely by platform, implementation details, multi-core use (or not). Lastly, specific special-purpose non-record-aware processing will run far faster in ``grep``, ``sed``, etc. diff --git a/docs6/programming-examples.rst b/docs6/programming-examples.rst deleted file mode 100644 index f05421833..000000000 --- a/docs6/programming-examples.rst +++ /dev/null @@ -1,261 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Programming-language examples -================================================================ - -Here are a few things focusing on Miller's DSL as a programming language per se, outside of its normal use for streaming record-processing. - -Sieve of Eratosthenes ----------------------------------------------------------------- - -The `Sieve of Eratosthenes `_ is a standard introductory programming topic. The idea is to find all primes up to some *N* by making a list of the numbers 1 to *N*, then striking out all multiples of 2 except 2 itself, all multiples of 3 except 3 itself, all multiples of 4 except 4 itself, and so on. Whatever survives that without getting marked is a prime. This is easy enough in Miller. Notice that here all the work is in ``begin`` and ``end`` statements; there is no file input (so we use ``mlr -n`` to keep Miller from waiting for input data). - -.. code-block:: none - :emphasize-lines: 1-1 - - cat programs/sieve.mlr - # ================================================================ - # Sieve of Eratosthenes: simple example of Miller DSL as programming language. - # ================================================================ - - # Put this in a begin-block so we can do either - # mlr -n put -q -f name-of-this-file.mlr - # or - # mlr -n put -q -f name-of-this-file.mlr -e '@n = 200' - # i.e. 100 is the default upper limit, and another can be specified using -e. - begin { - @n = 100; - } - - end { - for (int i = 0; i <= @n; i += 1) { - @s[i] = true; - } - @s[0] = false; # 0 is neither prime nor composite - @s[1] = false; # 1 is neither prime nor composite - # Strike out multiples - for (int i = 2; i <= @n; i += 1) { - for (int j = i+i; j <= @n; j += i) { - @s[j] = false; - } - } - # Print survivors - for (int i = 0; i <= @n; i += 1) { - if (@s[i]) { - print i; - } - } - } - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr -n put -f programs/sieve.mlr - 2 - 3 - 5 - 7 - 11 - 13 - 17 - 19 - 23 - 29 - 31 - 37 - 41 - 43 - 47 - 53 - 59 - 61 - 67 - 71 - 73 - 79 - 83 - 89 - 97 - -Mandelbrot-set generator ----------------------------------------------------------------- - -The `Mandelbrot set `_ is also easily expressed. This isn't an important case of data-processing in the vein for which Miller was designed, but it is an example of Miller as a general-purpose programming language -- a test case for the expressiveness of the language. - -The (approximate) computation of points in the complex plane which are and aren't members is just a few lines of complex arithmetic (see the Wikipedia article); how to render them is another task. Using graphics libraries you can create PNG or JPEG files, but another fun way to do this is by printing various characters to the screen: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat programs/mand.mlr - # Mandelbrot set generator: simple example of Miller DSL as programming language. - begin { - # Set defaults - @rcorn = -2.0; - @icorn = -2.0; - @side = 4.0; - @iheight = 50; - @iwidth = 100; - @maxits = 100; - @levelstep = 5; - @chars = "@X*o-."; # Palette of characters to print to the screen. - @verbose = false; - @do_julia = false; - @jr = 0.0; # Real part of Julia point, if any - @ji = 0.0; # Imaginary part of Julia point, if any - } - - # Here, we can override defaults from an input file (if any). In Miller's - # put/filter DSL, absent-null right-hand sides result in no assignment so we - # can simply put @rcorn = $rcorn: if there is a field in the input like - # 'rcorn = -1.847' we'll read and use it, else we'll keep the default. - @rcorn = $rcorn; - @icorn = $icorn; - @side = $side; - @iheight = $iheight; - @iwidth = $iwidth; - @maxits = $maxits; - @levelstep = $levelstep; - @chars = $chars; - @verbose = $verbose; - @do_julia = $do_julia; - @jr = $jr; - @ji = $ji; - - end { - if (@verbose) { - print "RCORN = ".@rcorn; - print "ICORN = ".@icorn; - print "SIDE = ".@side; - print "IHEIGHT = ".@iheight; - print "IWIDTH = ".@iwidth; - print "MAXITS = ".@maxits; - print "LEVELSTEP = ".@levelstep; - print "CHARS = ".@chars; - } - - # Iterate over a matrix of rows and columns, printing one character for each cell. - for (int ii = @iheight-1; ii >= 0; ii -= 1) { - num pi = @icorn + (ii/@iheight) * @side; - for (int ir = 0; ir < @iwidth; ir += 1) { - num pr = @rcorn + (ir/@iwidth) * @side; - printn get_point_plot(pr, pi, @maxits, @do_julia, @jr, @ji); - } - print; - } - } - - # This is a function to approximate membership in the Mandelbrot set (or Julia - # set for a given Julia point if do_julia == true) for a given point in the - # complex plane. - func get_point_plot(pr, pi, maxits, do_julia, jr, ji) { - num zr = 0.0; - num zi = 0.0; - num cr = 0.0; - num ci = 0.0; - - if (!do_julia) { - zr = 0.0; - zi = 0.0; - cr = pr; - ci = pi; - } else { - zr = pr; - zi = pi; - cr = jr; - ci = ji; - } - - int iti = 0; - bool escaped = false; - num zt = 0; - for (iti = 0; iti < maxits; iti += 1) { - num mag = zr*zr + zi+zi; - if (mag > 4.0) { - escaped = true; - break; - } - # z := z^2 + c - zt = zr*zr - zi*zi + cr; - zi = 2*zr*zi + ci; - zr = zt; - } - if (!escaped) { - return "."; - } else { - # The // operator is Miller's (pythonic) integer-division operator - int level = (iti // @levelstep) % strlen(@chars); - return substr(@chars, level, level); - } - } - -At standard resolution this makes a nice little ASCII plot: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr -n put -f ./programs/mand.mlr - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XXXXXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XXXX.XXXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XXXXXXXooXXXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XXXXX**o..*XXXXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XXXXXX*-....-oXXXXXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@XXXXX@XXXXXXXXXX*......o*XXXXXXXXXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@XXXXXXXXXX**oo*-.-........oo.XXXXXXXXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@XXXXXXXXXXXXX....................X..o-XXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@XXXXXXXXXXXXXXX*oo......................oXXXXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@XXX*XXXXXXXXXXXX**o........................*X*X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@XXXXXXooo***o*.*XX**X..........................o-XX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@XXXXXXXX*-.......-***.............................oXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@XXXXXXXX*@..........Xo............................*XX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@XXXX@XXXXXXXX*o@oX...........@...........................oXXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - .........................................................o*XXXXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@XXXXXXXXX*-.oX...........@...........................oXXXXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@XXXXXXXXXX**@..........*o............................*XXXXXXXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@XXXXXXXXXXXXX-........***.............................oXXXXXXXXXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@XXXXXXXXXXXXoo****o*.XX***@..........................o-XXXXXXXXXXXXX@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@XXXXX*XXXX*XXXXXXX**-........................***XXXXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@XXXXXXXXXXXXX*o*.....................@o*XXXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@XXXXXXXXXXXX*....................*..o-XX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XXXXX*ooo*-.o........oo.X*XXXXXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XXXXXXXXX**@.....*XXXXXXXXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XXXXXXXXX*o....-o*XXXXXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XXXXXXXXXXo*o..*XXXXXXXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XXXXXXXXXXXXX*o*XXXXXXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XXXXXXXXXXXX@XXXXXXXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XXXXXXXXX@@XXXXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XXXXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - -But using a very small font size (as small as my Mac will let me go), and by choosing the coordinates to zoom in on a particular part of the complex plane, we can get a nice little picture: - -.. code-block:: none - - #!/bin/bash - # Get the number of rows and columns from the terminal window dimensions - iheight=$(stty size | mlr --nidx --fs space cut -f 1) - iwidth=$(stty size | mlr --nidx --fs space cut -f 2) - echo "rcorn=-1.755350,icorn=+0.014230,side=0.000020,maxits=10000,iheight=$iheight,iwidth=$iwidth" \ - | mlr put -f programs/mand.mlr - -.. image:: pix/mand.png diff --git a/docs6/programming-examples.rst.in b/docs6/programming-examples.rst.in deleted file mode 100644 index b990cf146..000000000 --- a/docs6/programming-examples.rst.in +++ /dev/null @@ -1,47 +0,0 @@ -Programming-language examples -================================================================ - -Here are a few things focusing on Miller's DSL as a programming language per se, outside of its normal use for streaming record-processing. - -Sieve of Eratosthenes ----------------------------------------------------------------- - -The `Sieve of Eratosthenes `_ is a standard introductory programming topic. The idea is to find all primes up to some *N* by making a list of the numbers 1 to *N*, then striking out all multiples of 2 except 2 itself, all multiples of 3 except 3 itself, all multiples of 4 except 4 itself, and so on. Whatever survives that without getting marked is a prime. This is easy enough in Miller. Notice that here all the work is in ``begin`` and ``end`` statements; there is no file input (so we use ``mlr -n`` to keep Miller from waiting for input data). - -GENRST_RUN_COMMAND -cat programs/sieve.mlr -GENRST_EOF - -GENRST_RUN_COMMAND -mlr -n put -f programs/sieve.mlr -GENRST_EOF - -Mandelbrot-set generator ----------------------------------------------------------------- - -The `Mandelbrot set `_ is also easily expressed. This isn't an important case of data-processing in the vein for which Miller was designed, but it is an example of Miller as a general-purpose programming language -- a test case for the expressiveness of the language. - -The (approximate) computation of points in the complex plane which are and aren't members is just a few lines of complex arithmetic (see the Wikipedia article); how to render them is another task. Using graphics libraries you can create PNG or JPEG files, but another fun way to do this is by printing various characters to the screen: - -GENRST_RUN_COMMAND -cat programs/mand.mlr -GENRST_EOF - -At standard resolution this makes a nice little ASCII plot: - -GENRST_RUN_COMMAND -mlr -n put -f ./programs/mand.mlr -GENRST_EOF - -But using a very small font size (as small as my Mac will let me go), and by choosing the coordinates to zoom in on a particular part of the complex plane, we can get a nice little picture: - -GENRST_CARDIFY -#!/bin/bash -# Get the number of rows and columns from the terminal window dimensions -iheight=$(stty size | mlr --nidx --fs space cut -f 1) -iwidth=$(stty size | mlr --nidx --fs space cut -f 2) -echo "rcorn=-1.755350,icorn=+0.014230,side=0.000020,maxits=10000,iheight=$iheight,iwidth=$iwidth" \ -| mlr put -f programs/mand.mlr -GENRST_EOF - -.. image:: pix/mand.png diff --git a/docs6/programming-language.rst b/docs6/programming-language.rst deleted file mode 100644 index 136831050..000000000 --- a/docs6/programming-language.rst +++ /dev/null @@ -1,370 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Intro to Miller's programming language -====================================== - -In the :doc:`10min` page we took a tour of some of Miller's most-used verbs including ``cat``, ``head``, ``tail``, ``cut``, and ``sort``. These are analogs of familiar system commands, but empowered by field-name indexing and file-format awareness: the system ``sort`` command only knows about lines and column names like ``1,2,3,4``, while ``mlr sort`` knows about CSV/TSV/JSON/etc records, and field names like ``color,shape,flag,index``. - -We also caught a glimpse of Miller's ``put`` and ``filter`` verbs. These two are special since they let you express statements using Miller's programming language. It's a *embedded domain-specific language* since it's inside Miller: often referred to simply as the *Miller DSL*. - -In the :doc:`reference-dsl` page we have a complete reference to Miller's programming language. For now, let's take a quick look at key features -- you can use as few or as many features as you like. - -Records and fields -^^^^^^^^^^^^^^^^^^^ - -Let's keep using the sample `example.csv <./example.csv>`_. When we type - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --c2p put '$cost = $quantity * $rate' example.csv - color shape flag index quantity rate cost - yellow triangle true 11 43.6498 9.8870 431.5655726 - red square true 15 79.2778 0.0130 1.0306114 - red circle true 16 13.8103 2.9010 40.063680299999994 - red square false 48 77.5542 7.4670 579.0972113999999 - purple triangle false 51 81.2290 8.5910 697.8383389999999 - red square false 64 77.1991 9.5310 735.7846221000001 - purple triangle false 65 80.1405 5.8240 466.738272 - yellow circle true 73 63.9785 4.2370 271.0769045 - yellow circle true 87 63.5058 8.3350 529.3208430000001 - purple square false 91 72.3735 8.2430 596.5747605000001 - -a few things are happening: - -* We refer to fields in the input data using a dollar sign and then the field name, e.g. ``$quantity``. (If a field name has special characters like a dot or slash, just use curly braces: ``${field.name}``.) -* The expression ``$cost = $quantity * $rate`` is executed once per record of the data file. Our `example.csv <./example.csv>`_ has 10 records so this expression was executed 10 times, with the field names ``$quantity`` and ``$rate`` bound to the current record's values for those fields. -* On the left-hand side we have the new field name ``$cost`` which didn't come from the input data. Assignments to new variables result in a new field being placed after all the other ones. If we'd assigned to an existing field name, it would have been updated in-place. -* The entire expression is surrounded by single quotes, to get it past the system shell. Inside those, only double quotes have meaning in Miller's programming language. - -Multi-line statements, and statements-from-file -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -You can use more than one statement, separating them with semicolons, and optionally putting them on lines of their own: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --c2p put '$cost = $quantity * $rate; $index = $index * 100' example.csv - color shape flag index quantity rate cost - yellow triangle true 1100 43.6498 9.8870 431.5655726 - red square true 1500 79.2778 0.0130 1.0306114 - red circle true 1600 13.8103 2.9010 40.063680299999994 - red square false 4800 77.5542 7.4670 579.0972113999999 - purple triangle false 5100 81.2290 8.5910 697.8383389999999 - red square false 6400 77.1991 9.5310 735.7846221000001 - purple triangle false 6500 80.1405 5.8240 466.738272 - yellow circle true 7300 63.9785 4.2370 271.0769045 - yellow circle true 8700 63.5058 8.3350 529.3208430000001 - purple square false 9100 72.3735 8.2430 596.5747605000001 - -.. code-block:: none - :emphasize-lines: 1-4 - - mlr --c2p put ' - $cost = $quantity * $rate; - $index *= 100 - ' example.csv - color shape flag index quantity rate cost - yellow triangle true 1100 43.6498 9.8870 431.5655726 - red square true 1500 79.2778 0.0130 1.0306114 - red circle true 1600 13.8103 2.9010 40.063680299999994 - red square false 4800 77.5542 7.4670 579.0972113999999 - purple triangle false 5100 81.2290 8.5910 697.8383389999999 - red square false 6400 77.1991 9.5310 735.7846221000001 - purple triangle false 6500 80.1405 5.8240 466.738272 - yellow circle true 7300 63.9785 4.2370 271.0769045 - yellow circle true 8700 63.5058 8.3350 529.3208430000001 - purple square false 9100 72.3735 8.2430 596.5747605000001 - -One of Miller's key features is the ability to express data-transformation right there at the keyboard, interactively. But if you find yourself using expressions repeatedly, you can put everything between the single quotes into a file and refer to that using ``put -f``: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat dsl-example.mlr - $cost = $quantity * $rate; - $index *= 100 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --c2p put -f dsl-example.mlr example.csv - color shape flag index quantity rate cost - yellow triangle true 1100 43.6498 9.8870 431.5655726 - red square true 1500 79.2778 0.0130 1.0306114 - red circle true 1600 13.8103 2.9010 40.063680299999994 - red square false 4800 77.5542 7.4670 579.0972113999999 - purple triangle false 5100 81.2290 8.5910 697.8383389999999 - red square false 6400 77.1991 9.5310 735.7846221000001 - purple triangle false 6500 80.1405 5.8240 466.738272 - yellow circle true 7300 63.9785 4.2370 271.0769045 - yellow circle true 8700 63.5058 8.3350 529.3208430000001 - purple square false 9100 72.3735 8.2430 596.5747605000001 - -This becomes particularly important on Windows. Quite a bit of effort was put into making Miller on Windows be able to handle the kinds of single-quoted expressions we're showing here, but if you get syntax-error messages on Windows using examples in this documentation, you can put the parts between single quotes into a file and refer to that using ``mlr put -f``. - -Out-of-stream variables, begin, and end -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Above we saw that your expression is executed once per record -- if a file has a million records, your expression will be executed a million times, once for each record. But you can mark statements to only be executed once, either before the record stream begins, or after the record stream is ended. If you know about `AWK `_, you might have noticed that Miller's programming language is loosely inspired by it, including the ``begin`` and ``end`` statements. - -Above we also saw that names like ``$quantity`` are bound to each record in turn. - -To make ``begin`` and ``end`` statements useful, we need somewhere to put things that persist across the duration of the record stream, and a way to emit them. Miller uses **out-of-stream variables** (or **oosvars** for short) whose names start with an ``@`` sigil, and the **emit** keyword to write them into the output record stream: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --c2p --from example.csv put 'begin { @sum = 0 } @sum += $quantity; end {emit @sum}' - color shape flag index quantity rate - yellow triangle true 11 43.6498 9.8870 - red square true 15 79.2778 0.0130 - red circle true 16 13.8103 2.9010 - red square false 48 77.5542 7.4670 - purple triangle false 51 81.2290 8.5910 - red square false 64 77.1991 9.5310 - purple triangle false 65 80.1405 5.8240 - yellow circle true 73 63.9785 4.2370 - yellow circle true 87 63.5058 8.3350 - purple square false 91 72.3735 8.2430 - - sum - 652.7185 - -If you want the end-block output to be the only output, and not include the input data, you can use ``mlr put -q``: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --c2p --from example.csv put -q 'begin { @sum = 0 } @sum += $quantity; end {emit @sum}' - sum - 652.7185 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --c2j --from example.csv put -q 'begin { @sum = 0 } @sum += $quantity; end {emit @sum}' - { - "sum": 652.7185 - } - -.. code-block:: none - :emphasize-lines: 1-6 - - mlr --c2j --from example.csv put -q ' - begin { @count = 0; @sum = 0 } - @count += 1; - @sum += $quantity; - end {emit (@count, @sum)} - ' - { - "count": 10, - "sum": 652.7185 - } - -We'll see in the documentation for :ref:`reference-verbs-stats1` that there's a lower-keystroking way to get counts and sums of things -- so, take this sum/count example as an indication of the kinds of things you can do using Miller's programming language. - -Context variables -^^^^^^^^^^^^^^^^^ - -Also inspired by `AWK `_, the Miller DSL has the following special **context variables**: - -* ``FILENAME`` -- the filename the current record came from. Especially useful in things like ``mlr ... *.csv``. -* ``FILENUM`` -- similarly, but integer 1,2,3,... rather than filenam.e -* ``NF`` -- the number of fields in the current record. Note that if you assign ``$newcolumn = some value`` then ``NF`` will increment. -* ``NR`` -- starting from 1, counter of how many records processed so far. -* ``FNR`` -- similar, but resets to 1 at the start of each file. - -.. code-block:: none - :emphasize-lines: 1-1 - - cat context-example.mlr - $nf = NF; - $nr = NR; - $fnr = FNR; - $filename = FILENAME; - $filenum = FILENUM; - $newnf = NF; - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --c2p put -f context-example.mlr data/a.csv data/b.csv - a b c nf nr fnr filename filenum newnf - 1 2 3 3 1 1 data/a.csv 1 8 - 4 5 6 3 2 2 data/a.csv 1 8 - 7 8 9 3 3 1 data/b.csv 2 8 - -Functions and local variables -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -You can define your own functions: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat factorial-example.mlr - func factorial(n) { - if (n <= 1) { - return n - } else { - return n * factorial(n-1) - } - } - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --c2p --from example.csv put -f factorial-example.mlr -e '$fact = factorial(NR)' - color shape flag index quantity rate fact - yellow triangle true 11 43.6498 9.8870 1 - red square true 15 79.2778 0.0130 2 - red circle true 16 13.8103 2.9010 6 - red square false 48 77.5542 7.4670 24 - purple triangle false 51 81.2290 8.5910 120 - red square false 64 77.1991 9.5310 720 - purple triangle false 65 80.1405 5.8240 5040 - yellow circle true 73 63.9785 4.2370 40320 - yellow circle true 87 63.5058 8.3350 362880 - purple square false 91 72.3735 8.2430 3628800 - -Note that here we used the ``-f`` flag to ``put`` to load our function -definition, and also the ``-e`` flag to add another statement on the command -line. (We could have also put ``$fact = factorial(NR)`` inside -``factorial-example.mlr`` but that would have made that file less flexible for our -future use.) - -If-statements, loops, and local variables -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Suppose you want to only compute sums conditionally -- you can use an ``if`` statement: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat if-example.mlr - begin { - @count_of_red = 0; - @sum_of_red = 0 - } - - if ($color == "red") { - @count_of_red += 1; - @sum_of_red += $quantity; - } - - end { - emit (@count_of_red, @sum_of_red) - } - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --c2p --from example.csv put -q -f if-example.mlr - count_of_red sum_of_red - 4 247.84139999999996 - -Miller's else-if is spelled ``elif``. - -As we'll see more of in section (TODO:linkify), Miller has a few kinds of -for-loops. In addition to the usual 3-part ``for (i = 0; i < 10; i += 1)`` kind -that many programming languages have, Miller also lets you loop over arrays and -hashmaps. We haven't encountered arrays and hashmaps yet in this introduction, -but for now it suffices to know that ``$*`` is a special variable holding the -current record as a hashmap: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat for-example.mlr - for (k, v in $*) { - print "KEY IS ". k . " VALUE IS ". v; - } - print - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv cat data/a.csv - a,b,c - 1,2,3 - 4,5,6 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv --from data/a.csv put -qf for-example.mlr - KEY IS a VALUE IS 1 - KEY IS b VALUE IS 2 - KEY IS c VALUE IS 3 - - KEY IS a VALUE IS 4 - KEY IS b VALUE IS 5 - KEY IS c VALUE IS 6 - -Here we used the local variables ``k`` and ``v``. Now we've seen four kinds of variables: - -* Record fields like ``$shape`` -* Out-of-stream variables like ``@sum`` -* Local variables like ``k`` -* Built-in context variables like ``NF`` and ``NR`` - -If you're curious about scope and extent of local variables, you can read more in (TODO:linkify) the section on variables. - -Arithmetic -^^^^^^^^^^^^ - -Numbers in Miller's programming language are intended to operate with the principle of least surprise: - -* Internally, numbers are either 64-bit signed integers or double-precision floating-point. -* Sums, differences, and products of integers are also integers (so ``2*3=6`` not ``6.0``) -- unless the result of the operation would overflow a 64-bit signed integer in which case the result is automatically converted to float. (If you ever want integer-to-integer arithmetic, use ``x .+ y``, ``x .* y``, etc.) -* Quotients of integers are integers if the division is exact, else floating-point: so ``6/2=3`` but ``7/2=3.5``. - -You can read more about this at (TODO:linkify). - -Absent data -^^^^^^^^^^^^ - -In addition to types including string, number (int/float), arrays, and hashmaps, Miller varibles can also be **absent**. This is when a variable never had a value assigned to it. Miller's treatment of absent data is intended to make it easy for you to handle non-heterogeneous data. We'll see more in section (TODO:linkify) but the basic idea is: - -* Adding a number to absent gives the number back. This means you don't have to put ``@sum = 0`` in your ``begin`` blocks. -* Any variable which has the absent value is not assigned. This means you don't have to check presence of things from one record to the next. - -For example, you can sum up all the ``$a`` values across records without having to check whether they're present or not: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --json cat absent-example.json - { - "a": 1, - "b": 2 - } - { - "c": 3 - } - { - "a": 4, - "b": 5 - } - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --json put '@sum_of_a += $a; end {emit @sum_of_a}' absent-example.json - { - "a": 1, - "b": 2 - } - { - "c": 3 - } - { - "a": 4, - "b": 5 - } - { - "sum_of_a": 5 - } diff --git a/docs6/programming-language.rst.in b/docs6/programming-language.rst.in deleted file mode 100644 index 46b313fef..000000000 --- a/docs6/programming-language.rst.in +++ /dev/null @@ -1,191 +0,0 @@ -Intro to Miller's programming language -====================================== - -In the :doc:`10min` page we took a tour of some of Miller's most-used verbs including ``cat``, ``head``, ``tail``, ``cut``, and ``sort``. These are analogs of familiar system commands, but empowered by field-name indexing and file-format awareness: the system ``sort`` command only knows about lines and column names like ``1,2,3,4``, while ``mlr sort`` knows about CSV/TSV/JSON/etc records, and field names like ``color,shape,flag,index``. - -We also caught a glimpse of Miller's ``put`` and ``filter`` verbs. These two are special since they let you express statements using Miller's programming language. It's a *embedded domain-specific language* since it's inside Miller: often referred to simply as the *Miller DSL*. - -In the :doc:`reference-dsl` page we have a complete reference to Miller's programming language. For now, let's take a quick look at key features -- you can use as few or as many features as you like. - -Records and fields -^^^^^^^^^^^^^^^^^^^ - -Let's keep using the sample `example.csv <./example.csv>`_. When we type - -GENRST_RUN_COMMAND -mlr --c2p put '$cost = $quantity * $rate' example.csv -GENRST_EOF - -a few things are happening: - -* We refer to fields in the input data using a dollar sign and then the field name, e.g. ``$quantity``. (If a field name has special characters like a dot or slash, just use curly braces: ``${field.name}``.) -* The expression ``$cost = $quantity * $rate`` is executed once per record of the data file. Our `example.csv <./example.csv>`_ has 10 records so this expression was executed 10 times, with the field names ``$quantity`` and ``$rate`` bound to the current record's values for those fields. -* On the left-hand side we have the new field name ``$cost`` which didn't come from the input data. Assignments to new variables result in a new field being placed after all the other ones. If we'd assigned to an existing field name, it would have been updated in-place. -* The entire expression is surrounded by single quotes, to get it past the system shell. Inside those, only double quotes have meaning in Miller's programming language. - -Multi-line statements, and statements-from-file -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -You can use more than one statement, separating them with semicolons, and optionally putting them on lines of their own: - -GENRST_RUN_COMMAND -mlr --c2p put '$cost = $quantity * $rate; $index = $index * 100' example.csv -GENRST_EOF - -GENRST_INCLUDE_AND_RUN_ESCAPED(dsl-example-multiline.sh) - -One of Miller's key features is the ability to express data-transformation right there at the keyboard, interactively. But if you find yourself using expressions repeatedly, you can put everything between the single quotes into a file and refer to that using ``put -f``: - -GENRST_RUN_COMMAND -cat dsl-example.mlr -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --c2p put -f dsl-example.mlr example.csv -GENRST_EOF - -This becomes particularly important on Windows. Quite a bit of effort was put into making Miller on Windows be able to handle the kinds of single-quoted expressions we're showing here, but if you get syntax-error messages on Windows using examples in this documentation, you can put the parts between single quotes into a file and refer to that using ``mlr put -f``. - -Out-of-stream variables, begin, and end -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Above we saw that your expression is executed once per record -- if a file has a million records, your expression will be executed a million times, once for each record. But you can mark statements to only be executed once, either before the record stream begins, or after the record stream is ended. If you know about `AWK `_, you might have noticed that Miller's programming language is loosely inspired by it, including the ``begin`` and ``end`` statements. - -Above we also saw that names like ``$quantity`` are bound to each record in turn. - -To make ``begin`` and ``end`` statements useful, we need somewhere to put things that persist across the duration of the record stream, and a way to emit them. Miller uses **out-of-stream variables** (or **oosvars** for short) whose names start with an ``@`` sigil, and the **emit** keyword to write them into the output record stream: - -GENRST_RUN_COMMAND -mlr --c2p --from example.csv put 'begin { @sum = 0 } @sum += $quantity; end {emit @sum}' -GENRST_EOF - -If you want the end-block output to be the only output, and not include the input data, you can use ``mlr put -q``: - -GENRST_RUN_COMMAND -mlr --c2p --from example.csv put -q 'begin { @sum = 0 } @sum += $quantity; end {emit @sum}' -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --c2j --from example.csv put -q 'begin { @sum = 0 } @sum += $quantity; end {emit @sum}' -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --c2j --from example.csv put -q ' - begin { @count = 0; @sum = 0 } - @count += 1; - @sum += $quantity; - end {emit (@count, @sum)} -' -GENRST_EOF - -We'll see in the documentation for :ref:`reference-verbs-stats1` that there's a lower-keystroking way to get counts and sums of things -- so, take this sum/count example as an indication of the kinds of things you can do using Miller's programming language. - -Context variables -^^^^^^^^^^^^^^^^^ - -Also inspired by `AWK `_, the Miller DSL has the following special **context variables**: - -* ``FILENAME`` -- the filename the current record came from. Especially useful in things like ``mlr ... *.csv``. -* ``FILENUM`` -- similarly, but integer 1,2,3,... rather than filenam.e -* ``NF`` -- the number of fields in the current record. Note that if you assign ``$newcolumn = some value`` then ``NF`` will increment. -* ``NR`` -- starting from 1, counter of how many records processed so far. -* ``FNR`` -- similar, but resets to 1 at the start of each file. - -GENRST_RUN_COMMAND -cat context-example.mlr -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --c2p put -f context-example.mlr data/a.csv data/b.csv -GENRST_EOF - -Functions and local variables -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -You can define your own functions: - -GENRST_RUN_COMMAND -cat factorial-example.mlr -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --c2p --from example.csv put -f factorial-example.mlr -e '$fact = factorial(NR)' -GENRST_EOF - -Note that here we used the ``-f`` flag to ``put`` to load our function -definition, and also the ``-e`` flag to add another statement on the command -line. (We could have also put ``$fact = factorial(NR)`` inside -``factorial-example.mlr`` but that would have made that file less flexible for our -future use.) - -If-statements, loops, and local variables -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Suppose you want to only compute sums conditionally -- you can use an ``if`` statement: - -GENRST_RUN_COMMAND -cat if-example.mlr -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --c2p --from example.csv put -q -f if-example.mlr -GENRST_EOF - -Miller's else-if is spelled ``elif``. - -As we'll see more of in section (TODO:linkify), Miller has a few kinds of -for-loops. In addition to the usual 3-part ``for (i = 0; i < 10; i += 1)`` kind -that many programming languages have, Miller also lets you loop over arrays and -hashmaps. We haven't encountered arrays and hashmaps yet in this introduction, -but for now it suffices to know that ``$*`` is a special variable holding the -current record as a hashmap: - -GENRST_RUN_COMMAND -cat for-example.mlr -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --csv cat data/a.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --csv --from data/a.csv put -qf for-example.mlr -GENRST_EOF - -Here we used the local variables ``k`` and ``v``. Now we've seen four kinds of variables: - -* Record fields like ``$shape`` -* Out-of-stream variables like ``@sum`` -* Local variables like ``k`` -* Built-in context variables like ``NF`` and ``NR`` - -If you're curious about scope and extent of local variables, you can read more in (TODO:linkify) the section on variables. - -Arithmetic -^^^^^^^^^^^^ - -Numbers in Miller's programming language are intended to operate with the principle of least surprise: - -* Internally, numbers are either 64-bit signed integers or double-precision floating-point. -* Sums, differences, and products of integers are also integers (so ``2*3=6`` not ``6.0``) -- unless the result of the operation would overflow a 64-bit signed integer in which case the result is automatically converted to float. (If you ever want integer-to-integer arithmetic, use ``x .+ y``, ``x .* y``, etc.) -* Quotients of integers are integers if the division is exact, else floating-point: so ``6/2=3`` but ``7/2=3.5``. - -You can read more about this at (TODO:linkify). - -Absent data -^^^^^^^^^^^^ - -In addition to types including string, number (int/float), arrays, and hashmaps, Miller varibles can also be **absent**. This is when a variable never had a value assigned to it. Miller's treatment of absent data is intended to make it easy for you to handle non-heterogeneous data. We'll see more in section (TODO:linkify) but the basic idea is: - -* Adding a number to absent gives the number back. This means you don't have to put ``@sum = 0`` in your ``begin`` blocks. -* Any variable which has the absent value is not assigned. This means you don't have to check presence of things from one record to the next. - -For example, you can sum up all the ``$a`` values across records without having to check whether they're present or not: - -GENRST_RUN_COMMAND -mlr --json cat absent-example.json -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --json put '@sum_of_a += $a; end {emit @sum_of_a}' absent-example.json -GENRST_EOF diff --git a/docs6/randomizing-examples.rst b/docs6/randomizing-examples.rst deleted file mode 100644 index 7a056738a..000000000 --- a/docs6/randomizing-examples.rst +++ /dev/null @@ -1,174 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Randomizing examples -================================================================ - -Generating random numbers from various distributions ----------------------------------------------------------------- - -Here we can chain together a few simple building blocks: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat expo-sample.sh - # Generate 100,000 pairs of independent and identically distributed - # exponentially distributed random variables with the same rate parameter - # (namely, 2.5). Then compute histograms of one of them, along with - # histograms for their sum and their product. - # - # See also https://en.wikipedia.org/wiki/Exponential_distribution - # - # Here I'm using a specified random-number seed so this example always - # produces the same output for this web document: in everyday practice we - # wouldn't do that. - - mlr -n \ - --seed 0 \ - --opprint \ - seqgen --stop 100000 \ - then put ' - # https://en.wikipedia.org/wiki/Inverse_transform_sampling - func expo_sample(lambda) { - return -log(1-urand())/lambda - } - $u = expo_sample(2.5); - $v = expo_sample(2.5); - $s = $u + $v; - $p = $u * $v; - ' \ - then histogram -f u,s,p --lo 0 --hi 2 --nbins 50 \ - then bar -f u_count,s_count,p_count --auto -w 20 - -Namely: - -* Set the Miller random-number seed so this webdoc looks the same every time I regenerate it. -* Use pretty-printed tabular output. -* Use pretty-printed tabular output. -* Use ``seqgen`` to produce 100,000 records ``i=0``, ``i=1``, etc. -* Send those to a ``put`` step which defines an inverse-transform-sampling function and calls it twice, then computes the sum and product of samples. -* Send those to a histogram, and from there to a bar-plotter. This is just for visualization; you could just as well output CSV and send that off to your own plotting tool, etc. - -The output is as follows: - -.. code-block:: none - :emphasize-lines: 1-1 - - sh expo-sample.sh - bin_lo bin_hi u_count s_count p_count - 0 0.04 [64]*******************#[9554] [326]#...................[3703] [19]*******************#[39809] - 0.04 0.08 [64]*****************...[9554] [326]*****...............[3703] [19]*******.............[39809] - 0.08 0.12 [64]****************....[9554] [326]*********...........[3703] [19]****................[39809] - 0.12 0.16 [64]**************......[9554] [326]************........[3703] [19]***.................[39809] - 0.16 0.2 [64]*************.......[9554] [326]**************......[3703] [19]**..................[39809] - 0.2 0.24 [64]************........[9554] [326]*****************...[3703] [19]*...................[39809] - 0.24 0.28 [64]**********..........[9554] [326]******************..[3703] [19]*...................[39809] - 0.28 0.32 [64]*********...........[9554] [326]******************..[3703] [19]*...................[39809] - 0.32 0.36 [64]********............[9554] [326]*******************.[3703] [19]#...................[39809] - 0.36 0.4 [64]*******.............[9554] [326]*******************#[3703] [19]#...................[39809] - 0.4 0.44 [64]*******.............[9554] [326]*******************.[3703] [19]#...................[39809] - 0.44 0.48 [64]******..............[9554] [326]*******************.[3703] [19]#...................[39809] - 0.48 0.52 [64]*****...............[9554] [326]******************..[3703] [19]#...................[39809] - 0.52 0.56 [64]*****...............[9554] [326]******************..[3703] [19]#...................[39809] - 0.56 0.6 [64]****................[9554] [326]*****************...[3703] [19]#...................[39809] - 0.6 0.64 [64]****................[9554] [326]******************..[3703] [19]#...................[39809] - 0.64 0.68 [64]***.................[9554] [326]****************....[3703] [19]#...................[39809] - 0.68 0.72 [64]***.................[9554] [326]****************....[3703] [19]#...................[39809] - 0.72 0.76 [64]***.................[9554] [326]***************.....[3703] [19]#...................[39809] - 0.76 0.8 [64]**..................[9554] [326]**************......[3703] [19]#...................[39809] - 0.8 0.84 [64]**..................[9554] [326]*************.......[3703] [19]#...................[39809] - 0.84 0.88 [64]**..................[9554] [326]************........[3703] [19]#...................[39809] - 0.88 0.92 [64]**..................[9554] [326]************........[3703] [19]#...................[39809] - 0.92 0.96 [64]*...................[9554] [326]***********.........[3703] [19]#...................[39809] - 0.96 1 [64]*...................[9554] [326]**********..........[3703] [19]#...................[39809] - 1 1.04 [64]*...................[9554] [326]*********...........[3703] [19]#...................[39809] - 1.04 1.08 [64]*...................[9554] [326]********............[3703] [19]#...................[39809] - 1.08 1.12 [64]*...................[9554] [326]********............[3703] [19]#...................[39809] - 1.12 1.16 [64]*...................[9554] [326]********............[3703] [19]#...................[39809] - 1.16 1.2 [64]*...................[9554] [326]*******.............[3703] [19]#...................[39809] - 1.2 1.24 [64]#...................[9554] [326]******..............[3703] [19]#...................[39809] - 1.24 1.28 [64]#...................[9554] [326]*****...............[3703] [19]#...................[39809] - 1.28 1.32 [64]#...................[9554] [326]*****...............[3703] [19]#...................[39809] - 1.32 1.36 [64]#...................[9554] [326]****................[3703] [19]#...................[39809] - 1.36 1.4 [64]#...................[9554] [326]****................[3703] [19]#...................[39809] - 1.4 1.44 [64]#...................[9554] [326]****................[3703] [19]#...................[39809] - 1.44 1.48 [64]#...................[9554] [326]***.................[3703] [19]#...................[39809] - 1.48 1.52 [64]#...................[9554] [326]***.................[3703] [19]#...................[39809] - 1.52 1.56 [64]#...................[9554] [326]***.................[3703] [19]#...................[39809] - 1.56 1.6 [64]#...................[9554] [326]**..................[3703] [19]#...................[39809] - 1.6 1.64 [64]#...................[9554] [326]**..................[3703] [19]#...................[39809] - 1.64 1.68 [64]#...................[9554] [326]**..................[3703] [19]#...................[39809] - 1.68 1.72 [64]#...................[9554] [326]*...................[3703] [19]#...................[39809] - 1.72 1.76 [64]#...................[9554] [326]*...................[3703] [19]#...................[39809] - 1.76 1.8 [64]#...................[9554] [326]*...................[3703] [19]#...................[39809] - 1.8 1.84 [64]#...................[9554] [326]#...................[3703] [19]#...................[39809] - 1.84 1.88 [64]#...................[9554] [326]#...................[3703] [19]#...................[39809] - 1.88 1.92 [64]#...................[9554] [326]#...................[3703] [19]#...................[39809] - 1.92 1.96 [64]#...................[9554] [326]#...................[3703] [19]#...................[39809] - 1.96 2 [64]#...................[9554] [326]#...................[3703] [19]#...................[39809] - -Randomly selecting words from a list ----------------------------------------------------------------- - -Given this `word list <./data/english-words.txt>`_, first take a look to see what the first few lines look like: - -.. code-block:: none - :emphasize-lines: 1-1 - - head data/english-words.txt - a - aa - aal - aalii - aam - aardvark - aardwolf - aba - abac - abaca - -Then the following will randomly sample ten words with four to eight characters in them: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --from data/english-words.txt --nidx filter -S 'n=strlen($1);4<=n&&n<=8' then sample -k 10 - thionine - birchman - mildewy - avigate - addedly - abaze - askant - aiming - insulant - coinmate - -Randomly generating jabberwocky words ----------------------------------------------------------------- - -These are simple *n*-grams as `described here `_. Some common functions are `located here `_. Then here are scripts for `1-grams `_ `2-grams `_ `3-grams `_ `4-grams `_, and `5-grams `_. - -The idea is that words from the input file are consumed, then taken apart and pasted back together in ways which imitate the letter-to-letter transitions found in the word list -- giving us automatically generated words in the same vein as *bromance* and *spork*: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --nidx --from ./ngrams/gsl-2000.txt put -q -f ./ngrams/ngfuncs.mlr -f ./ngrams/ng5.mlr - beard - plastinguish - politicially - noise - loan - country - controductionary - suppery - lose - lessors - dollar - judge - rottendence - lessenger - diffendant - suggestional diff --git a/docs6/randomizing-examples.rst.in b/docs6/randomizing-examples.rst.in deleted file mode 100644 index c275be5a9..000000000 --- a/docs6/randomizing-examples.rst.in +++ /dev/null @@ -1,88 +0,0 @@ -Randomizing examples -================================================================ - -Generating random numbers from various distributions ----------------------------------------------------------------- - -Here we can chain together a few simple building blocks: - -GENRST_RUN_COMMAND -cat expo-sample.sh -GENRST_EOF - -Namely: - -* Set the Miller random-number seed so this webdoc looks the same every time I regenerate it. -* Use pretty-printed tabular output. -* Use pretty-printed tabular output. -* Use ``seqgen`` to produce 100,000 records ``i=0``, ``i=1``, etc. -* Send those to a ``put`` step which defines an inverse-transform-sampling function and calls it twice, then computes the sum and product of samples. -* Send those to a histogram, and from there to a bar-plotter. This is just for visualization; you could just as well output CSV and send that off to your own plotting tool, etc. - -The output is as follows: - -GENRST_RUN_COMMAND -sh expo-sample.sh -GENRST_EOF - -Randomly selecting words from a list ----------------------------------------------------------------- - -Given this `word list <./data/english-words.txt>`_, first take a look to see what the first few lines look like: - -GENRST_CARDIFY_HIGHLIGHT_ONE -head data/english-words.txt -a -aa -aal -aalii -aam -aardvark -aardwolf -aba -abac -abaca -GENRST_EOF - -Then the following will randomly sample ten words with four to eight characters in them: - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr --from data/english-words.txt --nidx filter -S 'n=strlen($1);4<=n&&n<=8' then sample -k 10 -thionine -birchman -mildewy -avigate -addedly -abaze -askant -aiming -insulant -coinmate -GENRST_EOF - -Randomly generating jabberwocky words ----------------------------------------------------------------- - -These are simple *n*-grams as `described here `_. Some common functions are `located here `_. Then here are scripts for `1-grams `_ `2-grams `_ `3-grams `_ `4-grams `_, and `5-grams `_. - -The idea is that words from the input file are consumed, then taken apart and pasted back together in ways which imitate the letter-to-letter transitions found in the word list -- giving us automatically generated words in the same vein as *bromance* and *spork*: - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr --nidx --from ./ngrams/gsl-2000.txt put -q -f ./ngrams/ngfuncs.mlr -f ./ngrams/ng5.mlr -beard -plastinguish -politicially -noise -loan -country -controductionary -suppery -lose -lessors -dollar -judge -rottendence -lessenger -diffendant -suggestional -GENRST_EOF diff --git a/docs6/record-heterogeneity.rst b/docs6/record-heterogeneity.rst deleted file mode 100644 index dc3da596d..000000000 --- a/docs6/record-heterogeneity.rst +++ /dev/null @@ -1,219 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Record-heterogeneity -================================================================ - -We think of CSV tables as rectangular: if there are 17 columns in the header then there are 17 columns for every row, else the data have a formatting error. - -But heterogeneous data abound (today's no-SQL databases for example). Miller handles this. - -For I/O ----------------------------------------------------------------- - -CSV and pretty-print -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Miller simply prints a newline and a new header when there is a schema change. When there is no schema change, you get CSV per se as a special case. Likewise, Miller reads heterogeneous CSV or pretty-print input the same way. The difference between CSV and CSV-lite is that the former is RFC4180-compliant, while the latter readily handles heterogeneous data (which is non-compliant). For example: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/het.dkvp - resource=/path/to/file,loadsec=0.45,ok=true - record_count=100,resource=/path/to/file - resource=/path/to/second/file,loadsec=0.32,ok=true - record_count=150,resource=/path/to/second/file - resource=/some/other/path,loadsec=0.97,ok=false - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --ocsvlite cat data/het.dkvp - resource,loadsec,ok - /path/to/file,0.45,true - - record_count,resource - 100,/path/to/file - - resource,loadsec,ok - /path/to/second/file,0.32,true - - record_count,resource - 150,/path/to/second/file - - resource,loadsec,ok - /some/other/path,0.97,false - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint cat data/het.dkvp - resource loadsec ok - /path/to/file 0.45 true - - record_count resource - 100 /path/to/file - - resource loadsec ok - /path/to/second/file 0.32 true - - record_count resource - 150 /path/to/second/file - - resource loadsec ok - /some/other/path 0.97 false - -Miller handles explicit header changes as just shown. If your CSV input contains ragged data -- if there are implicit header changes -- you can use ``--allow-ragged-csv-input`` (or keystroke-saver ``--ragged``). For too-short data lines, values are filled with empty string; for too-long data lines, missing field names are replaced with positional indices (counting up from 1, not 0), as follows: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/ragged.csv - a,b,c - 1,2,3 - 4,5 - 6,7,8,9 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --oxtab --allow-ragged-csv-input cat data/ragged.csv - a 1 - b 2 - c 3 - - a 4 - b 5 - c - - a 6 - b 7 - c 8 - 4 9 - -You may also find Miller's ``group-like`` feature handy (see also :doc:`reference-verbs`): - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --ocsvlite group-like data/het.dkvp - resource,loadsec,ok - /path/to/file,0.45,true - /path/to/second/file,0.32,true - /some/other/path,0.97,false - - record_count,resource - 100,/path/to/file - 150,/path/to/second/file - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint group-like data/het.dkvp - resource loadsec ok - /path/to/file 0.45 true - /path/to/second/file 0.32 true - /some/other/path 0.97 false - - record_count resource - 100 /path/to/file - 150 /path/to/second/file - -Key-value-pair, vertical-tabular, and index-numbered formats -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -For these formats, record-heterogeneity comes naturally: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/het.dkvp - resource=/path/to/file,loadsec=0.45,ok=true - record_count=100,resource=/path/to/file - resource=/path/to/second/file,loadsec=0.32,ok=true - record_count=150,resource=/path/to/second/file - resource=/some/other/path,loadsec=0.97,ok=false - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --onidx --ofs ' ' cat data/het.dkvp - /path/to/file 0.45 true - 100 /path/to/file - /path/to/second/file 0.32 true - 150 /path/to/second/file - /some/other/path 0.97 false - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --oxtab cat data/het.dkvp - resource /path/to/file - loadsec 0.45 - ok true - - record_count 100 - resource /path/to/file - - resource /path/to/second/file - loadsec 0.32 - ok true - - record_count 150 - resource /path/to/second/file - - resource /some/other/path - loadsec 0.97 - ok false - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --oxtab group-like data/het.dkvp - resource /path/to/file - loadsec 0.45 - ok true - - resource /path/to/second/file - loadsec 0.32 - ok true - - resource /some/other/path - loadsec 0.97 - ok false - - record_count 100 - resource /path/to/file - - record_count 150 - resource /path/to/second/file - -For processing ----------------------------------------------------------------- - -Miller operates on specified fields and takes the rest along: for example, if you are sorting on the ``count`` field then all records in the input stream must have a ``count`` field but the other fields can vary, and moreover the sorted-on field name(s) don't need to be in the same position on each line: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/sort-het.dkvp - count=500,color=green - count=600 - status=ok,count=250,hours=0.22 - status=ok,count=200,hours=3.4 - count=300,color=blue - count=100,color=green - count=450 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr sort -n count data/sort-het.dkvp - count=100,color=green - status=ok,count=200,hours=3.4 - status=ok,count=250,hours=0.22 - count=300,color=blue - count=450 - count=500,color=green - count=600 diff --git a/docs6/record-heterogeneity.rst.in b/docs6/record-heterogeneity.rst.in deleted file mode 100644 index 6b11bbe5a..000000000 --- a/docs6/record-heterogeneity.rst.in +++ /dev/null @@ -1,80 +0,0 @@ -Record-heterogeneity -================================================================ - -We think of CSV tables as rectangular: if there are 17 columns in the header then there are 17 columns for every row, else the data have a formatting error. - -But heterogeneous data abound (today's no-SQL databases for example). Miller handles this. - -For I/O ----------------------------------------------------------------- - -CSV and pretty-print -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Miller simply prints a newline and a new header when there is a schema change. When there is no schema change, you get CSV per se as a special case. Likewise, Miller reads heterogeneous CSV or pretty-print input the same way. The difference between CSV and CSV-lite is that the former is RFC4180-compliant, while the latter readily handles heterogeneous data (which is non-compliant). For example: - -GENRST_RUN_COMMAND -cat data/het.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --ocsvlite cat data/het.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint cat data/het.dkvp -GENRST_EOF - -Miller handles explicit header changes as just shown. If your CSV input contains ragged data -- if there are implicit header changes -- you can use ``--allow-ragged-csv-input`` (or keystroke-saver ``--ragged``). For too-short data lines, values are filled with empty string; for too-long data lines, missing field names are replaced with positional indices (counting up from 1, not 0), as follows: - -GENRST_RUN_COMMAND -cat data/ragged.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --icsv --oxtab --allow-ragged-csv-input cat data/ragged.csv -GENRST_EOF - -You may also find Miller's ``group-like`` feature handy (see also :doc:`reference-verbs`): - -GENRST_RUN_COMMAND -mlr --ocsvlite group-like data/het.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint group-like data/het.dkvp -GENRST_EOF - -Key-value-pair, vertical-tabular, and index-numbered formats -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -For these formats, record-heterogeneity comes naturally: - -GENRST_RUN_COMMAND -cat data/het.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --onidx --ofs ' ' cat data/het.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --oxtab cat data/het.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --oxtab group-like data/het.dkvp -GENRST_EOF - -For processing ----------------------------------------------------------------- - -Miller operates on specified fields and takes the rest along: for example, if you are sorting on the ``count`` field then all records in the input stream must have a ``count`` field but the other fields can vary, and moreover the sorted-on field name(s) don't need to be in the same position on each line: - -GENRST_RUN_COMMAND -cat data/sort-het.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr sort -n count data/sort-het.dkvp -GENRST_EOF diff --git a/docs6/reference-dsl-arrays.rst b/docs6/reference-dsl-arrays.rst deleted file mode 100644 index 0a6bf720c..000000000 --- a/docs6/reference-dsl-arrays.rst +++ /dev/null @@ -1,20 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Reference: arrays -================================================================ - -TODO - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --json cat data/array-example.json - { - "key": "ax04", - "samples": [45, 67, 22] - } - { - "key": "cz09", - "samples": [11, 29, 84, 91] - } diff --git a/docs6/reference-dsl-arrays.rst.in b/docs6/reference-dsl-arrays.rst.in deleted file mode 100644 index f006f445d..000000000 --- a/docs6/reference-dsl-arrays.rst.in +++ /dev/null @@ -1,8 +0,0 @@ -Reference: arrays -================================================================ - -TODO - -GENRST_RUN_COMMAND -mlr --json cat data/array-example.json -GENRST_EOF diff --git a/docs6/reference-dsl-builtin-functions.rst b/docs6/reference-dsl-builtin-functions.rst deleted file mode 100644 index a585fea09..000000000 --- a/docs6/reference-dsl-builtin-functions.rst +++ /dev/null @@ -1,2177 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -DSL reference: built-in functions -===================================== - -Summary ----------------------------------------------------------------- - -mlr: option "--list-all-functions-as-table" not recognized. -Please run "mlr --help" for usage information. - -List of functions ----------------------------------------------------------------- - -Each function takes a specific number of arguments, as shown below, except for functions marked as variadic such as ``min`` and ``max``. (The latter compute min and max of any number of numerical arguments.) There is no notion of optional or default-on-absent arguments. All argument-passing is positional rather than by name; arguments are passed by value, not by reference. - -You can get a list of all functions using **mlr -f**, with details using **mlr -F**. - - -.. _reference-dsl-colon: - -\! -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - ! (class=boolean #args=1) Logical negation. - - - -.. _reference-dsl-!=: - -!= -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - != (class=boolean #args=2) String/numeric inequality. Mixing number and string results in string compare. - - - -.. _reference-dsl-!=~: - -!=~ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - !=~ (class=boolean #args=2) String (left-hand side) does not match regex (right-hand side), e.g. '$name !=~ "^a.*b$"'. - - - -.. _reference-dsl-%: - -% -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - % (class=arithmetic #args=2) Remainder; never negative-valued (pythonic). - - - -.. _reference-dsl-&: - -& -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - & (class=arithmetic #args=2) Bitwise AND. - - - -.. _reference-dsl-&&: - -&& -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - && (class=boolean #args=2) Logical AND. - - - -.. _reference-dsl-times: - -\* -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - * (class=arithmetic #args=2) Multiplication, with integer*integer overflow to float. - - - -.. _reference-dsl-exponentiation: - -\** -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - ** (class=arithmetic #args=2) Exponentiation. Same as pow, but as an infix operator. - - - -.. _reference-dsl-plus: - -\+ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - + (class=arithmetic #args=1,2) Addition as binary operator; unary plus operator. - - - -.. _reference-dsl-minus: - -\- -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - - (class=arithmetic #args=1,2) Subtraction as binary operator; unary negation operator. - - - -.. _reference-dsl-.: - -. -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - . (class=string #args=2) String concatenation. - - - -.. _reference-dsl-.*: - -.* -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - .* (class=arithmetic #args=2) Multiplication, with integer-to-integer overflow. - - - -.. _reference-dsl-.+: - -.+ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - .+ (class=arithmetic #args=2) Addition, with integer-to-integer overflow. - - - -.. _reference-dsl-.-: - -.- -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - .- (class=arithmetic #args=2) Subtraction, with integer-to-integer overflow. - - - -.. _reference-dsl-./: - -./ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - ./ (class=arithmetic #args=2) Integer division; not pythonic. - - - -.. _reference-dsl-/: - -/ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - / (class=arithmetic #args=2) Division. Integer / integer is floating-point. - - - -.. _reference-dsl-//: - -// -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - // (class=arithmetic #args=2) Pythonic integer division, rounding toward negative. - - - -.. _reference-dsl-<: - -< -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - < (class=boolean #args=2) String/numeric less-than. Mixing number and string results in string compare. - - - -.. _reference-dsl-<<: - -<< -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - << (class=arithmetic #args=2) Bitwise left-shift. - - - -.. _reference-dsl-<=: - -<= -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - <= (class=boolean #args=2) String/numeric less-than-or-equals. Mixing number and string results in string compare. - - - -.. _reference-dsl-==: - -== -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - == (class=boolean #args=2) String/numeric equality. Mixing number and string results in string compare. - - - -.. _reference-dsl-=~: - -=~ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - =~ (class=boolean #args=2) String (left-hand side) matches regex (right-hand side), e.g. '$name =~ "^a.*b$"'. - - - -.. _reference-dsl->: - -> -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - > (class=boolean #args=2) String/numeric greater-than. Mixing number and string results in string compare. - - - -.. _reference-dsl->=: - ->= -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - >= (class=boolean #args=2) String/numeric greater-than-or-equals. Mixing number and string results in string compare. - - - -.. _reference-dsl-srsh: - -\>\> -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - >> (class=arithmetic #args=2) Bitwise signed right-shift. - - - -.. _reference-dsl-ursh: - -\>\>\> -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - >>> (class=arithmetic #args=2) Bitwise unsigned right-shift. - - - -.. _reference-dsl-question-mark-colon: - -\? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - ?: (class=boolean #args=3) Standard ternary operator. - - - -.. _reference-dsl-??: - -?? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - ?? (class=boolean #args=2) Absent-coalesce operator. $a ?? 1 evaluates to 1 if $a isn't defined in the current record. - - - -.. _reference-dsl-???: - -??? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - ??? (class=boolean #args=2) Absent-coalesce operator. $a ?? 1 evaluates to 1 if $a isn't defined in the current record, or has empty value. - - - -.. _reference-dsl-^: - -^ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - ^ (class=arithmetic #args=2) Bitwise XOR. - - - -.. _reference-dsl-^^: - -^^ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - ^^ (class=boolean #args=2) Logical XOR. - - - -.. _reference-dsl-bitwise-or: - -\| -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - | (class=arithmetic #args=2) Bitwise OR. - - - -.. _reference-dsl-||: - -|| -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - || (class=boolean #args=2) Logical OR. - - - -.. _reference-dsl-~: - -~ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - ~ (class=arithmetic #args=1) Bitwise NOT. Beware '$y=~$x' since =~ is the - regex-match operator: try '$y = ~$x'. - - - -.. _reference-dsl-abs: - -abs -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - abs (class=math #args=1) Absolute value. - - - -.. _reference-dsl-acos: - -acos -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - acos (class=math #args=1) Inverse trigonometric cosine. - - - -.. _reference-dsl-acosh: - -acosh -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - acosh (class=math #args=1) Inverse hyperbolic cosine. - - - -.. _reference-dsl-append: - -append -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - append (class=maps/arrays #args=2) Appends second argument to end of first argument, which must be an array. - - - -.. _reference-dsl-arrayify: - -arrayify -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - arrayify (class=maps/arrays #args=1) Walks through a nested map/array, converting any map with consecutive keys - "1", "2", ... into an array. Useful to wrap the output of unflatten. - - - -.. _reference-dsl-asin: - -asin -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - asin (class=math #args=1) Inverse trigonometric sine. - - - -.. _reference-dsl-asinh: - -asinh -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - asinh (class=math #args=1) Inverse hyperbolic sine. - - - -.. _reference-dsl-asserting_absent: - -asserting_absent -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - asserting_absent (class=typing #args=1) Aborts with an error if is_absent on the argument returns false, - else returns its argument. - - - -.. _reference-dsl-asserting_array: - -asserting_array -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - asserting_array (class=typing #args=1) Aborts with an error if is_array on the argument returns false, - else returns its argument. - - - -.. _reference-dsl-asserting_bool: - -asserting_bool -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - asserting_bool (class=typing #args=1) Aborts with an error if is_bool on the argument returns false, - else returns its argument. - - - -.. _reference-dsl-asserting_boolean: - -asserting_boolean -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - asserting_boolean (class=typing #args=1) Aborts with an error if is_boolean on the argument returns false, - else returns its argument. - - - -.. _reference-dsl-asserting_empty: - -asserting_empty -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - asserting_empty (class=typing #args=1) Aborts with an error if is_empty on the argument returns false, - else returns its argument. - - - -.. _reference-dsl-asserting_empty_map: - -asserting_empty_map -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - asserting_empty_map (class=typing #args=1) Aborts with an error if is_empty_map on the argument returns false, - else returns its argument. - - - -.. _reference-dsl-asserting_error: - -asserting_error -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - asserting_error (class=typing #args=1) Aborts with an error if is_error on the argument returns false, - else returns its argument. - - - -.. _reference-dsl-asserting_float: - -asserting_float -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - asserting_float (class=typing #args=1) Aborts with an error if is_float on the argument returns false, - else returns its argument. - - - -.. _reference-dsl-asserting_int: - -asserting_int -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - asserting_int (class=typing #args=1) Aborts with an error if is_int on the argument returns false, - else returns its argument. - - - -.. _reference-dsl-asserting_map: - -asserting_map -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - asserting_map (class=typing #args=1) Aborts with an error if is_map on the argument returns false, - else returns its argument. - - - -.. _reference-dsl-asserting_nonempty_map: - -asserting_nonempty_map -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - asserting_nonempty_map (class=typing #args=1) Aborts with an error if is_nonempty_map on the argument returns false, - else returns its argument. - - - -.. _reference-dsl-asserting_not_array: - -asserting_not_array -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - asserting_not_array (class=typing #args=1) Aborts with an error if is_not_array on the argument returns false, - else returns its argument. - - - -.. _reference-dsl-asserting_not_empty: - -asserting_not_empty -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - asserting_not_empty (class=typing #args=1) Aborts with an error if is_not_empty on the argument returns false, - else returns its argument. - - - -.. _reference-dsl-asserting_not_map: - -asserting_not_map -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - asserting_not_map (class=typing #args=1) Aborts with an error if is_not_map on the argument returns false, - else returns its argument. - - - -.. _reference-dsl-asserting_not_null: - -asserting_not_null -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - asserting_not_null (class=typing #args=1) Aborts with an error if is_not_null on the argument returns false, - else returns its argument. - - - -.. _reference-dsl-asserting_null: - -asserting_null -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - asserting_null (class=typing #args=1) Aborts with an error if is_null on the argument returns false, - else returns its argument. - - - -.. _reference-dsl-asserting_numeric: - -asserting_numeric -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - asserting_numeric (class=typing #args=1) Aborts with an error if is_numeric on the argument returns false, - else returns its argument. - - - -.. _reference-dsl-asserting_present: - -asserting_present -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - asserting_present (class=typing #args=1) Aborts with an error if is_present on the argument returns false, - else returns its argument. - - - -.. _reference-dsl-asserting_string: - -asserting_string -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - asserting_string (class=typing #args=1) Aborts with an error if is_string on the argument returns false, - else returns its argument. - - - -.. _reference-dsl-atan: - -atan -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - atan (class=math #args=1) One-argument arctangent. - - - -.. _reference-dsl-atan2: - -atan2 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - atan2 (class=math #args=2) Two-argument arctangent. - - - -.. _reference-dsl-atanh: - -atanh -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - atanh (class=math #args=1) Inverse hyperbolic tangent. - - - -.. _reference-dsl-bitcount: - -bitcount -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - bitcount (class=arithmetic #args=1) Count of 1-bits. - - - -.. _reference-dsl-boolean: - -boolean -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - boolean (class=conversion #args=1) Convert int/float/bool/string to boolean. - - - -.. _reference-dsl-capitalize: - -capitalize -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - capitalize (class=string #args=1) Convert string's first character to uppercase. - - - -.. _reference-dsl-cbrt: - -cbrt -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - cbrt (class=math #args=1) Cube root. - - - -.. _reference-dsl-ceil: - -ceil -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - ceil (class=math #args=1) Ceiling: nearest integer at or above. - - - -.. _reference-dsl-clean_whitespace: - -clean_whitespace -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - clean_whitespace (class=string #args=1) Same as collapse_whitespace and strip. - - - -.. _reference-dsl-collapse_whitespace: - -collapse_whitespace -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - collapse_whitespace (class=string #args=1) Strip repeated whitespace from string. - - - -.. _reference-dsl-cos: - -cos -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - cos (class=math #args=1) Trigonometric cosine. - - - -.. _reference-dsl-cosh: - -cosh -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - cosh (class=math #args=1) Hyperbolic cosine. - - - -.. _reference-dsl-depth: - -depth -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - depth (class=maps/arrays #args=1) Prints maximum depth of map/array. Scalars have depth 0. - - - -.. _reference-dsl-dhms2fsec: - -dhms2fsec -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - dhms2fsec (class=time #args=1) Recovers floating-point seconds as in dhms2fsec("5d18h53m20.250000s") = 500000.250000 - - - -.. _reference-dsl-dhms2sec: - -dhms2sec -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - dhms2sec (class=time #args=1) Recovers integer seconds as in dhms2sec("5d18h53m20s") = 500000 - - - -.. _reference-dsl-erf: - -erf -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - erf (class=math #args=1) Error function. - - - -.. _reference-dsl-erfc: - -erfc -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - erfc (class=math #args=1) Complementary error function. - - - -.. _reference-dsl-exp: - -exp -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - exp (class=math #args=1) Exponential function e**x. - - - -.. _reference-dsl-expm1: - -expm1 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - expm1 (class=math #args=1) e**x - 1. - - - -.. _reference-dsl-flatten: - -flatten -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - flatten (class=maps/arrays #args=3) Flattens multi-level maps to single-level ones. Examples: - flatten("a", ".", {"b": { "c": 4 }}) is {"a.b.c" : 4}. - flatten("", ".", {"a": { "b": 3 }}) is {"a.b" : 3}. - Two-argument version: flatten($*, ".") is the same as flatten("", ".", $*). - Useful for nested JSON-like structures for non-JSON file formats like CSV. - - - -.. _reference-dsl-float: - -float -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - float (class=conversion #args=1) Convert int/float/bool/string to float. - - - -.. _reference-dsl-floor: - -floor -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - floor (class=math #args=1) Floor: nearest integer at or below. - - - -.. _reference-dsl-fmtnum: - -fmtnum -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - fmtnum (class=conversion #args=2) Convert int/float/bool to string using - printf-style format string, e.g. '$s = fmtnum($n, "%06lld")'. - - - -.. _reference-dsl-fsec2dhms: - -fsec2dhms -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - fsec2dhms (class=time #args=1) Formats floating-point seconds as in fsec2dhms(500000.25) = "5d18h53m20.250000s" - - - -.. _reference-dsl-fsec2hms: - -fsec2hms -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - fsec2hms (class=time #args=1) Formats floating-point seconds as in fsec2hms(5000.25) = "01:23:20.250000" - - - -.. _reference-dsl-get_keys: - -get_keys -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - get_keys (class=maps/arrays #args=1) Returns array of keys of map or array - - - -.. _reference-dsl-get_values: - -get_values -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - get_values (class=maps/arrays #args=1) Returns array of keys of map or array -- in the latter case, returns a copy of the array - - - -.. _reference-dsl-gmt2sec: - -gmt2sec -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - gmt2sec (class=time #args=1) Parses GMT timestamp as integer seconds since the epoch. - - - -.. _reference-dsl-gsub: - -gsub -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - gsub (class=string #args=3) Example: '$name=gsub($name, "old", "new")' (replace all). - - - -.. _reference-dsl-haskey: - -haskey -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - haskey (class=maps/arrays #args=2) True/false if map has/hasn't key, e.g. 'haskey($*, "a")' or - 'haskey(mymap, mykey)', or true/false if array index is in bounds / out of bounds. - Error if 1st argument is not a map or array. Note -n..-1 alias to 1..n in Miller arrays. - - - -.. _reference-dsl-hexfmt: - -hexfmt -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - hexfmt (class=conversion #args=1) Convert int to hex string, e.g. 255 to "0xff". - - - -.. _reference-dsl-hms2fsec: - -hms2fsec -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - hms2fsec (class=time #args=1) Recovers floating-point seconds as in hms2fsec("01:23:20.250000") = 5000.250000 - - - -.. _reference-dsl-hms2sec: - -hms2sec -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - hms2sec (class=time #args=1) Recovers integer seconds as in hms2sec("01:23:20") = 5000 - - - -.. _reference-dsl-hostname: - -hostname -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - hostname (class=system #args=0) Returns the hostname as a string. - - - -.. _reference-dsl-int: - -int -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - int (class=conversion #args=1) Convert int/float/bool/string to int. - - - -.. _reference-dsl-invqnorm: - -invqnorm -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - invqnorm (class=math #args=1) Inverse of normal cumulative distribution function. - Note that invqorm(urand()) is normally distributed. - - - -.. _reference-dsl-is_absent: - -is_absent -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - is_absent (class=typing #args=1) False if field is present in input, true otherwise - - - -.. _reference-dsl-is_array: - -is_array -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - is_array (class=typing #args=1) True if argument is an array. - - - -.. _reference-dsl-is_bool: - -is_bool -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - is_bool (class=typing #args=1) True if field is present with boolean value. Synonymous with is_boolean. - - - -.. _reference-dsl-is_boolean: - -is_boolean -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - is_boolean (class=typing #args=1) True if field is present with boolean value. Synonymous with is_bool. - - - -.. _reference-dsl-is_empty: - -is_empty -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - is_empty (class=typing #args=1) True if field is present in input with empty string value, false otherwise. - - - -.. _reference-dsl-is_empty_map: - -is_empty_map -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - is_empty_map (class=typing #args=1) True if argument is a map which is empty. - - - -.. _reference-dsl-is_error: - -is_error -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - is_error (class=typing #args=1) True if if argument is an error, such as taking string length of an integer. - - - -.. _reference-dsl-is_float: - -is_float -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - is_float (class=typing #args=1) True if field is present with value inferred to be float - - - -.. _reference-dsl-is_int: - -is_int -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - is_int (class=typing #args=1) True if field is present with value inferred to be int - - - -.. _reference-dsl-is_map: - -is_map -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - is_map (class=typing #args=1) True if argument is a map. - - - -.. _reference-dsl-is_nonempty_map: - -is_nonempty_map -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - is_nonempty_map (class=typing #args=1) True if argument is a map which is non-empty. - - - -.. _reference-dsl-is_not_array: - -is_not_array -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - is_not_array (class=typing #args=1) True if argument is not an array. - - - -.. _reference-dsl-is_not_empty: - -is_not_empty -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - is_not_empty (class=typing #args=1) False if field is present in input with empty value, true otherwise - - - -.. _reference-dsl-is_not_map: - -is_not_map -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - is_not_map (class=typing #args=1) True if argument is not a map. - - - -.. _reference-dsl-is_not_null: - -is_not_null -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - is_not_null (class=typing #args=1) False if argument is null (empty or absent), true otherwise. - - - -.. _reference-dsl-is_null: - -is_null -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - is_null (class=typing #args=1) True if argument is null (empty or absent), false otherwise. - - - -.. _reference-dsl-is_numeric: - -is_numeric -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - is_numeric (class=typing #args=1) True if field is present with value inferred to be int or float - - - -.. _reference-dsl-is_present: - -is_present -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - is_present (class=typing #args=1) True if field is present in input, false otherwise. - - - -.. _reference-dsl-is_string: - -is_string -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - is_string (class=typing #args=1) True if field is present with string (including empty-string) value - - - -.. _reference-dsl-joink: - -joink -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - joink (class=conversion #args=2) Makes string from map/array keys. Examples: - joink({"a":3,"b":4,"c":5}, ",") = "a,b,c" - joink([1,2,3], ",") = "1,2,3". - - - -.. _reference-dsl-joinkv: - -joinkv -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - joinkv (class=conversion #args=3) Makes string from map/array key-value pairs. Examples: - joinkv([3,4,5], "=", ",") = "1=3,2=4,3=5" - joinkv({"a":3,"b":4,"c":5}, "=", ",") = "a=3,b=4,c=5" - - - -.. _reference-dsl-joinv: - -joinv -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - joinv (class=conversion #args=2) Makes string from map/array values. - joinv([3,4,5], ",") = "3,4,5" - joinv({"a":3,"b":4,"c":5}, ",") = "3,4,5" - - - -.. _reference-dsl-json_parse: - -json_parse -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - json_parse (class=maps/arrays #args=1) Converts value from JSON-formatted string. - - - -.. _reference-dsl-json_stringify: - -json_stringify -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - json_stringify (class=maps/arrays #args=1,2) Converts value to JSON-formatted string. Default output is single-line. - With optional second boolean argument set to true, produces multiline output. - - - -.. _reference-dsl-leafcount: - -leafcount -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - leafcount (class=maps/arrays #args=1) Counts total number of terminal values in map/array. For single-level - map/array, same as length. - - - -.. _reference-dsl-length: - -length -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - length (class=maps/arrays #args=1) Counts number of top-level entries in array/map. Scalars have length 1. - - - -.. _reference-dsl-log: - -log -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - log (class=math #args=1) Natural (base-e) logarithm. - - - -.. _reference-dsl-log10: - -log10 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - log10 (class=math #args=1) Base-10 logarithm. - - - -.. _reference-dsl-log1p: - -log1p -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - log1p (class=math #args=1) log(1-x). - - - -.. _reference-dsl-logifit: - -logifit -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - logifit (class=math #args=3) Given m and b from logistic regression, compute fit: - $yhat=logifit($x,$m,$b). - - - -.. _reference-dsl-lstrip: - -lstrip -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - lstrip (class=string #args=1) Strip leading whitespace from string. - - - -.. _reference-dsl-madd: - -madd -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - madd (class=arithmetic #args=3) a + b mod m (integers) - - - -.. _reference-dsl-mapdiff: - -mapdiff -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - mapdiff (class=maps/arrays #args=variadic) With 0 args, returns empty map. With 1 arg, returns copy of arg. - With 2 or more, returns copy of arg 1 with all keys from any of remaining - argument maps removed. - - - -.. _reference-dsl-mapexcept: - -mapexcept -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - mapexcept (class=maps/arrays #args=variadic) Returns a map with keys from remaining arguments, if any, unset. - Remaining arguments can be strings or arrays of string. - E.g. 'mapexcept({1:2,3:4,5:6}, 1, 5, 7)' is '{3:4}' - and 'mapexcept({1:2,3:4,5:6}, [1, 5, 7])' is '{3:4}'. - - - -.. _reference-dsl-mapselect: - -mapselect -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - mapselect (class=maps/arrays #args=variadic) Returns a map with only keys from remaining arguments set. - Remaining arguments can be strings or arrays of string. - E.g. 'mapselect({1:2,3:4,5:6}, 1, 5, 7)' is '{1:2,5:6}' - and 'mapselect({1:2,3:4,5:6}, [1, 5, 7])' is '{1:2,5:6}'. - - - -.. _reference-dsl-mapsum: - -mapsum -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - mapsum (class=maps/arrays #args=variadic) With 0 args, returns empty map. With >= 1 arg, returns a map with - key-value pairs from all arguments. Rightmost collisions win, e.g. - 'mapsum({1:2,3:4},{1:5})' is '{1:5,3:4}'. - - - -.. _reference-dsl-max: - -max -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - max (class=math #args=variadic) Max of n numbers; null loses. - - - -.. _reference-dsl-md5: - -md5 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - md5 (class=hashing #args=1) MD5 hash. - - - -.. _reference-dsl-mexp: - -mexp -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - mexp (class=arithmetic #args=3) a ** b mod m (integers) - - - -.. _reference-dsl-min: - -min -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - min (class=math #args=variadic) Min of n numbers; null loses. - - - -.. _reference-dsl-mmul: - -mmul -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - mmul (class=arithmetic #args=3) a * b mod m (integers) - - - -.. _reference-dsl-msub: - -msub -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - msub (class=arithmetic #args=3) a - b mod m (integers) - - - -.. _reference-dsl-os: - -os -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - os (class=system #args=0) Returns the operating-system name as a string. - - - -.. _reference-dsl-pow: - -pow -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - pow (class=arithmetic #args=2) Exponentiation. Same as **, but as a function. - - - -.. _reference-dsl-qnorm: - -qnorm -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - qnorm (class=math #args=1) Normal cumulative distribution function. - - - -.. _reference-dsl-regextract: - -regextract -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - regextract (class=string #args=2) Example: '$name=regextract($name, "[A-Z]{3}[0-9]{2}")' - - - -.. _reference-dsl-regextract_or_else: - -regextract_or_else -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - regextract_or_else (class=string #args=3) Example: '$name=regextract_or_else($name, "[A-Z]{3}[0-9]{2}", "default")' - - - -.. _reference-dsl-round: - -round -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - round (class=math #args=1) Round to nearest integer. - - - -.. _reference-dsl-roundm: - -roundm -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - roundm (class=math #args=2) Round to nearest multiple of m: roundm($x,$m) is - the same as round($x/$m)*$m. - - - -.. _reference-dsl-rstrip: - -rstrip -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - rstrip (class=string #args=1) Strip trailing whitespace from string. - - - -.. _reference-dsl-sec2dhms: - -sec2dhms -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - sec2dhms (class=time #args=1) Formats integer seconds as in sec2dhms(500000) = "5d18h53m20s" - - - -.. _reference-dsl-sec2gmt: - -sec2gmt -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - sec2gmt (class=time #args=1,2) Formats seconds since epoch (integer part) - as GMT timestamp, e.g. sec2gmt(1440768801.7) = "2015-08-28T13:33:21Z". - Leaves non-numbers as-is. With second integer argument n, includes n decimal places - for the seconds part - - - -.. _reference-dsl-sec2gmtdate: - -sec2gmtdate -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - sec2gmtdate (class=time #args=1) Formats seconds since epoch (integer part) - as GMT timestamp with year-month-date, e.g. sec2gmtdate(1440768801.7) = "2015-08-28". - Leaves non-numbers as-is. - - - -.. _reference-dsl-sec2hms: - -sec2hms -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - sec2hms (class=time #args=1) Formats integer seconds as in sec2hms(5000) = "01:23:20" - - - -.. _reference-dsl-sgn: - -sgn -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - sgn (class=math #args=1) +1, 0, -1 for positive, zero, negative input respectively. - - - -.. _reference-dsl-sha1: - -sha1 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - sha1 (class=hashing #args=1) SHA1 hash. - - - -.. _reference-dsl-sha256: - -sha256 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - sha256 (class=hashing #args=1) SHA256 hash. - - - -.. _reference-dsl-sha512: - -sha512 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - sha512 (class=hashing #args=1) SHA512 hash. - - - -.. _reference-dsl-sin: - -sin -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - sin (class=math #args=1) Trigonometric sine. - - - -.. _reference-dsl-sinh: - -sinh -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - sinh (class=math #args=1) Hyperbolic sine. - - - -.. _reference-dsl-splita: - -splita -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - splita (class=conversion #args=2) Splits string into array with type inference. Example: - splita("3,4,5", ",") = [3,4,5] - - - -.. _reference-dsl-splitax: - -splitax -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - splitax (class=conversion #args=2) Splits string into array without type inference. Example: - splita("3,4,5", ",") = ["3","4","5"] - - - -.. _reference-dsl-splitkv: - -splitkv -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - splitkv (class=conversion #args=3) Splits string by separators into map with type inference. Example: - splitkv("a=3,b=4,c=5", "=", ",") = {"a":3,"b":4,"c":5} - - - -.. _reference-dsl-splitkvx: - -splitkvx -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - splitkvx (class=conversion #args=3) Splits string by separators into map without type inference (keys and - values are strings). Example: - splitkvx("a=3,b=4,c=5", "=", ",") = {"a":"3","b":"4","c":"5"} - - - -.. _reference-dsl-splitnv: - -splitnv -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - splitnv (class=conversion #args=2) Splits string by separator into integer-indexed map with type inference. Example: - splitnv("a,b,c", ",") = {"1":"a","2":"b","3":"c"} - - - -.. _reference-dsl-splitnvx: - -splitnvx -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - splitnvx (class=conversion #args=2) Splits string by separator into integer-indexed map without type - inference (values are strings). Example: - splitnvx("3,4,5", ",") = {"1":"3","2":"4","3":"5"} - - - -.. _reference-dsl-sqrt: - -sqrt -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - sqrt (class=math #args=1) Square root. - - - -.. _reference-dsl-ssub: - -ssub -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - ssub (class=string #args=3) Like sub but does no regexing. No characters are special. - - - -.. _reference-dsl-strftime: - -strftime -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - strftime (class=time #args=2) Formats seconds since the epoch as timestamp, e.g. - strftime(1440768801.7,"%Y-%m-%dT%H:%M:%SZ") = "2015-08-28T13:33:21Z", and - strftime(1440768801.7,"%Y-%m-%dT%H:%M:%3SZ") = "2015-08-28T13:33:21.700Z". - Format strings are as in the C library (please see "man strftime" on your system), - with the Miller-specific addition of "%1S" through "%9S" which format the seconds - with 1 through 9 decimal places, respectively. ("%S" uses no decimal places.) - See also strftime_local. - - - -.. _reference-dsl-string: - -string -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - string (class=conversion #args=1) Convert int/float/bool/string/array/map to string. - - - -.. _reference-dsl-strip: - -strip -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - strip (class=string #args=1) Strip leading and trailing whitespace from string. - - - -.. _reference-dsl-strlen: - -strlen -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - strlen (class=string #args=1) String length. - - - -.. _reference-dsl-strptime: - -strptime -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - strptime (class=time #args=2) strptime: Parses timestamp as floating-point seconds since the epoch, - e.g. strptime("2015-08-28T13:33:21Z","%Y-%m-%dT%H:%M:%SZ") = 1440768801.000000, - and strptime("2015-08-28T13:33:21.345Z","%Y-%m-%dT%H:%M:%SZ") = 1440768801.345000. - See also strptime_local. - - - -.. _reference-dsl-sub: - -sub -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - sub (class=string #args=3) Example: '$name=sub($name, "old", "new")' (replace once). - - - -.. _reference-dsl-substr: - -substr -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - substr (class=string #args=3) substr is an alias for substr0. See also substr1. Miller is generally 1-up - with all array indices, but, this is a backward-compatibility issue with Miller 5 and below. - Arrays are new in Miller 6; the substr function is older. - - - -.. _reference-dsl-substr0: - -substr0 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - substr0 (class=string #args=3) substr0(s,m,n) gives substring of s from 0-up position m to n - inclusive. Negative indices -len .. -1 alias to 0 .. len-1. - - - -.. _reference-dsl-substr1: - -substr1 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - substr1 (class=string #args=3) substr1(s,m,n) gives substring of s from 1-up position m to n - inclusive. Negative indices -len .. -1 alias to 1 .. len. - - - -.. _reference-dsl-system: - -system -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - system (class=system #args=1) Run command string, yielding its stdout minus final carriage return. - - - -.. _reference-dsl-systime: - -systime -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - systime (class=time #args=0) help string will go here - - - -.. _reference-dsl-systimeint: - -systimeint -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - systimeint (class=time #args=0) help string will go here - - - -.. _reference-dsl-tan: - -tan -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - tan (class=math #args=1) Trigonometric tangent. - - - -.. _reference-dsl-tanh: - -tanh -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - tanh (class=math #args=1) Hyperbolic tangent. - - - -.. _reference-dsl-tolower: - -tolower -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - tolower (class=string #args=1) Convert string to lowercase. - - - -.. _reference-dsl-toupper: - -toupper -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - toupper (class=string #args=1) Convert string to uppercase. - - - -.. _reference-dsl-truncate: - -truncate -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - truncate (class=string #args=2) Truncates string first argument to max length of int second argument. - - - -.. _reference-dsl-typeof: - -typeof -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - typeof (class=typing #args=1) Convert argument to type of argument (e.g. "str"). For debug. - - - -.. _reference-dsl-unflatten: - -unflatten -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - unflatten (class=maps/arrays #args=2) Reverses flatten. Example: - unflatten({"a.b.c" : 4}, ".") is {"a": "b": { "c": 4 }}. - Useful for nested JSON-like structures for non-JSON file formats like CSV. - See also arrayify. - - - -.. _reference-dsl-uptime: - -uptime -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - uptime (class=time #args=0) help string will go here - - - -.. _reference-dsl-urand: - -urand -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - urand (class=math #args=0) Floating-point numbers uniformly distributed on the unit interval. - Int-valued example: '$n=floor(20+urand()*11)'. - - - -.. _reference-dsl-urand32: - -urand32 -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - urand32 (class=math #args=0) Integer uniformly distributed 0 and 2**32-1 inclusive. - - - -.. _reference-dsl-urandint: - -urandint -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - urandint (class=math #args=2) Integer uniformly distributed between inclusive integer endpoints. - - - -.. _reference-dsl-urandrange: - -urandrange -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - urandrange (class=math #args=2) Floating-point numbers uniformly distributed on the interval [a, b). - - - -.. _reference-dsl-version: - -version -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - - version (class=system #args=0) Returns the Miller version as a string. - - diff --git a/docs6/reference-dsl-builtin-functions.rst.in b/docs6/reference-dsl-builtin-functions.rst.in deleted file mode 100644 index ab02aa78e..000000000 --- a/docs6/reference-dsl-builtin-functions.rst.in +++ /dev/null @@ -1,16 +0,0 @@ -DSL reference: built-in functions -===================================== - -Summary ----------------------------------------------------------------- - -GENRST_RUN_CONTENT_GENERATOR(mk-func-table.rb) - -List of functions ----------------------------------------------------------------- - -Each function takes a specific number of arguments, as shown below, except for functions marked as variadic such as ``min`` and ``max``. (The latter compute min and max of any number of numerical arguments.) There is no notion of optional or default-on-absent arguments. All argument-passing is positional rather than by name; arguments are passed by value, not by reference. - -You can get a list of all functions using **mlr -f**, with details using **mlr -F**. - -GENRST_RUN_CONTENT_GENERATOR(mk-func-h2s.sh) diff --git a/docs6/reference-dsl-complexity.rst b/docs6/reference-dsl-complexity.rst deleted file mode 100644 index a1e6938fc..000000000 --- a/docs6/reference-dsl-complexity.rst +++ /dev/null @@ -1,12 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -DSL reference: a note on the complexity of Miller's expression language -======================================================================= - -One of Miller's strengths is its brevity: it's much quicker -- and less error-prone -- to type ``mlr stats1 -a sum -f x,y -g a,b`` than having to track summation variables as in ``awk``, or using Miller's out-of-stream variables. And the more language features Miller's put-DSL has (for-loops, if-statements, nested control structures, user-defined functions, etc.) then the *less* powerful it begins to seem: because of the other programming-language features it *doesn't* have (classes, exceptions, and so on). - -When I was originally prototyping Miller in 2015, the decision I had was whether to hand-code in a low-level language like C or Rust or Go, with my own hand-rolled DSL, or whether to use a higher-level language (like Python or Lua or Nim) and let the ``put`` statements be handled by the implementation language's own ``eval``: the implementation language would take the place of a DSL. Multiple performance experiments showed me I could get better throughput using the former, by a wide margin. So Miller is Go under the hood with a hand-rolled DSL. - -I do want to keep focusing on what Miller is good at -- concise notation, low latency, and high throughput -- and not add too much in terms of high-level-language features to the DSL. That said, some sort of customizability is a basic thing to want. As of 4.1.0 we have recursive for/while/if structures on about the same complexity level as ``awk``; as of 5.0.0 we have user-defined functions and map-valued variables, again on about the same complexity level as ``awk`` along with optional type-declaration syntax; as of Miller 6 we have full support for arrays. While I'm excited by these powerful language features, I hope to keep new features focused on Miller's sweet spot which is speed plus simplicity. - diff --git a/docs6/reference-dsl-complexity.rst.in b/docs6/reference-dsl-complexity.rst.in deleted file mode 100644 index 97017f6bb..000000000 --- a/docs6/reference-dsl-complexity.rst.in +++ /dev/null @@ -1,9 +0,0 @@ -DSL reference: a note on the complexity of Miller's expression language -======================================================================= - -One of Miller's strengths is its brevity: it's much quicker -- and less error-prone -- to type ``mlr stats1 -a sum -f x,y -g a,b`` than having to track summation variables as in ``awk``, or using Miller's out-of-stream variables. And the more language features Miller's put-DSL has (for-loops, if-statements, nested control structures, user-defined functions, etc.) then the *less* powerful it begins to seem: because of the other programming-language features it *doesn't* have (classes, exceptions, and so on). - -When I was originally prototyping Miller in 2015, the decision I had was whether to hand-code in a low-level language like C or Rust or Go, with my own hand-rolled DSL, or whether to use a higher-level language (like Python or Lua or Nim) and let the ``put`` statements be handled by the implementation language's own ``eval``: the implementation language would take the place of a DSL. Multiple performance experiments showed me I could get better throughput using the former, by a wide margin. So Miller is Go under the hood with a hand-rolled DSL. - -I do want to keep focusing on what Miller is good at -- concise notation, low latency, and high throughput -- and not add too much in terms of high-level-language features to the DSL. That said, some sort of customizability is a basic thing to want. As of 4.1.0 we have recursive for/while/if structures on about the same complexity level as ``awk``; as of 5.0.0 we have user-defined functions and map-valued variables, again on about the same complexity level as ``awk`` along with optional type-declaration syntax; as of Miller 6 we have full support for arrays. While I'm excited by these powerful language features, I hope to keep new features focused on Miller's sweet spot which is speed plus simplicity. - diff --git a/docs6/reference-dsl-control-structures.rst b/docs6/reference-dsl-control-structures.rst deleted file mode 100644 index 505dc53cf..000000000 --- a/docs6/reference-dsl-control-structures.rst +++ /dev/null @@ -1,549 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -DSL reference: control structures -================================================================ - -Pattern-action blocks -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -These are reminiscent of ``awk`` syntax. They can be used to allow assignments to be done only when appropriate -- e.g. for math-function domain restrictions, regex-matching, and so on: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr cat data/put-gating-example-1.dkvp - x=-1 - x=0 - x=1 - x=2 - x=3 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put '$x > 0.0 { $y = log10($x); $z = sqrt($y) }' data/put-gating-example-1.dkvp - x=-1 - x=0 - x=1,y=0,z=0 - x=2,y=0.3010299956639812,z=0.5486620049392715 - x=3,y=0.4771212547196624,z=0.6907396432228734 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr cat data/put-gating-example-2.dkvp - a=abc_123 - a=some other name - a=xyz_789 - -.. code-block:: none - :emphasize-lines: 1-5 - - mlr put ' - $a =~ "([a-z]+)_([0-9]+)" { - $b = "left_\1"; $c = "right_\2" - }' \ - data/put-gating-example-2.dkvp - a=abc_123,b=left_\1,c=right_\2 - a=some other name - a=xyz_789,b=left_\1,c=right_\2 - -This produces heteregenous output which Miller, of course, has no problems with (see :doc:`record-heterogeneity`). But if you want homogeneous output, the curly braces can be replaced with a semicolon between the expression and the body statements. This causes ``put`` to evaluate the boolean expression (along with any side effects, namely, regex-captures ``\1``, ``\2``, etc.) but doesn't use it as a criterion for whether subsequent assignments should be executed. Instead, subsequent assignments are done unconditionally: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put '$x > 0.0; $y = log10($x); $z = sqrt($y)' data/put-gating-example-1.dkvp - x=1,y=0,z=0 - x=2,y=0.3010299956639812,z=0.5486620049392715 - x=3,y=0.4771212547196624,z=0.6907396432228734 - -.. code-block:: none - :emphasize-lines: 1-5 - - mlr put ' - $a =~ "([a-z]+)_([0-9]+)"; - $b = "left_\1"; - $c = "right_\2" - ' data/put-gating-example-2.dkvp - a=abc_123,b=left_\1,c=right_\2 - a=xyz_789,b=left_\1,c=right_\2 - -If-statements -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -These are again reminiscent of ``awk``. Pattern-action blocks are a special case of ``if`` with no ``elif`` or ``else`` blocks, no ``if`` keyword, and parentheses optional around the boolean expression: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put 'NR == 4 {$foo = "bar"}' - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put 'if (NR == 4) {$foo = "bar"}' - -Compound statements use ``elif`` (rather than ``elsif`` or ``else if``): - -.. code-block:: none - - mlr put ' - if (NR == 2) { - ... - } elif (NR ==4) { - ... - } elif (NR ==6) { - ... - } else { - ... - } - ' - -While and do-while loops -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Miller's ``while`` and ``do-while`` are unsurprising in comparison to various languages, as are ``break`` and ``continue``: - -.. code-block:: none - :emphasize-lines: 1-6 - - echo x=1,y=2 | mlr put ' - while (NF < 10) { - $[NF+1] = "" - } - $foo = "bar" - ' - x=1,y=2,3=,4=,5=,6=,7=,8=,9=,10=,foo=bar - -.. code-block:: none - :emphasize-lines: 1-9 - - echo x=1,y=2 | mlr put ' - do { - $[NF+1] = ""; - if (NF == 5) { - break - } - } while (NF < 10); - $foo = "bar" - ' - x=1,y=2,3=,4=,5=,foo=bar - -A ``break`` or ``continue`` within nested conditional blocks or if-statements will, of course, propagate to the innermost loop enclosing them, if any. A ``break`` or ``continue`` outside a loop is a syntax error that will be flagged as soon as the expression is parsed, before any input records are ingested. -The existence of ``while``, ``do-while``, and ``for`` loops in Miller's DSL means that you can create infinite-loop scenarios inadvertently. In particular, please recall that DSL statements are executed once if in ``begin`` or ``end`` blocks, and once *per record* otherwise. For example, **while (NR < 10) will never terminate as NR is only incremented between records**. - -For-loops -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -While Miller's ``while`` and ``do-while`` statements are much as in many other languages, ``for`` loops are more idiosyncratic to Miller. They are loops over key-value pairs, whether in stream records, out-of-stream variables, local variables, or map-literals: more reminiscent of ``foreach``, as in (for example) PHP. There are **for-loops over map keys** and **for-loops over key-value tuples**. Additionally, Miller has a **C-style triple-for loop** with initialize, test, and update statements. - -As with ``while`` and ``do-while``, a ``break`` or ``continue`` within nested control structures will propagate to the innermost loop enclosing them, if any, and a ``break`` or ``continue`` outside a loop is a syntax error that will be flagged as soon as the expression is parsed, before any input records are ingested. - -Key-only for-loops -................................................................ - -The ``key`` variable is always bound to the *key* of key-value pairs: - -.. code-block:: none - :emphasize-lines: 1-8 - - mlr --from data/small put ' - print "NR = ".NR; - for (key in $*) { - value = $[key]; - print " key:" . key . " value:".value; - } - - ' - NR = 1 - key:a value:pan - key:b value:pan - key:i value:1 - key:x value:0.3467901443380824 - key:y value:0.7268028627434533 - a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533 - NR = 2 - key:a value:eks - key:b value:pan - key:i value:2 - key:x value:0.7586799647899636 - key:y value:0.5221511083334797 - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797 - NR = 3 - key:a value:wye - key:b value:wye - key:i value:3 - key:x value:0.20460330576630303 - key:y value:0.33831852551664776 - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776 - NR = 4 - key:a value:eks - key:b value:wye - key:i value:4 - key:x value:0.38139939387114097 - key:y value:0.13418874328430463 - a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463 - NR = 5 - key:a value:wye - key:b value:pan - key:i value:5 - key:x value:0.5732889198020006 - key:y value:0.8636244699032729 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729 - -.. code-block:: none - :emphasize-lines: 1-8 - - mlr -n put ' - end { - o = {1:2, 3:{4:5}}; - for (key in o) { - print " key:" . key . " valuetype:" . typeof(o[key]); - } - } - ' - key:1 valuetype:int - key:3 valuetype:map - -Note that the value corresponding to a given key may be gotten as through a **computed field name** using square brackets as in ``$[key]`` for stream records, or by indexing the looped-over variable using square brackets. - -Key-value for-loops -................................................................ - -Single-level keys may be gotten at using either ``for(k,v)`` or ``for((k),v)``; multi-level keys may be gotten at using ``for((k1,k2,k3),v)`` and so on. The ``v`` variable will be bound to to a scalar value (a string or a number) if the map stops at that level, or to a map-valued variable if the map goes deeper. If the map isn't deep enough then the loop body won't be executed. - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/for-srec-example.tbl - label1 label2 f1 f2 f3 - blue green 100 240 350 - red green 120 11 195 - yellow blue 140 0 240 - -.. code-block:: none - :emphasize-lines: 1-11 - - mlr --pprint --from data/for-srec-example.tbl put ' - $sum1 = $f1 + $f2 + $f3; - $sum2 = 0; - $sum3 = 0; - for (key, value in $*) { - if (key =~ "^f[0-9]+") { - $sum2 += value; - $sum3 += $[key]; - } - } - ' - label1 label2 f1 f2 f3 sum1 sum2 sum3 - blue green 100 240 350 690 690 690 - red green 120 11 195 326 326 326 - yellow blue 140 0 240 380 380 380 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --from data/small --opprint put 'for (k,v in $*) { $[k."_type"] = typeof(v) }' - a b i x y a_type b_type i_type x_type y_type - pan pan 1 0.3467901443380824 0.7268028627434533 string string int float float - eks pan 2 0.7586799647899636 0.5221511083334797 string string int float float - wye wye 3 0.20460330576630303 0.33831852551664776 string string int float float - eks wye 4 0.38139939387114097 0.13418874328430463 string string int float float - wye pan 5 0.5732889198020006 0.8636244699032729 string string int float float - -Note that the value of the current field in the for-loop can be gotten either using the bound variable ``value``, or through a **computed field name** using square brackets as in ``$[key]``. - -Important note: to avoid inconsistent looping behavior in case you're setting new fields (and/or unsetting existing ones) while looping over the record, **Miller makes a copy of the record before the loop: loop variables are bound from the copy and all other reads/writes involve the record itself**: - -.. code-block:: none - :emphasize-lines: 1-10 - - mlr --from data/small --opprint put ' - $sum1 = 0; - $sum2 = 0; - for (k,v in $*) { - if (is_numeric(v)) { - $sum1 +=v; - $sum2 += $[k]; - } - } - ' - a b i x y sum1 sum2 - pan pan 1 0.3467901443380824 0.7268028627434533 2.0735930070815356 8.294372028326142 - eks pan 2 0.7586799647899636 0.5221511083334797 3.280831073123443 13.123324292493772 - wye wye 3 0.20460330576630303 0.33831852551664776 3.5429218312829507 14.171687325131803 - eks wye 4 0.38139939387114097 0.13418874328430463 4.515588137155445 18.06235254862178 - wye pan 5 0.5732889198020006 0.8636244699032729 6.436913389705273 25.747653558821092 - -It can be confusing to modify the stream record while iterating over a copy of it, so instead you might find it simpler to use a local variable in the loop and only update the stream record after the loop: - -.. code-block:: none - :emphasize-lines: 1-9 - - mlr --from data/small --opprint put ' - sum = 0; - for (k,v in $*) { - if (is_numeric(v)) { - sum += $[k]; - } - } - $sum = sum - ' - a b i x y sum - pan pan 1 0.3467901443380824 0.7268028627434533 2.0735930070815356 - eks pan 2 0.7586799647899636 0.5221511083334797 3.280831073123443 - wye wye 3 0.20460330576630303 0.33831852551664776 3.5429218312829507 - eks wye 4 0.38139939387114097 0.13418874328430463 4.515588137155445 - wye pan 5 0.5732889198020006 0.8636244699032729 6.436913389705273 - -You can also start iterating on sub-hashmaps of an out-of-stream or local variable; you can loop over nested keys; you can loop over all out-of-stream variables. The bound variables are bound to a copy of the sub-hashmap as it was before the loop started. The sub-hashmap is specified by square-bracketed indices after ``in``, and additional deeper indices are bound to loop key-variables. The terminal values are bound to the loop value-variable whenever the keys are not too shallow. The value-variable may refer to a terminal (string, number) or it may be map-valued if the map goes deeper. Example indexing is as follows: - -.. code-block:: none - - # Parentheses are optional for single key: - for (k1, v in @a["b"]["c"]) { ... } - for ((k1), v in @a["b"]["c"]) { ... } - # Parentheses are required for multiple keys: - for ((k1, k2), v in @a["b"]["c"]) { ... } # Loop over subhashmap of a variable - for ((k1, k2, k3), v in @a["b"]["c"]) { ... } # Ditto - for ((k1, k2, k3), v in @a { ... } # Loop over variable starting from basename - for ((k1, k2, k3), v in @* { ... } # Loop over all variables (k1 is bound to basename) - -That's confusing in the abstract, so a concrete example is in order. Suppose the out-of-stream variable ``@myvar`` is populated as follows: - -.. code-block:: none - :emphasize-lines: 1-10 - - mlr -n put --jknquoteint -q ' - begin { - @myvar = { - 1: 2, - 3: { 4 : 5 }, - 6: { 7: { 8: 9 } } - } - } - end { dump } - ' - { - "myvar": { - "1": 2, - "3": { - "4": 5 - }, - "6": { - "7": { - "8": 9 - } - } - } - } - -Then we can get at various values as follows: - -.. code-block:: none - :emphasize-lines: 1-16 - - mlr -n put --jknquoteint -q ' - begin { - @myvar = { - 1: 2, - 3: { 4 : 5 }, - 6: { 7: { 8: 9 } } - } - } - end { - for (k, v in @myvar) { - print - "key=" . k . - ",valuetype=" . typeof(v); - } - } - ' - key=1,valuetype=int - key=3,valuetype=map - key=6,valuetype=map - -.. code-block:: none - :emphasize-lines: 1-17 - - mlr -n put --jknquoteint -q ' - begin { - @myvar = { - 1: 2, - 3: { 4 : 5 }, - 6: { 7: { 8: 9 } } - } - } - end { - for ((k1, k2), v in @myvar) { - print - "key1=" . k1 . - ",key2=" . k2 . - ",valuetype=" . typeof(v); - } - } - ' - key1=3,key2=4,valuetype=int - key1=6,key2=7,valuetype=map - -.. code-block:: none - :emphasize-lines: 1-17 - - mlr -n put --jknquoteint -q ' - begin { - @myvar = { - 1: 2, - 3: { 4 : 5 }, - 6: { 7: { 8: 9 } } - } - } - end { - for ((k1, k2), v in @myvar[6]) { - print - "key1=" . k1 . - ",key2=" . k2 . - ",valuetype=" . typeof(v); - } - } - ' - key1=7,key2=8,valuetype=int - -C-style triple-for loops -................................................................ - -These are supported as follows: - -.. code-block:: none - :emphasize-lines: 1-7 - - mlr --from data/small --opprint put ' - num suma = 0; - for (a = 1; a <= NR; a += 1) { - suma += a; - } - $suma = suma; - ' - a b i x y suma - pan pan 1 0.3467901443380824 0.7268028627434533 1 - eks pan 2 0.7586799647899636 0.5221511083334797 3 - wye wye 3 0.20460330576630303 0.33831852551664776 6 - eks wye 4 0.38139939387114097 0.13418874328430463 10 - wye pan 5 0.5732889198020006 0.8636244699032729 15 - -.. code-block:: none - :emphasize-lines: 1-10 - - mlr --from data/small --opprint put ' - num suma = 0; - num sumb = 0; - for (num a = 1, num b = 1; a <= NR; a += 1, b *= 2) { - suma += a; - sumb += b; - } - $suma = suma; - $sumb = sumb; - ' - a b i x y suma sumb - pan pan 1 0.3467901443380824 0.7268028627434533 1 1 - eks pan 2 0.7586799647899636 0.5221511083334797 3 3 - wye wye 3 0.20460330576630303 0.33831852551664776 6 7 - eks wye 4 0.38139939387114097 0.13418874328430463 10 15 - wye pan 5 0.5732889198020006 0.8636244699032729 15 31 - -Notes: - -* In ``for (start; continuation; update) { body }``, the start, continuation, and update statements may be empty, single statements, or multiple comma-separated statements. If the continuation is empty (e.g. ``for(i=1;;i+=1)``) it defaults to true. - -* In particular, you may use ``$``-variables and/or ``@``-variables in the start, continuation, and/or update steps (as well as the body, of course). - -* The typedecls such as ``int`` or ``num`` are optional. If a typedecl is provided (for a local variable), it binds a variable scoped to the for-loop regardless of whether a same-name variable is present in outer scope. If a typedecl is not provided, then the variable is scoped to the for-loop if no same-name variable is present in outer scope, or if a same-name variable is present in outer scope then it is modified. - -* Miller has no ``++`` or ``--`` operators. - -* As with all for/if/while statements in Miller, the curly braces are required even if the body is a single statement, or empty. - -Begin/end blocks -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Miller supports an ``awk``-like ``begin/end`` syntax. The statements in the ``begin`` block are executed before any input records are read; the statements in the ``end`` block are executed after the last input record is read. (If you want to execute some statement at the start of each file, not at the start of the first file as with ``begin``, you might use a pattern/action block of the form ``FNR == 1 { ... }``.) All statements outside of ``begin`` or ``end`` are, of course, executed on every input record. Semicolons separate statements inside or outside of begin/end blocks; semicolons are required between begin/end block bodies and any subsequent statement. For example: - -.. code-block:: none - :emphasize-lines: 1-5 - - mlr put ' - begin { @sum = 0 }; - @x_sum += $x; - end { emit @x_sum } - ' ../data/small - a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533 - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797 - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776 - a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729 - a=zee,b=pan,i=6,x=0.5271261600918548,y=0.49322128674835697 - a=eks,b=zee,i=7,x=0.6117840605678454,y=0.1878849191181694 - a=zee,b=wye,i=8,x=0.5985540091064224,y=0.976181385699006 - a=hat,b=wye,i=9,x=0.03144187646093577,y=0.7495507603507059 - a=pan,b=wye,i=10,x=0.5026260055412137,y=0.9526183602969864 - x_sum=4.536293840335763 - -Since uninitialized out-of-stream variables default to 0 for addition/substraction and 1 for multiplication when they appear on expression right-hand sides (not quite as in ``awk``, where they'd default to 0 either way), the above can be written more succinctly as - -.. code-block:: none - :emphasize-lines: 1-4 - - mlr put ' - @x_sum += $x; - end { emit @x_sum } - ' ../data/small - a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533 - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797 - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776 - a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729 - a=zee,b=pan,i=6,x=0.5271261600918548,y=0.49322128674835697 - a=eks,b=zee,i=7,x=0.6117840605678454,y=0.1878849191181694 - a=zee,b=wye,i=8,x=0.5985540091064224,y=0.976181385699006 - a=hat,b=wye,i=9,x=0.03144187646093577,y=0.7495507603507059 - a=pan,b=wye,i=10,x=0.5026260055412137,y=0.9526183602969864 - x_sum=4.536293840335763 - -The **put -q** option is a shorthand which suppresses printing of each output record, with only ``emit`` statements being output. So to get only summary outputs, one could write - -.. code-block:: none - :emphasize-lines: 1-4 - - mlr put -q ' - @x_sum += $x; - end { emit @x_sum } - ' ../data/small - x_sum=4.536293840335763 - -We can do similarly with multiple out-of-stream variables: - -.. code-block:: none - :emphasize-lines: 1-8 - - mlr put -q ' - @x_count += 1; - @x_sum += $x; - end { - emit @x_count; - emit @x_sum; - } - ' ../data/small - x_count=10 - x_sum=4.536293840335763 - -This is of course not much different than - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr stats1 -a count,sum -f x ../data/small - x_count=10,x_sum=4.536293840335763 - -Note that it's a syntax error for begin/end blocks to refer to field names (beginning with ``$``), since these execute outside the context of input records. - diff --git a/docs6/reference-dsl-control-structures.rst.in b/docs6/reference-dsl-control-structures.rst.in deleted file mode 100644 index fc615027b..000000000 --- a/docs6/reference-dsl-control-structures.rst.in +++ /dev/null @@ -1,176 +0,0 @@ -DSL reference: control structures -================================================================ - -Pattern-action blocks -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -These are reminiscent of ``awk`` syntax. They can be used to allow assignments to be done only when appropriate -- e.g. for math-function domain restrictions, regex-matching, and so on: - -GENRST_RUN_COMMAND -mlr cat data/put-gating-example-1.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put '$x > 0.0 { $y = log10($x); $z = sqrt($y) }' data/put-gating-example-1.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr cat data/put-gating-example-2.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put ' - $a =~ "([a-z]+)_([0-9]+)" { - $b = "left_\1"; $c = "right_\2" - }' \ - data/put-gating-example-2.dkvp -GENRST_EOF - -This produces heteregenous output which Miller, of course, has no problems with (see :doc:`record-heterogeneity`). But if you want homogeneous output, the curly braces can be replaced with a semicolon between the expression and the body statements. This causes ``put`` to evaluate the boolean expression (along with any side effects, namely, regex-captures ``\1``, ``\2``, etc.) but doesn't use it as a criterion for whether subsequent assignments should be executed. Instead, subsequent assignments are done unconditionally: - -GENRST_RUN_COMMAND -mlr put '$x > 0.0; $y = log10($x); $z = sqrt($y)' data/put-gating-example-1.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put ' - $a =~ "([a-z]+)_([0-9]+)"; - $b = "left_\1"; - $c = "right_\2" -' data/put-gating-example-2.dkvp -GENRST_EOF - -If-statements -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -These are again reminiscent of ``awk``. Pattern-action blocks are a special case of ``if`` with no ``elif`` or ``else`` blocks, no ``if`` keyword, and parentheses optional around the boolean expression: - -GENRST_SHOW_COMMAND -mlr put 'NR == 4 {$foo = "bar"}' -GENRST_EOF - -GENRST_SHOW_COMMAND -mlr put 'if (NR == 4) {$foo = "bar"}' -GENRST_EOF - -Compound statements use ``elif`` (rather than ``elsif`` or ``else if``): - -GENRST_INCLUDE_ESCAPED(data/if-chain.sh) - -While and do-while loops -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Miller's ``while`` and ``do-while`` are unsurprising in comparison to various languages, as are ``break`` and ``continue``: - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/while-example-1.sh) - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/while-example-2.sh) - -A ``break`` or ``continue`` within nested conditional blocks or if-statements will, of course, propagate to the innermost loop enclosing them, if any. A ``break`` or ``continue`` outside a loop is a syntax error that will be flagged as soon as the expression is parsed, before any input records are ingested. -The existence of ``while``, ``do-while``, and ``for`` loops in Miller's DSL means that you can create infinite-loop scenarios inadvertently. In particular, please recall that DSL statements are executed once if in ``begin`` or ``end`` blocks, and once *per record* otherwise. For example, **while (NR < 10) will never terminate as NR is only incremented between records**. - -For-loops -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -While Miller's ``while`` and ``do-while`` statements are much as in many other languages, ``for`` loops are more idiosyncratic to Miller. They are loops over key-value pairs, whether in stream records, out-of-stream variables, local variables, or map-literals: more reminiscent of ``foreach``, as in (for example) PHP. There are **for-loops over map keys** and **for-loops over key-value tuples**. Additionally, Miller has a **C-style triple-for loop** with initialize, test, and update statements. - -As with ``while`` and ``do-while``, a ``break`` or ``continue`` within nested control structures will propagate to the innermost loop enclosing them, if any, and a ``break`` or ``continue`` outside a loop is a syntax error that will be flagged as soon as the expression is parsed, before any input records are ingested. - -Key-only for-loops -................................................................ - -The ``key`` variable is always bound to the *key* of key-value pairs: - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/single-for-example-1.sh) - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/single-for-example-2.sh) - -Note that the value corresponding to a given key may be gotten as through a **computed field name** using square brackets as in ``$[key]`` for stream records, or by indexing the looped-over variable using square brackets. - -Key-value for-loops -................................................................ - -Single-level keys may be gotten at using either ``for(k,v)`` or ``for((k),v)``; multi-level keys may be gotten at using ``for((k1,k2,k3),v)`` and so on. The ``v`` variable will be bound to to a scalar value (a string or a number) if the map stops at that level, or to a map-valued variable if the map goes deeper. If the map isn't deep enough then the loop body won't be executed. - -GENRST_RUN_COMMAND -cat data/for-srec-example.tbl -GENRST_EOF - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/for-srec-example-1.sh) - -GENRST_RUN_COMMAND -mlr --from data/small --opprint put 'for (k,v in $*) { $[k."_type"] = typeof(v) }' -GENRST_EOF - -Note that the value of the current field in the for-loop can be gotten either using the bound variable ``value``, or through a **computed field name** using square brackets as in ``$[key]``. - -Important note: to avoid inconsistent looping behavior in case you're setting new fields (and/or unsetting existing ones) while looping over the record, **Miller makes a copy of the record before the loop: loop variables are bound from the copy and all other reads/writes involve the record itself**: - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/for-srec-example-2.sh) - -It can be confusing to modify the stream record while iterating over a copy of it, so instead you might find it simpler to use a local variable in the loop and only update the stream record after the loop: - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/for-srec-example-3.sh) - -You can also start iterating on sub-hashmaps of an out-of-stream or local variable; you can loop over nested keys; you can loop over all out-of-stream variables. The bound variables are bound to a copy of the sub-hashmap as it was before the loop started. The sub-hashmap is specified by square-bracketed indices after ``in``, and additional deeper indices are bound to loop key-variables. The terminal values are bound to the loop value-variable whenever the keys are not too shallow. The value-variable may refer to a terminal (string, number) or it may be map-valued if the map goes deeper. Example indexing is as follows: - -GENRST_INCLUDE_ESCAPED(data/for-oosvar-example-0a.txt) - -That's confusing in the abstract, so a concrete example is in order. Suppose the out-of-stream variable ``@myvar`` is populated as follows: - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/for-oosvar-example-0b.sh) - -Then we can get at various values as follows: - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/for-oosvar-example-0c.sh) - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/for-oosvar-example-0d.sh) - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/for-oosvar-example-0e.sh) - -C-style triple-for loops -................................................................ - -These are supported as follows: - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/triple-for-example-1.sh) - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/triple-for-example-2.sh) - -Notes: - -* In ``for (start; continuation; update) { body }``, the start, continuation, and update statements may be empty, single statements, or multiple comma-separated statements. If the continuation is empty (e.g. ``for(i=1;;i+=1)``) it defaults to true. - -* In particular, you may use ``$``-variables and/or ``@``-variables in the start, continuation, and/or update steps (as well as the body, of course). - -* The typedecls such as ``int`` or ``num`` are optional. If a typedecl is provided (for a local variable), it binds a variable scoped to the for-loop regardless of whether a same-name variable is present in outer scope. If a typedecl is not provided, then the variable is scoped to the for-loop if no same-name variable is present in outer scope, or if a same-name variable is present in outer scope then it is modified. - -* Miller has no ``++`` or ``--`` operators. - -* As with all for/if/while statements in Miller, the curly braces are required even if the body is a single statement, or empty. - -Begin/end blocks -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Miller supports an ``awk``-like ``begin/end`` syntax. The statements in the ``begin`` block are executed before any input records are read; the statements in the ``end`` block are executed after the last input record is read. (If you want to execute some statement at the start of each file, not at the start of the first file as with ``begin``, you might use a pattern/action block of the form ``FNR == 1 { ... }``.) All statements outside of ``begin`` or ``end`` are, of course, executed on every input record. Semicolons separate statements inside or outside of begin/end blocks; semicolons are required between begin/end block bodies and any subsequent statement. For example: - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/begin-end-example-1.sh) - -Since uninitialized out-of-stream variables default to 0 for addition/substraction and 1 for multiplication when they appear on expression right-hand sides (not quite as in ``awk``, where they'd default to 0 either way), the above can be written more succinctly as - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/begin-end-example-2.sh) - -The **put -q** option is a shorthand which suppresses printing of each output record, with only ``emit`` statements being output. So to get only summary outputs, one could write - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/begin-end-example-3.sh) - -We can do similarly with multiple out-of-stream variables: - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/begin-end-example-4.sh) - -This is of course not much different than - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/begin-end-example-5.sh) - -Note that it's a syntax error for begin/end blocks to refer to field names (beginning with ``$``), since these execute outside the context of input records. - diff --git a/docs6/reference-dsl-errors.rst b/docs6/reference-dsl-errors.rst deleted file mode 100644 index def6d8db0..000000000 --- a/docs6/reference-dsl-errors.rst +++ /dev/null @@ -1,27 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -DSL reference: errors and transparency -====================================== - -As soon as you have a programming language, you start having the problem *What is my code doing, and why?* This includes getting syntax errors -- which are always annoying -- as well as the even more annoying problem of a program which parses without syntax error but doesn't do what you expect. - -The ``syntax error`` message is cryptic: it says ``syntax error at `` followed by the next symbol it couldn't parse. This is good, but (as of 5.0.0) it doesn't say things like ``syntax error at line 17, character 22``. Here are some common causes of syntax errors: - -* Don't forget ``;`` at end of line, before another statement on the next line. - -* Miller's DSL lacks the ``++`` and ``--`` operators. - -* Curly braces are required for the bodies of ``if``/``while``/``for`` blocks, even when the body is a single statement. - -Now for transparency: - -* As in any language, you can do (see :ref:`reference-dsl-print-statements`) ``print`` (or ``eprint`` to print to stderr). See also :ref:`reference-dsl-dump-statements` and :ref:`reference-dsl-emit-statements`. - -* The ``-v`` option to ``mlr put`` and ``mlr filter`` prints abstract syntax trees for your code. While not all details here will be of interest to everyone, certainly this makes questions such as operator precedence completely unambiguous. - -* The ``-T`` option prints a trace of each statement executed. - -* The ``-t`` and ``-a`` options show low-level details for the parsing process and for stack-variable-index allocation, respectively. These will likely be of interest to people who enjoy compilers, and probably less useful for a more general audience. - -* Please see :ref:`reference-dsl-type-checking` for type declarations and type-assertions you can use to make sure expressions and the data flowing them are evaluating as you expect. I made them optional because one of Miller's important use-cases is being able to say simple things like ``mlr put '$y = $x + 1' myfile.dat`` with a minimum of punctuational bric-a-brac -- but for programs over a few lines I generally find that the more type-specification, the better. diff --git a/docs6/reference-dsl-errors.rst.in b/docs6/reference-dsl-errors.rst.in deleted file mode 100644 index 080d7fb1a..000000000 --- a/docs6/reference-dsl-errors.rst.in +++ /dev/null @@ -1,24 +0,0 @@ -DSL reference: errors and transparency -====================================== - -As soon as you have a programming language, you start having the problem *What is my code doing, and why?* This includes getting syntax errors -- which are always annoying -- as well as the even more annoying problem of a program which parses without syntax error but doesn't do what you expect. - -The ``syntax error`` message is cryptic: it says ``syntax error at `` followed by the next symbol it couldn't parse. This is good, but (as of 5.0.0) it doesn't say things like ``syntax error at line 17, character 22``. Here are some common causes of syntax errors: - -* Don't forget ``;`` at end of line, before another statement on the next line. - -* Miller's DSL lacks the ``++`` and ``--`` operators. - -* Curly braces are required for the bodies of ``if``/``while``/``for`` blocks, even when the body is a single statement. - -Now for transparency: - -* As in any language, you can do (see :ref:`reference-dsl-print-statements`) ``print`` (or ``eprint`` to print to stderr). See also :ref:`reference-dsl-dump-statements` and :ref:`reference-dsl-emit-statements`. - -* The ``-v`` option to ``mlr put`` and ``mlr filter`` prints abstract syntax trees for your code. While not all details here will be of interest to everyone, certainly this makes questions such as operator precedence completely unambiguous. - -* The ``-T`` option prints a trace of each statement executed. - -* The ``-t`` and ``-a`` options show low-level details for the parsing process and for stack-variable-index allocation, respectively. These will likely be of interest to people who enjoy compilers, and probably less useful for a more general audience. - -* Please see :ref:`reference-dsl-type-checking` for type declarations and type-assertions you can use to make sure expressions and the data flowing them are evaluating as you expect. I made them optional because one of Miller's important use-cases is being able to say simple things like ``mlr put '$y = $x + 1' myfile.dat`` with a minimum of punctuational bric-a-brac -- but for programs over a few lines I generally find that the more type-specification, the better. diff --git a/docs6/reference-dsl-filter-statements.rst b/docs6/reference-dsl-filter-statements.rst deleted file mode 100644 index ae125047a..000000000 --- a/docs6/reference-dsl-filter-statements.rst +++ /dev/null @@ -1,38 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -DSL reference: filter statements -================================================================ - -You can use ``filter`` within ``put``. In fact, the following two are synonymous: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr filter 'NR==2 || NR==3' data/small - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797 - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put 'filter NR==2 || NR==3' data/small - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797 - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776 - -The former, of course, is much easier to type. But the latter allows you to define more complex expressions for the filter, and/or do other things in addition to the filter: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put '@running_sum += $x; filter @running_sum > 1.3' data/small - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776 - a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put '$z = $x * $y; filter $z > 0.3' data/small - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797,z=0.3961455844854848 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729,z=0.4951063394654227 diff --git a/docs6/reference-dsl-filter-statements.rst.in b/docs6/reference-dsl-filter-statements.rst.in deleted file mode 100644 index 9d18c2210..000000000 --- a/docs6/reference-dsl-filter-statements.rst.in +++ /dev/null @@ -1,22 +0,0 @@ -DSL reference: filter statements -================================================================ - -You can use ``filter`` within ``put``. In fact, the following two are synonymous: - -GENRST_RUN_COMMAND -mlr filter 'NR==2 || NR==3' data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put 'filter NR==2 || NR==3' data/small -GENRST_EOF - -The former, of course, is much easier to type. But the latter allows you to define more complex expressions for the filter, and/or do other things in addition to the filter: - -GENRST_RUN_COMMAND -mlr put '@running_sum += $x; filter @running_sum > 1.3' data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put '$z = $x * $y; filter $z > 0.3' data/small -GENRST_EOF diff --git a/docs6/reference-dsl-operators.rst b/docs6/reference-dsl-operators.rst deleted file mode 100644 index 966572bc9..000000000 --- a/docs6/reference-dsl-operators.rst +++ /dev/null @@ -1,45 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -DSL reference: operators -======================== - -Operator precedence -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Operators are listed in order of decreasing precedence, highest first. - -.. code-block:: none - - Operators Associativity - --------- ------------- - () left to right - ** right to left - ! ~ unary+ unary- & right to left - binary* / // % left to right - binary+ binary- . left to right - << >> left to right - & left to right - ^ left to right - | left to right - < <= > >= left to right - == != =~ !=~ left to right - && left to right - ^^ left to right - || left to right - ? : right to left - = N/A for Miller (there is no $a=$b=$c) - -Operator and function semantics -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -* Functions are often pass-throughs straight to the system-standard Go libraries. - -* The ``min`` and ``max`` functions are different from other multi-argument functions which return null if any of their inputs are null: for ``min`` and ``max``, by contrast, if one argument is absent-null, the other is returned. Empty-null loses min or max against numeric or boolean; empty-null is less than any other string. - -* Symmetrically with respect to the bitwise OR, XOR, and AND operators ``|``, ``^``, ``&``, Miller has logical operators ``||``, ``^^``, ``&&``: the logical XOR not existing in Go. - -* The exponentiation operator ``**`` is familiar from many languages. - -* The regex-match and regex-not-match operators ``=~`` and ``!=~`` are similar to those in Ruby and Perl. - diff --git a/docs6/reference-dsl-operators.rst.in b/docs6/reference-dsl-operators.rst.in deleted file mode 100644 index 562069ad7..000000000 --- a/docs6/reference-dsl-operators.rst.in +++ /dev/null @@ -1,42 +0,0 @@ -DSL reference: operators -======================== - -Operator precedence -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Operators are listed in order of decreasing precedence, highest first. - -GENRST_CARDIFY -Operators Associativity ---------- ------------- -() left to right -** right to left -! ~ unary+ unary- & right to left -binary* / // % left to right -binary+ binary- . left to right -<< >> left to right -& left to right -^ left to right -| left to right -< <= > >= left to right -== != =~ !=~ left to right -&& left to right -^^ left to right -|| left to right -? : right to left -= N/A for Miller (there is no $a=$b=$c) -GENRST_EOF - -Operator and function semantics -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -* Functions are often pass-throughs straight to the system-standard Go libraries. - -* The ``min`` and ``max`` functions are different from other multi-argument functions which return null if any of their inputs are null: for ``min`` and ``max``, by contrast, if one argument is absent-null, the other is returned. Empty-null loses min or max against numeric or boolean; empty-null is less than any other string. - -* Symmetrically with respect to the bitwise OR, XOR, and AND operators ``|``, ``^``, ``&``, Miller has logical operators ``||``, ``^^``, ``&&``: the logical XOR not existing in Go. - -* The exponentiation operator ``**`` is familiar from many languages. - -* The regex-match and regex-not-match operators ``=~`` and ``!=~`` are similar to those in Ruby and Perl. - diff --git a/docs6/reference-dsl-output-statements.rst b/docs6/reference-dsl-output-statements.rst deleted file mode 100644 index 6b1603ccb..000000000 --- a/docs6/reference-dsl-output-statements.rst +++ /dev/null @@ -1,583 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -DSL reference: output statements -================================================================ - -You can **output** variable-values or expressions in **five ways**: - -* **Assign** them to stream-record fields. For example, ``$cumulative_sum = @sum``. For another example, ``$nr = NR`` adds a field named ``nr`` to each output record, containing the value of the built-in variable ``NR`` as of when that record was ingested. - -* Use the **print** or **eprint** keywords which immediately print an expression *directly to standard output or standard error*, respectively. Note that ``dump``, ``edump``, ``print``, and ``eprint`` don't output records which participate in ``then``-chaining; rather, they're just immediate prints to stdout/stderr. The ``printn`` and ``eprintn`` keywords are the same except that they don't print final newlines. Additionally, you can print to a specified file instead of stdout/stderr. - -* Use the **dump** or **edump** keywords, which *immediately print all out-of-stream variables as a JSON data structure to the standard output or standard error* (respectively). - -* Use **tee** which formats the current stream record (not just an arbitrary string as with **print**) to a specific file. - -* Use **emit**/**emitp**/**emitf** to send out-of-stream variables' current values to the output record stream, e.g. ``@sum += $x; emit @sum`` which produces an extra output record such as ``sum=3.1648382``. - -For the first two options you are populating the output-records stream which feeds into the next verb in a ``then``-chain (if any), or which otherwise is formatted for output using ``--o...`` flags. - -For the last three options you are sending output directly to standard output, standard error, or a file. - -.. _reference-dsl-print-statements: - -Print statements -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The ``print`` statement is perhaps self-explanatory, but with a few light caveats: - -* There are four variants: ``print`` goes to stdout with final newline, ``printn`` goes to stdout without final newline (you can include one using "\n" in your output string), ``eprint`` goes to stderr with final newline, and ``eprintn`` goes to stderr without final newline. - -* Output goes directly to stdout/stderr, respectively: data produced this way do not go downstream to the next verb in a ``then``-chain. (Use ``emit`` for that.) - -* Print statements are for strings (``print "hello"``), or things which can be made into strings: numbers (``print 3``, ``print $a + $b``, or concatenations thereof (``print "a + b = " . ($a + $b)``). Maps (in ``$*``, map-valued out-of-stream or local variables, and map literals) aren't convertible into strings. If you print a map, you get ``{is-a-map}`` as output. Please use ``dump`` to print maps. - -* You can redirect print output to a file: ``mlr --from myfile.dat put 'print > "tap.txt", $x'`` ``mlr --from myfile.dat put 'o=$*; print > $a.".txt", $x'``. - -* See also :ref:`reference-dsl-redirected-output-statements` for examples. - -.. _reference-dsl-dump-statements: - -Dump statements -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The ``dump`` statement is for printing expressions, including maps, directly to stdout/stderr, respectively: - -* There are two variants: ``dump`` prints to stdout; ``edump`` prints to stderr. - -* Output goes directly to stdout/stderr, respectively: data produced this way do not go downstream to the next verb in a ``then``-chain. (Use ``emit`` for that.) - -* You can use ``dump`` to output single strings, numbers, or expressions including map-valued data. Map-valued data are printed as JSON. Miller allows string and integer keys in its map literals while JSON allows only string keys, so use ``mlr put --jknquoteint`` if you want integer-valued map keys not double-quoted. - -* If you use ``dump`` (or ``edump``) with no arguments, you get a JSON structure representing the current values of all out-of-stream variables. - -* As with ``print``, you can redirect output to files. - -* See also :ref:`reference-dsl-redirected-output-statements` for examples. - -Tee statements -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Records produced by a ``mlr put`` go downstream to the next verb in your ``then``-chain, if any, or otherwise to standard output. If you want to additionally copy out records to files, you can do that using ``tee``. - -The syntax is, by example, ``mlr --from myfile.dat put 'tee > "tap.dat", $*' then sort -n index``. First is ``tee >``, then the filename expression (which can be an expression such as ``"tap.".$a.".dat"``), then a comma, then ``$*``. (Nothing else but ``$*`` is teeable.) - -See also :ref:`reference-dsl-redirected-output-statements` for examples. - -.. _reference-dsl-redirected-output-statements: - -Redirected-output statements -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The **print**, **dump** **tee**, **emitf**, **emit**, and **emitp** keywords all allow you to redirect output to one or more files or pipe-to commands. The filenames/commands are strings which can be constructed using record-dependent values, so you can do things like splitting a table into multiple files, one for each account ID, and so on. - -Details: - -* The ``print`` and ``dump`` keywords produce output immediately to standard output, or to specified file(s) or pipe-to command if present. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr help keyword print - print: prints expression immediately to stdout. - - Example: mlr --from f.dat put -q 'print "The sum of x and y is ".($x+$y)' - Example: mlr --from f.dat put -q 'for (k, v in $*) { print k . " => " . v }' - Example: mlr --from f.dat put '(NR %% 1000 == 0) { print > stderr, "Checkpoint ".NR}' - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr help keyword dump - dump: prints all currently defined out-of-stream variables immediately - to stdout as JSON. - - With >, >>, or |, the data do not become part of the output record stream but - are instead redirected. - - The > and >> are for write and append, as in the shell, but (as with awk) the - file-overwrite for > is on first write, not per record. The | is for piping to - a process which will process the data. There will be one open file for each - distinct file name (for > and >>) or one subordinate process for each distinct - value of the piped-to command (for |). Output-formatting flags are taken from - the main command line. - - Example: mlr --from f.dat put -q '@v[NR]=$*; end { dump }' - Example: mlr --from f.dat put -q '@v[NR]=$*; end { dump > "mytap.dat"}' - Example: mlr --from f.dat put -q '@v[NR]=$*; end { dump >> "mytap.dat"}' - Example: mlr --from f.dat put -q '@v[NR]=$*; end { dump | "jq .[]"}' - -* ``mlr put`` sends the current record (possibly modified by the ``put`` expression) to the output record stream. Records are then input to the following verb in a ``then``-chain (if any), else printed to standard output (unless ``put -q``). The **tee** keyword *additionally* writes the output record to specified file(s) or pipe-to command, or immediately to ``stdout``/``stderr``. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr help keyword tee - tee: prints the current record to specified file. - This is an immediate print to the specified file (except for pprint format - which of course waits until the end of the input stream to format all output). - - The > and >> are for write and append, as in the shell, but (as with awk) the - file-overwrite for > is on first write, not per record. The | is for piping to - a process which will process the data. There will be one open file for each - distinct file name (for > and >>) or one subordinate process for each distinct - value of the piped-to command (for |). Output-formatting flags are taken from - the main command line. - - You can use any of the output-format command-line flags, e.g. --ocsv, --ofs, - etc., to control the format of the output. See also mlr -h. - - emit with redirect and tee with redirect are identical, except tee can only - output $*. - - Example: mlr --from f.dat put 'tee > "/tmp/data-".$a, $*' - Example: mlr --from f.dat put 'tee >> "/tmp/data-".$a.$b, $*' - Example: mlr --from f.dat put 'tee > stderr, $*' - Example: mlr --from f.dat put -q 'tee | "tr \[a-z\\] \[A-Z\\]", $*' - Example: mlr --from f.dat put -q 'tee | "tr \[a-z\\] \[A-Z\\] > /tmp/data-".$a, $*' - Example: mlr --from f.dat put -q 'tee | "gzip > /tmp/data-".$a.".gz", $*' - Example: mlr --from f.dat put -q --ojson 'tee | "gzip > /tmp/data-".$a.".gz", $*' - -* ``mlr put``'s ``emitf``, ``emitp``, and ``emit`` send out-of-stream variables to the output record stream. These are then input to the following verb in a ``then``-chain (if any), else printed to standard output. When redirected with ``>``, ``>>``, or ``|``, they *instead* write the out-of-stream variable(s) to specified file(s) or pipe-to command, or immediately to ``stdout``/``stderr``. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr help keyword emitf - emitf: inserts non-indexed out-of-stream variable(s) side-by-side into the - output record stream. - - With >, >>, or |, the data do not become part of the output record stream but - are instead redirected. - - The > and >> are for write and append, as in the shell, but (as with awk) the - file-overwrite for > is on first write, not per record. The | is for piping to - a process which will process the data. There will be one open file for each - distinct file name (for > and >>) or one subordinate process for each distinct - value of the piped-to command (for |). Output-formatting flags are taken from - the main command line. - - You can use any of the output-format command-line flags, e.g. --ocsv, --ofs, - etc., to control the format of the output if the output is redirected. See also mlr -h. - - Example: mlr --from f.dat put '@a=$i;@b+=$x;@c+=$y; emitf @a' - Example: mlr --from f.dat put --oxtab '@a=$i;@b+=$x;@c+=$y; emitf > "tap-".$i.".dat", @a' - Example: mlr --from f.dat put '@a=$i;@b+=$x;@c+=$y; emitf @a, @b, @c' - Example: mlr --from f.dat put '@a=$i;@b+=$x;@c+=$y; emitf > "mytap.dat", @a, @b, @c' - Example: mlr --from f.dat put '@a=$i;@b+=$x;@c+=$y; emitf >> "mytap.dat", @a, @b, @c' - Example: mlr --from f.dat put '@a=$i;@b+=$x;@c+=$y; emitf > stderr, @a, @b, @c' - Example: mlr --from f.dat put '@a=$i;@b+=$x;@c+=$y; emitf | "grep somepattern", @a, @b, @c' - Example: mlr --from f.dat put '@a=$i;@b+=$x;@c+=$y; emitf | "grep somepattern > mytap.dat", @a, @b, @c' - - Please see https://johnkerl.org/miller6://johnkerl.org/miller/doc for more information. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr help keyword emitp - emitp: inserts an out-of-stream variable into the output record stream. - Hashmap indices present in the data but not slotted by emitp arguments are - output concatenated with ":". - - With >, >>, or |, the data do not become part of the output record stream but - are instead redirected. - - The > and >> are for write and append, as in the shell, but (as with awk) the - file-overwrite for > is on first write, not per record. The | is for piping to - a process which will process the data. There will be one open file for each - distinct file name (for > and >>) or one subordinate process for each distinct - value of the piped-to command (for |). Output-formatting flags are taken from - the main command line. - - You can use any of the output-format command-line flags, e.g. --ocsv, --ofs, - etc., to control the format of the output if the output is redirected. See also mlr -h. - - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp @sums' - Example: mlr --from f.dat put --opprint '@sums[$a][$b]+=$x; emitp > "tap-".$a.$b.".dat", @sums' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp @sums, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp > "mytap.dat", @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp >> "mytap.dat", @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp | "gzip > mytap.dat.gz", @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp > stderr, @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp | "grep somepattern", @*, "index1", "index2"' - - Please see https://johnkerl.org/miller6://johnkerl.org/miller/doc for more information. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr help keyword emit - emit: inserts an out-of-stream variable into the output record stream. Hashmap - indices present in the data but not slotted by emit arguments are not output. - - With >, >>, or |, the data do not become part of the output record stream but - are instead redirected. - - The > and >> are for write and append, as in the shell, but (as with awk) the - file-overwrite for > is on first write, not per record. The | is for piping to - a process which will process the data. There will be one open file for each - distinct file name (for > and >>) or one subordinate process for each distinct - value of the piped-to command (for |). Output-formatting flags are taken from - the main command line. - - You can use any of the output-format command-line flags, e.g. --ocsv, --ofs, - etc., to control the format of the output if the output is redirected. See also mlr -h. - - Example: mlr --from f.dat put 'emit > "/tmp/data-".$a, $*' - Example: mlr --from f.dat put 'emit > "/tmp/data-".$a, mapexcept($*, "a")' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emit @sums' - Example: mlr --from f.dat put --ojson '@sums[$a][$b]+=$x; emit > "tap-".$a.$b.".dat", @sums' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emit @sums, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emit @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emit > "mytap.dat", @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emit >> "mytap.dat", @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emit | "gzip > mytap.dat.gz", @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emit > stderr, @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emit | "grep somepattern", @*, "index1", "index2"' - - Please see https://johnkerl.org/miller6://johnkerl.org/miller/doc for more information. - -.. _reference-dsl-emit-statements: - -Emit statements -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -There are three variants: ``emitf``, ``emit``, and ``emitp``. Keep in mind that out-of-stream variables are a nested, multi-level hashmap (directly viewable as JSON using ``dump``), whereas Miller output records are lists of single-level key-value pairs. The three emit variants allow you to control how the multilevel hashmaps are flatten down to output records. You can emit any map-valued expression, including ``$*``, map-valued out-of-stream variables, the entire out-of-stream-variable collection ``@*``, map-valued local variables, map literals, or map-valued function return values. - -Use **emitf** to output several out-of-stream variables side-by-side in the same output record. For ``emitf`` these mustn't have indexing using ``@name[...]``. Example: - -.. code-block:: none - :emphasize-lines: 1-6 - - mlr put -q ' - @count += 1; - @x_sum += $x; - @y_sum += $y; - end { emitf @count, @x_sum, @y_sum} - ' data/small - count=5,x_sum=2.264761728567491,y_sum=2.585085709781158 - -Use **emit** to output an out-of-stream variable. If it's non-indexed you'll get a simple key-value pair: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/small - a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533 - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797 - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776 - a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put -q '@sum += $x; end { dump }' data/small - { - "sum": 2.264761728567491 - } - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put -q '@sum += $x; end { emit @sum }' data/small - sum=2.264761728567491 - -If it's indexed then use as many names after ``emit`` as there are indices: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put -q '@sum[$a] += $x; end { dump }' data/small - { - "sum": { - "pan": 0.3467901443380824, - "eks": 1.1400793586611044, - "wye": 0.7778922255683036 - } - } - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put -q '@sum[$a] += $x; end { emit @sum, "a" }' data/small - a=pan,sum=0.3467901443380824 - a=eks,sum=1.1400793586611044 - a=wye,sum=0.7778922255683036 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put -q '@sum[$a][$b] += $x; end { dump }' data/small - { - "sum": { - "pan": { - "pan": 0.3467901443380824 - }, - "eks": { - "pan": 0.7586799647899636, - "wye": 0.38139939387114097 - }, - "wye": { - "wye": 0.20460330576630303, - "pan": 0.5732889198020006 - } - } - } - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put -q '@sum[$a][$b] += $x; end { emit @sum, "a", "b" }' data/small - a=pan,b=pan,sum=0.3467901443380824 - a=eks,b=pan,sum=0.7586799647899636 - a=eks,b=wye,sum=0.38139939387114097 - a=wye,b=wye,sum=0.20460330576630303 - a=wye,b=pan,sum=0.5732889198020006 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put -q '@sum[$a][$b][$i] += $x; end { dump }' data/small - { - "sum": { - "pan": { - "pan": { - "1": 0.3467901443380824 - } - }, - "eks": { - "pan": { - "2": 0.7586799647899636 - }, - "wye": { - "4": 0.38139939387114097 - } - }, - "wye": { - "wye": { - "3": 0.20460330576630303 - }, - "pan": { - "5": 0.5732889198020006 - } - } - } - } - -.. code-block:: none - :emphasize-lines: 1-4 - - mlr put -q ' - @sum[$a][$b][$i] += $x; - end { emit @sum, "a", "b", "i" } - ' data/small - a=pan,b=pan,i=1,sum=0.3467901443380824 - a=eks,b=pan,i=2,sum=0.7586799647899636 - a=eks,b=wye,i=4,sum=0.38139939387114097 - a=wye,b=wye,i=3,sum=0.20460330576630303 - a=wye,b=pan,i=5,sum=0.5732889198020006 - -Now for **emitp**: if you have as many names following ``emit`` as there are levels in the out-of-stream variable's hashmap, then ``emit`` and ``emitp`` do the same thing. Where they differ is when you don't specify as many names as there are hashmap levels. In this case, Miller needs to flatten multiple map indices down to output-record keys: ``emitp`` includes full prefixing (hence the ``p`` in ``emitp``) while ``emit`` takes the deepest hashmap key as the output-record key: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put -q '@sum[$a][$b] += $x; end { dump }' data/small - { - "sum": { - "pan": { - "pan": 0.3467901443380824 - }, - "eks": { - "pan": 0.7586799647899636, - "wye": 0.38139939387114097 - }, - "wye": { - "wye": 0.20460330576630303, - "pan": 0.5732889198020006 - } - } - } - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put -q '@sum[$a][$b] += $x; end { emit @sum, "a" }' data/small - a=pan,pan=0.3467901443380824 - a=eks,pan=0.7586799647899636,wye=0.38139939387114097 - a=wye,wye=0.20460330576630303,pan=0.5732889198020006 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put -q '@sum[$a][$b] += $x; end { emit @sum }' data/small - pan.pan=0.3467901443380824,eks.pan=0.7586799647899636,eks.wye=0.38139939387114097,wye.wye=0.20460330576630303,wye.pan=0.5732889198020006 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put -q '@sum[$a][$b] += $x; end { emitp @sum, "a" }' data/small - a=pan,sum.pan=0.3467901443380824 - a=eks,sum.pan=0.7586799647899636,sum.wye=0.38139939387114097 - a=wye,sum.wye=0.20460330576630303,sum.pan=0.5732889198020006 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put -q '@sum[$a][$b] += $x; end { emitp @sum }' data/small - sum.pan.pan=0.3467901443380824,sum.eks.pan=0.7586799647899636,sum.eks.wye=0.38139939387114097,sum.wye.wye=0.20460330576630303,sum.wye.pan=0.5732889198020006 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --oxtab put -q '@sum[$a][$b] += $x; end { emitp @sum }' data/small - sum.pan.pan 0.3467901443380824 - sum.eks.pan 0.7586799647899636 - sum.eks.wye 0.38139939387114097 - sum.wye.wye 0.20460330576630303 - sum.wye.pan 0.5732889198020006 - -Use **--oflatsep** to specify the character which joins multilevel -keys for ``emitp`` (it defaults to a colon): - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put -q --oflatsep / '@sum[$a][$b] += $x; end { emitp @sum, "a" }' data/small - a=pan,sum.pan=0.3467901443380824 - a=eks,sum.pan=0.7586799647899636,sum.wye=0.38139939387114097 - a=wye,sum.wye=0.20460330576630303,sum.pan=0.5732889198020006 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put -q --oflatsep / '@sum[$a][$b] += $x; end { emitp @sum }' data/small - sum.pan.pan=0.3467901443380824,sum.eks.pan=0.7586799647899636,sum.eks.wye=0.38139939387114097,sum.wye.wye=0.20460330576630303,sum.wye.pan=0.5732889198020006 - -.. code-block:: none - :emphasize-lines: 1-4 - - mlr --oxtab put -q --oflatsep / ' - @sum[$a][$b] += $x; - end { emitp @sum } - ' data/small - sum.pan.pan 0.3467901443380824 - sum.eks.pan 0.7586799647899636 - sum.eks.wye 0.38139939387114097 - sum.wye.wye 0.20460330576630303 - sum.wye.pan 0.5732889198020006 - -Multi-emit statements -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -You can emit **multiple map-valued expressions side-by-side** by -including their names in parentheses: - -.. code-block:: none - :emphasize-lines: 1-10 - - mlr --from data/medium --opprint put -q ' - @x_count[$a][$b] += 1; - @x_sum[$a][$b] += $x; - end { - for ((a, b), _ in @x_count) { - @x_mean[a][b] = @x_sum[a][b] / @x_count[a][b] - } - emit (@x_sum, @x_count, @x_mean), "a", "b" - } - ' - a b x_sum x_count x_mean - pan pan 219.1851288316854 427 0.5133141190437597 - pan wye 198.43293070748447 395 0.5023618498923658 - pan eks 216.07522773165525 429 0.5036718595143479 - pan hat 205.22277621488686 417 0.492140950155604 - pan zee 205.09751802331917 413 0.4966041598627583 - eks pan 179.96303047250723 371 0.48507555383425127 - eks wye 196.9452860713734 407 0.4838950517724162 - eks zee 176.8803651584733 357 0.49546320772681596 - eks eks 215.91609712937984 413 0.5227992666570941 - eks hat 208.783170520597 417 0.5006790659966355 - wye wye 185.29584980261419 377 0.49150092785839306 - wye pan 195.84790012056564 392 0.4996119901034838 - wye hat 212.0331829346132 426 0.4977304763723314 - wye zee 194.77404756708714 385 0.5059066170573692 - wye eks 204.8129608356315 386 0.5306035254809106 - zee pan 202.21380378504267 389 0.5198298297816007 - zee wye 233.9913939194868 455 0.5142667998230479 - zee eks 190.9617780631925 391 0.4883932942792647 - zee zee 206.64063510417319 403 0.5127559183726382 - zee hat 191.30000620900935 409 0.46772617655014515 - hat wye 208.8830097609959 423 0.49381326184632596 - hat zee 196.3494502965293 385 0.5099985721987774 - hat eks 189.0067933716193 389 0.48587864619953547 - hat hat 182.8535323148762 381 0.47993053101017374 - hat pan 168.5538067327806 363 0.4643355557376876 - -What this does is walk through the first out-of-stream variable (``@x_sum`` in this example) as usual, then for each keylist found (e.g. ``pan,wye``), include the values for the remaining out-of-stream variables (here, ``@x_count`` and ``@x_mean``). You should use this when all out-of-stream variables in the emit statement have **the same shape and the same keylists**. - -Emit-all statements -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Use **emit all** (or ``emit @*`` which is synonymous) to output all out-of-stream variables. You can use the following idiom to get various accumulators output side-by-side (reminiscent of ``mlr stats1``): - -.. code-block:: none - :emphasize-lines: 1-5 - - mlr --from data/small --opprint put -q ' - @v[$a][$b]["sum"] += $x; - @v[$a][$b]["count"] += 1; - end{emit @*,"a","b"} - ' - a b pan.sum pan.count - v pan 0.3467901443380824 1 - - a b pan.sum pan.count wye.sum wye.count - v eks 0.7586799647899636 1 0.38139939387114097 1 - - a b wye.sum wye.count pan.sum pan.count - v wye 0.20460330576630303 1 0.5732889198020006 1 - -.. code-block:: none - :emphasize-lines: 1-5 - - mlr --from data/small --opprint put -q ' - @sum[$a][$b] += $x; - @count[$a][$b] += 1; - end{emit @*,"a","b"} - ' - a b pan - sum pan 0.3467901443380824 - - a b pan wye - sum eks 0.7586799647899636 0.38139939387114097 - - a b wye pan - sum wye 0.20460330576630303 0.5732889198020006 - - a b pan - count pan 1 - - a b pan wye - count eks 1 1 - - a b wye pan - count wye 1 1 - -.. code-block:: none - :emphasize-lines: 1-5 - - mlr --from data/small --opprint put -q ' - @sum[$a][$b] += $x; - @count[$a][$b] += 1; - end{emit (@sum, @count),"a","b"} - ' - a b sum count - pan pan 0.3467901443380824 1 - eks pan 0.7586799647899636 1 - eks wye 0.38139939387114097 1 - wye wye 0.20460330576630303 1 - wye pan 0.5732889198020006 1 - diff --git a/docs6/reference-dsl-output-statements.rst.in b/docs6/reference-dsl-output-statements.rst.in deleted file mode 100644 index 5855c18c9..000000000 --- a/docs6/reference-dsl-output-statements.rst.in +++ /dev/null @@ -1,247 +0,0 @@ -DSL reference: output statements -================================================================ - -You can **output** variable-values or expressions in **five ways**: - -* **Assign** them to stream-record fields. For example, ``$cumulative_sum = @sum``. For another example, ``$nr = NR`` adds a field named ``nr`` to each output record, containing the value of the built-in variable ``NR`` as of when that record was ingested. - -* Use the **print** or **eprint** keywords which immediately print an expression *directly to standard output or standard error*, respectively. Note that ``dump``, ``edump``, ``print``, and ``eprint`` don't output records which participate in ``then``-chaining; rather, they're just immediate prints to stdout/stderr. The ``printn`` and ``eprintn`` keywords are the same except that they don't print final newlines. Additionally, you can print to a specified file instead of stdout/stderr. - -* Use the **dump** or **edump** keywords, which *immediately print all out-of-stream variables as a JSON data structure to the standard output or standard error* (respectively). - -* Use **tee** which formats the current stream record (not just an arbitrary string as with **print**) to a specific file. - -* Use **emit**/**emitp**/**emitf** to send out-of-stream variables' current values to the output record stream, e.g. ``@sum += $x; emit @sum`` which produces an extra output record such as ``sum=3.1648382``. - -For the first two options you are populating the output-records stream which feeds into the next verb in a ``then``-chain (if any), or which otherwise is formatted for output using ``--o...`` flags. - -For the last three options you are sending output directly to standard output, standard error, or a file. - -.. _reference-dsl-print-statements: - -Print statements -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The ``print`` statement is perhaps self-explanatory, but with a few light caveats: - -* There are four variants: ``print`` goes to stdout with final newline, ``printn`` goes to stdout without final newline (you can include one using "\n" in your output string), ``eprint`` goes to stderr with final newline, and ``eprintn`` goes to stderr without final newline. - -* Output goes directly to stdout/stderr, respectively: data produced this way do not go downstream to the next verb in a ``then``-chain. (Use ``emit`` for that.) - -* Print statements are for strings (``print "hello"``), or things which can be made into strings: numbers (``print 3``, ``print $a + $b``, or concatenations thereof (``print "a + b = " . ($a + $b)``). Maps (in ``$*``, map-valued out-of-stream or local variables, and map literals) aren't convertible into strings. If you print a map, you get ``{is-a-map}`` as output. Please use ``dump`` to print maps. - -* You can redirect print output to a file: ``mlr --from myfile.dat put 'print > "tap.txt", $x'`` ``mlr --from myfile.dat put 'o=$*; print > $a.".txt", $x'``. - -* See also :ref:`reference-dsl-redirected-output-statements` for examples. - -.. _reference-dsl-dump-statements: - -Dump statements -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The ``dump`` statement is for printing expressions, including maps, directly to stdout/stderr, respectively: - -* There are two variants: ``dump`` prints to stdout; ``edump`` prints to stderr. - -* Output goes directly to stdout/stderr, respectively: data produced this way do not go downstream to the next verb in a ``then``-chain. (Use ``emit`` for that.) - -* You can use ``dump`` to output single strings, numbers, or expressions including map-valued data. Map-valued data are printed as JSON. Miller allows string and integer keys in its map literals while JSON allows only string keys, so use ``mlr put --jknquoteint`` if you want integer-valued map keys not double-quoted. - -* If you use ``dump`` (or ``edump``) with no arguments, you get a JSON structure representing the current values of all out-of-stream variables. - -* As with ``print``, you can redirect output to files. - -* See also :ref:`reference-dsl-redirected-output-statements` for examples. - -Tee statements -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Records produced by a ``mlr put`` go downstream to the next verb in your ``then``-chain, if any, or otherwise to standard output. If you want to additionally copy out records to files, you can do that using ``tee``. - -The syntax is, by example, ``mlr --from myfile.dat put 'tee > "tap.dat", $*' then sort -n index``. First is ``tee >``, then the filename expression (which can be an expression such as ``"tap.".$a.".dat"``), then a comma, then ``$*``. (Nothing else but ``$*`` is teeable.) - -See also :ref:`reference-dsl-redirected-output-statements` for examples. - -.. _reference-dsl-redirected-output-statements: - -Redirected-output statements -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The **print**, **dump** **tee**, **emitf**, **emit**, and **emitp** keywords all allow you to redirect output to one or more files or pipe-to commands. The filenames/commands are strings which can be constructed using record-dependent values, so you can do things like splitting a table into multiple files, one for each account ID, and so on. - -Details: - -* The ``print`` and ``dump`` keywords produce output immediately to standard output, or to specified file(s) or pipe-to command if present. - -GENRST_RUN_COMMAND -mlr help keyword print -GENRST_EOF - -GENRST_RUN_COMMAND -mlr help keyword dump -GENRST_EOF - -* ``mlr put`` sends the current record (possibly modified by the ``put`` expression) to the output record stream. Records are then input to the following verb in a ``then``-chain (if any), else printed to standard output (unless ``put -q``). The **tee** keyword *additionally* writes the output record to specified file(s) or pipe-to command, or immediately to ``stdout``/``stderr``. - -GENRST_RUN_COMMAND -mlr help keyword tee -GENRST_EOF - -* ``mlr put``'s ``emitf``, ``emitp``, and ``emit`` send out-of-stream variables to the output record stream. These are then input to the following verb in a ``then``-chain (if any), else printed to standard output. When redirected with ``>``, ``>>``, or ``|``, they *instead* write the out-of-stream variable(s) to specified file(s) or pipe-to command, or immediately to ``stdout``/``stderr``. - -GENRST_RUN_COMMAND -mlr help keyword emitf -GENRST_EOF - -GENRST_RUN_COMMAND -mlr help keyword emitp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr help keyword emit -GENRST_EOF - -.. _reference-dsl-emit-statements: - -Emit statements -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -There are three variants: ``emitf``, ``emit``, and ``emitp``. Keep in mind that out-of-stream variables are a nested, multi-level hashmap (directly viewable as JSON using ``dump``), whereas Miller output records are lists of single-level key-value pairs. The three emit variants allow you to control how the multilevel hashmaps are flatten down to output records. You can emit any map-valued expression, including ``$*``, map-valued out-of-stream variables, the entire out-of-stream-variable collection ``@*``, map-valued local variables, map literals, or map-valued function return values. - -Use **emitf** to output several out-of-stream variables side-by-side in the same output record. For ``emitf`` these mustn't have indexing using ``@name[...]``. Example: - -GENRST_RUN_COMMAND -mlr put -q ' - @count += 1; - @x_sum += $x; - @y_sum += $y; - end { emitf @count, @x_sum, @y_sum} -' data/small -GENRST_EOF - -Use **emit** to output an out-of-stream variable. If it's non-indexed you'll get a simple key-value pair: - -GENRST_RUN_COMMAND -cat data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put -q '@sum += $x; end { dump }' data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put -q '@sum += $x; end { emit @sum }' data/small -GENRST_EOF - -If it's indexed then use as many names after ``emit`` as there are indices: - -GENRST_RUN_COMMAND -mlr put -q '@sum[$a] += $x; end { dump }' data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put -q '@sum[$a] += $x; end { emit @sum, "a" }' data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put -q '@sum[$a][$b] += $x; end { dump }' data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put -q '@sum[$a][$b] += $x; end { emit @sum, "a", "b" }' data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put -q '@sum[$a][$b][$i] += $x; end { dump }' data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put -q ' - @sum[$a][$b][$i] += $x; - end { emit @sum, "a", "b", "i" } -' data/small -GENRST_EOF - -Now for **emitp**: if you have as many names following ``emit`` as there are levels in the out-of-stream variable's hashmap, then ``emit`` and ``emitp`` do the same thing. Where they differ is when you don't specify as many names as there are hashmap levels. In this case, Miller needs to flatten multiple map indices down to output-record keys: ``emitp`` includes full prefixing (hence the ``p`` in ``emitp``) while ``emit`` takes the deepest hashmap key as the output-record key: - -GENRST_RUN_COMMAND -mlr put -q '@sum[$a][$b] += $x; end { dump }' data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put -q '@sum[$a][$b] += $x; end { emit @sum, "a" }' data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put -q '@sum[$a][$b] += $x; end { emit @sum }' data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put -q '@sum[$a][$b] += $x; end { emitp @sum, "a" }' data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put -q '@sum[$a][$b] += $x; end { emitp @sum }' data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --oxtab put -q '@sum[$a][$b] += $x; end { emitp @sum }' data/small -GENRST_EOF - -Use **--oflatsep** to specify the character which joins multilevel -keys for ``emitp`` (it defaults to a colon): - -GENRST_RUN_COMMAND -mlr put -q --oflatsep / '@sum[$a][$b] += $x; end { emitp @sum, "a" }' data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put -q --oflatsep / '@sum[$a][$b] += $x; end { emitp @sum }' data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --oxtab put -q --oflatsep / ' - @sum[$a][$b] += $x; - end { emitp @sum } -' data/small -GENRST_EOF - -Multi-emit statements -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -You can emit **multiple map-valued expressions side-by-side** by -including their names in parentheses: - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/emit-lashed.sh) - -What this does is walk through the first out-of-stream variable (``@x_sum`` in this example) as usual, then for each keylist found (e.g. ``pan,wye``), include the values for the remaining out-of-stream variables (here, ``@x_count`` and ``@x_mean``). You should use this when all out-of-stream variables in the emit statement have **the same shape and the same keylists**. - -Emit-all statements -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Use **emit all** (or ``emit @*`` which is synonymous) to output all out-of-stream variables. You can use the following idiom to get various accumulators output side-by-side (reminiscent of ``mlr stats1``): - -GENRST_RUN_COMMAND -mlr --from data/small --opprint put -q ' - @v[$a][$b]["sum"] += $x; - @v[$a][$b]["count"] += 1; - end{emit @*,"a","b"} -' -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --from data/small --opprint put -q ' - @sum[$a][$b] += $x; - @count[$a][$b] += 1; - end{emit @*,"a","b"} -' -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --from data/small --opprint put -q ' - @sum[$a][$b] += $x; - @count[$a][$b] += 1; - end{emit (@sum, @count),"a","b"} -' -GENRST_EOF - diff --git a/docs6/reference-dsl-syntax.rst b/docs6/reference-dsl-syntax.rst deleted file mode 100644 index 354b1eb00..000000000 --- a/docs6/reference-dsl-syntax.rst +++ /dev/null @@ -1,220 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -DSL reference: syntax -================================================================ - -Expression formatting -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Multiple expressions may be given, separated by semicolons, and each may refer to the ones before: - -.. code-block:: none - :emphasize-lines: 1-1 - - ruby -e '10.times{|i|puts "i=#{i}"}' | mlr --opprint put '$j = $i + 1; $k = $i +$j' - i j k - 0 1 1 - 1 2 3 - 2 3 5 - 3 4 7 - 4 5 9 - 5 6 11 - 6 7 13 - 7 8 15 - 8 9 17 - 9 10 19 - -Newlines within the expression are ignored, which can help increase legibility of complex expressions: - -.. code-block:: none - :emphasize-lines: 1-7 - - mlr --opprint put ' - $nf = NF; - $nr = NR; - $fnr = FNR; - $filenum = FILENUM; - $filename = FILENAME - ' data/small data/small2 - a b i x y nf nr fnr filenum filename - pan pan 1 0.3467901443380824 0.7268028627434533 5 1 1 1 data/small - eks pan 2 0.7586799647899636 0.5221511083334797 5 2 2 1 data/small - wye wye 3 0.20460330576630303 0.33831852551664776 5 3 3 1 data/small - eks wye 4 0.38139939387114097 0.13418874328430463 5 4 4 1 data/small - wye pan 5 0.5732889198020006 0.8636244699032729 5 5 5 1 data/small - pan eks 9999 0.267481232652199086 0.557077185510228001 5 6 1 2 data/small2 - wye eks 10000 0.734806020620654365 0.884788571337605134 5 7 2 2 data/small2 - pan wye 10001 0.870530722602517626 0.009854780514656930 5 8 3 2 data/small2 - hat wye 10002 0.321507044286237609 0.568893318795083758 5 9 4 2 data/small2 - pan zee 10003 0.272054845593895200 0.425789896597056627 5 10 5 2 data/small2 - -.. code-block:: none - :emphasize-lines: 1-3 - - mlr --opprint filter '($x > 0.5 && $y < 0.5) || ($x < 0.5 && $y > 0.5)' \ - then stats2 -a corr -f x,y \ - data/medium - x_y_corr - -0.7479940285189345 - -.. _reference-dsl-expressions-from-files: - -Expressions from files -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The simplest way to enter expressions for ``put`` and ``filter`` is between single quotes on the command line, e.g. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --from data/small put '$xy = sqrt($x**2 + $y**2)' - a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533,xy=0.8052985815845617 - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797,xy=0.9209978658539777 - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776,xy=0.3953756915115773 - a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463,xy=0.40431685157744135 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729,xy=1.036584492737304 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --from data/small put 'func f(a, b) { return sqrt(a**2 + b**2) } $xy = f($x, $y)' - a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533,xy=0.8052985815845617 - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797,xy=0.9209978658539777 - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776,xy=0.3953756915115773 - a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463,xy=0.40431685157744135 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729,xy=1.036584492737304 - -You may, though, find it convenient to put expressions into files for reuse, and read them -**using the -f option**. For example: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/fe-example-3.mlr - func f(a, b) { - return sqrt(a**2 + b**2) - } - $xy = f($x, $y) - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --from data/small put -f data/fe-example-3.mlr - a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533,xy=0.8052985815845617 - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797,xy=0.9209978658539777 - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776,xy=0.3953756915115773 - a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463,xy=0.40431685157744135 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729,xy=1.036584492737304 - -If you have some of the logic in a file and you want to write the rest on the command line, you can **use the -f and -e options together**: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/fe-example-4.mlr - func f(a, b) { - return sqrt(a**2 + b**2) - } - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --from data/small put -f data/fe-example-4.mlr -e '$xy = f($x, $y)' - a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533,xy=0.8052985815845617 - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797,xy=0.9209978658539777 - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776,xy=0.3953756915115773 - a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463,xy=0.40431685157744135 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729,xy=1.036584492737304 - -A suggested use-case here is defining functions in files, and calling them from command-line expressions. - -Another suggested use-case is putting default parameter values in files, e.g. using ``begin{@count=is_present(@count)?@count:10}`` in the file, where you can precede that using ``begin{@count=40}`` using ``-e``. - -Moreover, you can have one or more ``-f`` expressions (maybe one function per file, for example) and one or more ``-e`` expressions on the command line. If you mix ``-f`` and ``-e`` then the expressions are evaluated in the order encountered. (Since the expressions are all simply concatenated together in order, don't forget intervening semicolons: e.g. not ``mlr put -e '$x=1' -e '$y=2 ...'`` but rather ``mlr put -e '$x=1;' -e '$y=2' ...``.) - -Semicolons, commas, newlines, and curly braces -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Miller uses **semicolons as statement separators**, not statement terminators. This means you can write: - -.. code-block:: none - - mlr put 'x=1' - mlr put 'x=1;$y=2' - mlr put 'x=1;$y=2;' - mlr put 'x=1;;;;$y=2;' - -Semicolons are optional after closing curly braces (which close conditionals and loops as discussed below). - -.. code-block:: none - :emphasize-lines: 1-1 - - echo x=1,y=2 | mlr put 'while (NF < 10) { $[NF+1] = ""} $foo = "bar"' - x=1,y=2,3=,4=,5=,6=,7=,8=,9=,10=,foo=bar - -.. code-block:: none - :emphasize-lines: 1-1 - - echo x=1,y=2 | mlr put 'while (NF < 10) { $[NF+1] = ""}; $foo = "bar"' - x=1,y=2,3=,4=,5=,6=,7=,8=,9=,10=,foo=bar - -Semicolons are required between statements even if those statements are on separate lines. **Newlines** are for your convenience but have no syntactic meaning: line endings do not terminate statements. For example, adjacent assignment statements must be separated by semicolons even if those statements are on separate lines: - -.. code-block:: none - - mlr put ' - $x = 1 - $y = 2 # Syntax error - ' - - mlr put ' - $x = 1; - $y = 2 # This is OK - ' - -**Trailing commas** are allowed in function/subroutine definitions, function/subroutine callsites, and map literals. This is intended for (although not restricted to) the multi-line case: - -.. code-block:: none - :emphasize-lines: 1-17 - - mlr --csvlite --from data/a.csv put ' - func f( - num a, - num b, - ): num { - return a**2 + b**2; - } - $* = { - "s": $a + $b, - "t": $a - $b, - "u": f( - $a, - $b, - ), - "v": NR, - } - ' - s,t,u,v - 3,-1,5,1 - 9,-1,41,2 - -Bodies for all compound statements must be enclosed in **curly braces**, even if the body is a single statement: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put 'if ($x == 1) $y = 2' # Syntax error - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put 'if ($x == 1) { $y = 2 }' # This is OK - -Bodies for compound statements may be empty: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put 'if ($x == 1) { }' # This no-op is syntactically acceptable - diff --git a/docs6/reference-dsl-syntax.rst.in b/docs6/reference-dsl-syntax.rst.in deleted file mode 100644 index 3414dd165..000000000 --- a/docs6/reference-dsl-syntax.rst.in +++ /dev/null @@ -1,101 +0,0 @@ -DSL reference: syntax -================================================================ - -Expression formatting -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Multiple expressions may be given, separated by semicolons, and each may refer to the ones before: - -GENRST_RUN_COMMAND -ruby -e '10.times{|i|puts "i=#{i}"}' | mlr --opprint put '$j = $i + 1; $k = $i +$j' -GENRST_EOF - -Newlines within the expression are ignored, which can help increase legibility of complex expressions: - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/put-multiline-example.txt) - -GENRST_RUN_COMMAND -mlr --opprint filter '($x > 0.5 && $y < 0.5) || ($x < 0.5 && $y > 0.5)' \ - then stats2 -a corr -f x,y \ - data/medium -GENRST_EOF - -.. _reference-dsl-expressions-from-files: - -Expressions from files -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The simplest way to enter expressions for ``put`` and ``filter`` is between single quotes on the command line, e.g. - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/fe-example-1.sh) - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/fe-example-2.sh) - -You may, though, find it convenient to put expressions into files for reuse, and read them -**using the -f option**. For example: - -GENRST_RUN_COMMAND -cat data/fe-example-3.mlr -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --from data/small put -f data/fe-example-3.mlr -GENRST_EOF - -If you have some of the logic in a file and you want to write the rest on the command line, you can **use the -f and -e options together**: - -GENRST_RUN_COMMAND -cat data/fe-example-4.mlr -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --from data/small put -f data/fe-example-4.mlr -e '$xy = f($x, $y)' -GENRST_EOF - -A suggested use-case here is defining functions in files, and calling them from command-line expressions. - -Another suggested use-case is putting default parameter values in files, e.g. using ``begin{@count=is_present(@count)?@count:10}`` in the file, where you can precede that using ``begin{@count=40}`` using ``-e``. - -Moreover, you can have one or more ``-f`` expressions (maybe one function per file, for example) and one or more ``-e`` expressions on the command line. If you mix ``-f`` and ``-e`` then the expressions are evaluated in the order encountered. (Since the expressions are all simply concatenated together in order, don't forget intervening semicolons: e.g. not ``mlr put -e '$x=1' -e '$y=2 ...'`` but rather ``mlr put -e '$x=1;' -e '$y=2' ...``.) - -Semicolons, commas, newlines, and curly braces -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Miller uses **semicolons as statement separators**, not statement terminators. This means you can write: - -GENRST_INCLUDE_ESCAPED(data/semicolon-example.txt) - -Semicolons are optional after closing curly braces (which close conditionals and loops as discussed below). - -GENRST_RUN_COMMAND -echo x=1,y=2 | mlr put 'while (NF < 10) { $[NF+1] = ""} $foo = "bar"' -GENRST_EOF - -GENRST_RUN_COMMAND -echo x=1,y=2 | mlr put 'while (NF < 10) { $[NF+1] = ""}; $foo = "bar"' -GENRST_EOF - -Semicolons are required between statements even if those statements are on separate lines. **Newlines** are for your convenience but have no syntactic meaning: line endings do not terminate statements. For example, adjacent assignment statements must be separated by semicolons even if those statements are on separate lines: - -GENRST_INCLUDE_ESCAPED(data/newline-example.txt) - -**Trailing commas** are allowed in function/subroutine definitions, function/subroutine callsites, and map literals. This is intended for (although not restricted to) the multi-line case: - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/trailing-commas.sh) - -Bodies for all compound statements must be enclosed in **curly braces**, even if the body is a single statement: - -GENRST_SHOW_COMMAND -mlr put 'if ($x == 1) $y = 2' # Syntax error -GENRST_EOF - -GENRST_SHOW_COMMAND -mlr put 'if ($x == 1) { $y = 2 }' # This is OK -GENRST_EOF - -Bodies for compound statements may be empty: - -GENRST_SHOW_COMMAND -mlr put 'if ($x == 1) { }' # This no-op is syntactically acceptable -GENRST_EOF - diff --git a/docs6/reference-dsl-unset-statements.rst b/docs6/reference-dsl-unset-statements.rst deleted file mode 100644 index 726474b56..000000000 --- a/docs6/reference-dsl-unset-statements.rst +++ /dev/null @@ -1,83 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -DSL reference: unset statements -================================================================ - -You can clear a map key by assigning the empty string as its value: ``$x=""`` or ``@x=""``. Using ``unset`` you can remove the key entirely. Examples: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/small - a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533 - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797 - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776 - a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put 'unset $x, $a' data/small - b=pan,i=1,y=0.7268028627434533 - b=pan,i=2,y=0.5221511083334797 - b=wye,i=3,y=0.33831852551664776 - b=wye,i=4,y=0.13418874328430463 - b=pan,i=5,y=0.8636244699032729 - -This can also be done, of course, using ``mlr cut -x``. You can also clear out-of-stream or local variables, at the base name level, or at an indexed sublevel: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put -q '@sum[$a][$b] += $x; end { dump; unset @sum; dump }' data/small - { - "sum": { - "pan": { - "pan": 0.3467901443380824 - }, - "eks": { - "pan": 0.7586799647899636, - "wye": 0.38139939387114097 - }, - "wye": { - "wye": 0.20460330576630303, - "pan": 0.5732889198020006 - } - } - } - {} - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put -q '@sum[$a][$b] += $x; end { dump; unset @sum["eks"]; dump }' data/small - { - "sum": { - "pan": { - "pan": 0.3467901443380824 - }, - "eks": { - "pan": 0.7586799647899636, - "wye": 0.38139939387114097 - }, - "wye": { - "wye": 0.20460330576630303, - "pan": 0.5732889198020006 - } - } - } - { - "sum": { - "pan": { - "pan": 0.3467901443380824 - }, - "wye": { - "wye": 0.20460330576630303, - "pan": 0.5732889198020006 - } - } - } - -If you use ``unset all`` (or ``unset @*`` which is synonymous), that will unset all out-of-stream variables which have been defined up to that point. diff --git a/docs6/reference-dsl-unset-statements.rst.in b/docs6/reference-dsl-unset-statements.rst.in deleted file mode 100644 index bb6c83555..000000000 --- a/docs6/reference-dsl-unset-statements.rst.in +++ /dev/null @@ -1,24 +0,0 @@ -DSL reference: unset statements -================================================================ - -You can clear a map key by assigning the empty string as its value: ``$x=""`` or ``@x=""``. Using ``unset`` you can remove the key entirely. Examples: - -GENRST_RUN_COMMAND -cat data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put 'unset $x, $a' data/small -GENRST_EOF - -This can also be done, of course, using ``mlr cut -x``. You can also clear out-of-stream or local variables, at the base name level, or at an indexed sublevel: - -GENRST_RUN_COMMAND -mlr put -q '@sum[$a][$b] += $x; end { dump; unset @sum; dump }' data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put -q '@sum[$a][$b] += $x; end { dump; unset @sum["eks"]; dump }' data/small -GENRST_EOF - -If you use ``unset all`` (or ``unset @*`` which is synonymous), that will unset all out-of-stream variables which have been defined up to that point. diff --git a/docs6/reference-dsl-user-defined-functions.rst b/docs6/reference-dsl-user-defined-functions.rst deleted file mode 100644 index 52c37de4a..000000000 --- a/docs6/reference-dsl-user-defined-functions.rst +++ /dev/null @@ -1,110 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -DSL reference: user-defined functions -===================================== - -As of Miller 5.0.0 you can define your own functions, as well as subroutines. - -User-defined functions -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Here's the obligatory example of a recursive function to compute the factorial function: - -.. code-block:: none - :emphasize-lines: 1-14 - - mlr --opprint --from data/small put ' - func f(n) { - if (is_numeric(n)) { - if (n > 0) { - return n * f(n-1); - } else { - return 1; - } - } - # implicitly return absent-null if non-numeric - } - $ox = f($x + NR); - $oi = f($i); - ' - a b i x y ox oi - pan pan 1 0.3467901443380824 0.7268028627434533 0.46705354854811026 1 - eks pan 2 0.7586799647899636 0.5221511083334797 3.680838410072862 2 - wye wye 3 0.20460330576630303 0.33831852551664776 1.7412511955594865 6 - eks wye 4 0.38139939387114097 0.13418874328430463 18.588348778962008 24 - wye pan 5 0.5732889198020006 0.8636244699032729 211.38730958519247 120 - -Properties of user-defined functions: - -* Function bodies start with ``func`` and a parameter list, defined outside of ``begin``, ``end``, or other ``func`` or ``subr`` blocks. (I.e. the Miller DSL has no nested functions.) - -* A function (uniqified by its name) may not be redefined: either by redefining a user-defined function, or by redefining a built-in function. However, functions and subroutines have separate namespaces: you can define a subroutine ``log`` which does not clash with the mathematical ``log`` function. - -* Functions may be defined either before or after use (there is an object-binding/linkage step at startup). More specifically, functions may be either recursive or mutually recursive. Functions may not call subroutines. - -* Functions may be defined and called either within ``mlr put`` or ``mlr put``. - -* Functions have read access to ``$``-variables and ``@``-variables but may not modify them. See also :ref:`cookbook-memoization-with-oosvars` for an example. - -* Argument values may be reassigned: they are not read-only. - -* When a return value is not implicitly returned, this results in a return value of absent-null. (In the example above, if there were records for which the argument to ``f`` is non-numeric, the assignments would be skipped.) See also the section on :doc:`reference-main-null-data`. - -* See the section on :ref:`reference-dsl-local-variables` for information on scope and extent of arguments, as well as for information on the use of local variables within functions. - -* See the section on :ref:`reference-dsl-expressions-from-files` for information on the use of ``-f`` and ``-e`` flags. - -User-defined subroutines -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Example: - -.. code-block:: none - :emphasize-lines: 1-17 - - mlr --opprint --from data/small put -q ' - begin { - @call_count = 0; - } - subr s(n) { - @call_count += 1; - if (is_numeric(n)) { - if (n > 1) { - call s(n-1); - } else { - print "numcalls=" . @call_count; - } - } - } - print "NR=" . NR; - call s(NR); - ' - NR=1 - numcalls=1 - NR=2 - numcalls=3 - NR=3 - numcalls=6 - NR=4 - numcalls=10 - NR=5 - numcalls=15 - -Properties of user-defined subroutines: - -* Subroutine bodies start with ``subr`` and a parameter list, defined outside of ``begin``, ``end``, or other ``func`` or ``subr`` blocks. (I.e. the Miller DSL has no nested subroutines.) - -* A subroutine (uniqified by its name) may not be redefined. However, functions and subroutines have separate namespaces: you can define a subroutine ``log`` which does not clash with the mathematical ``log`` function. - -* Subroutines may be defined either before or after use (there is an object-binding/linkage step at startup). More specifically, subroutines may be either recursive or mutually recursive. Subroutines may call functions. - -* Subroutines may be defined and called either within ``mlr put`` or ``mlr put``. - -* Subroutines have read/write access to ``$``-variables and ``@``-variables. - -* Argument values may be reassigned: they are not read-only. - -* See the section on :ref:`reference-dsl-local-variables` for information on scope and extent of arguments, as well as for information on the use of local variables within functions. - -* See the section on :ref:`reference-dsl-expressions-from-files` for information on the use of ``-f`` and ``-e`` flags. diff --git a/docs6/reference-dsl-user-defined-functions.rst.in b/docs6/reference-dsl-user-defined-functions.rst.in deleted file mode 100644 index f204ab4fa..000000000 --- a/docs6/reference-dsl-user-defined-functions.rst.in +++ /dev/null @@ -1,56 +0,0 @@ -DSL reference: user-defined functions -===================================== - -As of Miller 5.0.0 you can define your own functions, as well as subroutines. - -User-defined functions -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Here's the obligatory example of a recursive function to compute the factorial function: - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/factorial-example.sh) - -Properties of user-defined functions: - -* Function bodies start with ``func`` and a parameter list, defined outside of ``begin``, ``end``, or other ``func`` or ``subr`` blocks. (I.e. the Miller DSL has no nested functions.) - -* A function (uniqified by its name) may not be redefined: either by redefining a user-defined function, or by redefining a built-in function. However, functions and subroutines have separate namespaces: you can define a subroutine ``log`` which does not clash with the mathematical ``log`` function. - -* Functions may be defined either before or after use (there is an object-binding/linkage step at startup). More specifically, functions may be either recursive or mutually recursive. Functions may not call subroutines. - -* Functions may be defined and called either within ``mlr put`` or ``mlr put``. - -* Functions have read access to ``$``-variables and ``@``-variables but may not modify them. See also :ref:`cookbook-memoization-with-oosvars` for an example. - -* Argument values may be reassigned: they are not read-only. - -* When a return value is not implicitly returned, this results in a return value of absent-null. (In the example above, if there were records for which the argument to ``f`` is non-numeric, the assignments would be skipped.) See also the section on :doc:`reference-main-null-data`. - -* See the section on :ref:`reference-dsl-local-variables` for information on scope and extent of arguments, as well as for information on the use of local variables within functions. - -* See the section on :ref:`reference-dsl-expressions-from-files` for information on the use of ``-f`` and ``-e`` flags. - -User-defined subroutines -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Example: - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/subr-example.sh) - -Properties of user-defined subroutines: - -* Subroutine bodies start with ``subr`` and a parameter list, defined outside of ``begin``, ``end``, or other ``func`` or ``subr`` blocks. (I.e. the Miller DSL has no nested subroutines.) - -* A subroutine (uniqified by its name) may not be redefined. However, functions and subroutines have separate namespaces: you can define a subroutine ``log`` which does not clash with the mathematical ``log`` function. - -* Subroutines may be defined either before or after use (there is an object-binding/linkage step at startup). More specifically, subroutines may be either recursive or mutually recursive. Subroutines may call functions. - -* Subroutines may be defined and called either within ``mlr put`` or ``mlr put``. - -* Subroutines have read/write access to ``$``-variables and ``@``-variables. - -* Argument values may be reassigned: they are not read-only. - -* See the section on :ref:`reference-dsl-local-variables` for information on scope and extent of arguments, as well as for information on the use of local variables within functions. - -* See the section on :ref:`reference-dsl-expressions-from-files` for information on the use of ``-f`` and ``-e`` flags. diff --git a/docs6/reference-dsl-variables.rst b/docs6/reference-dsl-variables.rst deleted file mode 100644 index 1903103dd..000000000 --- a/docs6/reference-dsl-variables.rst +++ /dev/null @@ -1,1118 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -DSL reference: variables -================================================================ - -Miller has the following kinds of variables: - -**Built-in variables** such as ``NF``, ``NF``, ``FILENAME``, ``M_PI``, and ``M_E``. These are all capital letters and are read-only (although some of them change value from one record to another). - -**Fields of stream records**, accessed using the ``$`` prefix. These refer to fields of the current data-stream record. For example, in ``echo x=1,y=2 | mlr put '$z = $x + $y'``, ``$x`` and ``$y`` refer to input fields, and ``$z`` refers to a new, computed output field. In a few contexts, presented below, you can refer to the entire record as ``$*``. - -**Out-of-stream variables** accessed using the ``@`` prefix. These refer to data which persist from one record to the next, including in ``begin`` and ``end`` blocks (which execute before/after the record stream is consumed, respectively). You use them to remember values across records, such as sums, differences, counters, and so on. In a few contexts, presented below, you can refer to the entire out-of-stream-variables collection as ``@*``. - -**Local variables** are limited in scope and extent to the current statements being executed: these include function arguments, bound variables in for loops, and explicitly declared local variables. - -**Keywords** are not variables, but since their names are reserved, you cannot use these names for local variables. - -Built-in variables -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -These are written all in capital letters, such as ``NR``, ``NF``, ``FILENAME``, and only a small, specific set of them is defined by Miller. - -Namely, Miller supports the following five built-in variables for :doc:`filter and put `, all ``awk``-inspired: ``NF``, ``NR``, ``FNR``, ``FILENUM``, and ``FILENAME``, as well as the mathematical constants ``M_PI`` and ``M_E``. Lastly, the ``ENV`` hashmap allows read access to environment variables, e.g. ``ENV["HOME"]`` or ``ENV["foo_".$hostname]``. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr filter 'FNR == 2' data/small* - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797 - 1=pan,2=pan,3=1,4=0.3467901443380824,5=0.7268028627434533 - a=wye,b=eks,i=10000,x=0.734806020620654365,y=0.884788571337605134 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put '$fnr = FNR' data/small* - a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533,fnr=1 - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797,fnr=2 - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776,fnr=3 - a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463,fnr=4 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729,fnr=5 - 1=a,2=b,3=i,4=x,5=y,fnr=1 - 1=pan,2=pan,3=1,4=0.3467901443380824,5=0.7268028627434533,fnr=2 - 1=eks,2=pan,3=2,4=0.7586799647899636,5=0.5221511083334797,fnr=3 - 1=wye,2=wye,3=3,4=0.20460330576630303,5=0.33831852551664776,fnr=4 - 1=eks,2=wye,3=4,4=0.38139939387114097,5=0.13418874328430463,fnr=5 - 1=wye,2=pan,3=5,4=0.5732889198020006,5=0.8636244699032729,fnr=6 - a=pan,b=eks,i=9999,x=0.267481232652199086,y=0.557077185510228001,fnr=1 - a=wye,b=eks,i=10000,x=0.734806020620654365,y=0.884788571337605134,fnr=2 - a=pan,b=wye,i=10001,x=0.870530722602517626,y=0.009854780514656930,fnr=3 - a=hat,b=wye,i=10002,x=0.321507044286237609,y=0.568893318795083758,fnr=4 - a=pan,b=zee,i=10003,x=0.272054845593895200,y=0.425789896597056627,fnr=5 - -Their values of ``NF``, ``NR``, ``FNR``, ``FILENUM``, and ``FILENAME`` change from one record to the next as Miller scans through your input data stream. The mathematical constants, of course, do not change; ``ENV`` is populated from the system environment variables at the time Miller starts and is read-only for the remainder of program execution. - -Their **scope is global**: you can refer to them in any ``filter`` or ``put`` statement. Their values are assigned by the input-record reader: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv put '$nr = NR' data/a.csv - a,b,c,nr - 1,2,3,1 - 4,5,6,2 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv repeat -n 3 then put '$nr = NR' data/a.csv - a,b,c,nr - 1,2,3,1 - 1,2,3,1 - 1,2,3,1 - 4,5,6,2 - 4,5,6,2 - 4,5,6,2 - -The **extent** is for the duration of the put/filter: in a ``begin`` statement (which executes before the first input record is consumed) you will find ``NR=1`` and in an ``end`` statement (which is executed after the last input record is consumed) you will find ``NR`` to be the total number of records ingested. - -These are all **read-only** for the ``mlr put`` and ``mlr filter`` DSLs: they may be assigned from, e.g. ``$nr=NR``, but they may not be assigned to: ``NR=100`` is a syntax error. - -Field names -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Names of fields within stream records must be specified using a ``$`` in :doc:`filter and put expressions `, even though the dollar signs don't appear in the data stream itself. For integer-indexed data, this looks like ``awk``'s ``$1,$2,$3``, except that Miller allows non-numeric names such as ``$quantity`` or ``$hostname``. Likewise, enclose string literals in double quotes in ``filter`` expressions even though they don't appear in file data. In particular, ``mlr filter '$x=="abc"'`` passes through the record ``x=abc``. - -If field names have **special characters** such as ``.`` then you can use braces, e.g. ``'${field.name}'``. - -You may also use a **computed field name** in square brackets, e.g. - -.. code-block:: none - :emphasize-lines: 1-1 - - echo a=3,b=4 | mlr filter '$["x"] < 0.5' - -.. code-block:: none - :emphasize-lines: 1-1 - - echo s=green,t=blue,a=3,b=4 | mlr put '$[$s."_".$t] = $a * $b' - s=green,t=blue,a=3,b=4,green_blue=12 - -Notes: - -The names of record fields depend on the contents of your input data stream, and their values change from one record to the next as Miller scans through your input data stream. - -Their **extent** is limited to the current record; their **scope** is the ``filter`` or ``put`` command in which they appear. - -These are **read-write**: you can do ``$y=2*$x``, ``$x=$x+1``, etc. - -Records are Miller's output: field names present in the input stream are passed through to output (written to standard output) unless fields are removed with ``cut``, or records are excluded with ``filter`` or ``put -q``, etc. Simply assign a value to a field and it will be output. - -Positional field names -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Even though Miller's main selling point is name-indexing, sometimes you really want to refer to a field name by its positional index (starting from 1). - -Use ``$[[3]]`` to access the name of field 3. More generally, any expression evaluating to an integer can go between ``$[[`` and ``]]``. - -Then using a computed field name, ``$[ $[[3]] ]`` is the value in the third field. This has the shorter equivalent notation ``$[[[3]]]``. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr cat data/small - a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533 - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797 - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776 - a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put '$[[3]] = "NEW"' data/small - a=pan,b=pan,NEW=1,x=0.3467901443380824,y=0.7268028627434533 - a=eks,b=pan,NEW=2,x=0.7586799647899636,y=0.5221511083334797 - a=wye,b=wye,NEW=3,x=0.20460330576630303,y=0.33831852551664776 - a=eks,b=wye,NEW=4,x=0.38139939387114097,y=0.13418874328430463 - a=wye,b=pan,NEW=5,x=0.5732889198020006,y=0.8636244699032729 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put '$[[[3]]] = "NEW"' data/small - a=pan,b=pan,i=NEW,x=0.3467901443380824,y=0.7268028627434533 - a=eks,b=pan,i=NEW,x=0.7586799647899636,y=0.5221511083334797 - a=wye,b=wye,i=NEW,x=0.20460330576630303,y=0.33831852551664776 - a=eks,b=wye,i=NEW,x=0.38139939387114097,y=0.13418874328430463 - a=wye,b=pan,i=NEW,x=0.5732889198020006,y=0.8636244699032729 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put '$NEW = $[[NR]]' data/small - a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533,NEW=a - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797,NEW=b - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776,NEW=i - a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463,NEW=x - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729,NEW=y - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put '$NEW = $[[[NR]]]' data/small - a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533,NEW=pan - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797,NEW=pan - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776,NEW=3 - a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463,NEW=0.38139939387114097 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729,NEW=0.8636244699032729 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put '$[[[NR]]] = "NEW"' data/small - a=NEW,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533 - a=eks,b=NEW,i=2,x=0.7586799647899636,y=0.5221511083334797 - a=wye,b=wye,i=NEW,x=0.20460330576630303,y=0.33831852551664776 - a=eks,b=wye,i=4,x=NEW,y=0.13418874328430463 - a=wye,b=pan,i=5,x=0.5732889198020006,y=NEW - -Right-hand side accesses to non-existent fields -- i.e. with index less than 1 or greater than ``NF`` -- return an absent value. Likewise, left-hand side accesses only refer to fields which already exist. For example, if a field has 5 records then assigning the name or value of the 6th (or 600th) field results in a no-op. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put '$[[6]] = "NEW"' data/small - a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533 - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797 - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776 - a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put '$[[[6]]] = "NEW"' data/small - a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533 - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797 - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776 - a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729 - -Out-of-stream variables -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -These are prefixed with an at-sign, e.g. ``@sum``. Furthermore, unlike built-in variables and stream-record fields, they are maintained in an arbitrarily nested hashmap: you can do ``@sum += $quanity``, or ``@sum[$color] += $quanity``, or ``@sum[$color][$shape] += $quanity``. The keys for the multi-level hashmap can be any expression which evaluates to string or integer: e.g. ``@sum[NR] = $a + $b``, ``@sum[$a."-".$b] = $x``, etc. - -Their names and their values are entirely under your control; they change only when you assign to them. - -Just as for field names in stream records, if you want to define out-of-stream variables with **special characters** such as ``.`` then you can use braces, e.g. ``'@{variable.name}["index"]'``. - -You may use a **computed key** in square brackets, e.g. - -.. code-block:: none - :emphasize-lines: 1-1 - - echo s=green,t=blue,a=3,b=4 | mlr put -q '@[$s."_".$t] = $a * $b; emit all' - green_blue=12 - -Out-of-stream variables are **scoped** to the ``put`` command in which they appear. In particular, if you have two or more ``put`` commands separated by ``then``, each put will have its own set of out-of-stream variables: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/a.dkvp - a=1,b=2,c=3 - a=4,b=5,c=6 - -.. code-block:: none - :emphasize-lines: 1-3 - - mlr put '@sum += $a; end {emit @sum}' \ - then put 'is_present($a) {$a=10*$a; @sum += $a}; end {emit @sum}' \ - data/a.dkvp - a=10,b=2,c=3 - a=40,b=5,c=6 - sum=5 - sum=50 - -Out-of-stream variables' **extent** is from the start to the end of the record stream, i.e. every time the ``put`` or ``filter`` statement referring to them is executed. - -Out-of-stream variables are **read-write**: you can do ``$sum=@sum``, ``@sum=$sum``, etc. - -Indexed out-of-stream variables -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Using an index on the ``@count`` and ``@sum`` variables, we get the benefit of the ``-g`` (group-by) option which ``mlr stats1`` and various other Miller commands have: - -.. code-block:: none - :emphasize-lines: 1-8 - - mlr put -q ' - @x_count[$a] += 1; - @x_sum[$a] += $x; - end { - emit @x_count, "a"; - emit @x_sum, "a"; - } - ' ../data/small - a=pan,x_count=2 - a=eks,x_count=3 - a=wye,x_count=2 - a=zee,x_count=2 - a=hat,x_count=1 - a=pan,x_sum=0.8494161498792961 - a=eks,x_sum=1.75186341922895 - a=wye,x_sum=0.7778922255683036 - a=zee,x_sum=1.1256801691982772 - a=hat,x_sum=0.03144187646093577 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr stats1 -a count,sum -f x -g a ../data/small - a=pan,x_count=2,x_sum=0.8494161498792961 - a=eks,x_count=3,x_sum=1.75186341922895 - a=wye,x_count=2,x_sum=0.7778922255683036 - a=zee,x_count=2,x_sum=1.1256801691982772 - a=hat,x_count=1,x_sum=0.03144187646093577 - -Indices can be arbitrarily deep -- here there are two or more of them: - -.. code-block:: none - :emphasize-lines: 1-7 - - mlr --from data/medium put -q ' - @x_count[$a][$b] += 1; - @x_sum[$a][$b] += $x; - end { - emit (@x_count, @x_sum), "a", "b"; - } - ' - a=pan,b=pan,x_count=427,x_sum=219.1851288316854 - a=pan,b=wye,x_count=395,x_sum=198.43293070748447 - a=pan,b=eks,x_count=429,x_sum=216.07522773165525 - a=pan,b=hat,x_count=417,x_sum=205.22277621488686 - a=pan,b=zee,x_count=413,x_sum=205.09751802331917 - a=eks,b=pan,x_count=371,x_sum=179.96303047250723 - a=eks,b=wye,x_count=407,x_sum=196.9452860713734 - a=eks,b=zee,x_count=357,x_sum=176.8803651584733 - a=eks,b=eks,x_count=413,x_sum=215.91609712937984 - a=eks,b=hat,x_count=417,x_sum=208.783170520597 - a=wye,b=wye,x_count=377,x_sum=185.29584980261419 - a=wye,b=pan,x_count=392,x_sum=195.84790012056564 - a=wye,b=hat,x_count=426,x_sum=212.0331829346132 - a=wye,b=zee,x_count=385,x_sum=194.77404756708714 - a=wye,b=eks,x_count=386,x_sum=204.8129608356315 - a=zee,b=pan,x_count=389,x_sum=202.21380378504267 - a=zee,b=wye,x_count=455,x_sum=233.9913939194868 - a=zee,b=eks,x_count=391,x_sum=190.9617780631925 - a=zee,b=zee,x_count=403,x_sum=206.64063510417319 - a=zee,b=hat,x_count=409,x_sum=191.30000620900935 - a=hat,b=wye,x_count=423,x_sum=208.8830097609959 - a=hat,b=zee,x_count=385,x_sum=196.3494502965293 - a=hat,b=eks,x_count=389,x_sum=189.0067933716193 - a=hat,b=hat,x_count=381,x_sum=182.8535323148762 - a=hat,b=pan,x_count=363,x_sum=168.5538067327806 - -The idea is that ``stats1``, and other Miller verbs, encapsulate frequently-used patterns with a minimum of keystroking (and run a little faster), whereas using out-of-stream variables you have more flexibility and control in what you do. - -Begin/end blocks can be mixed with pattern/action blocks. For example: - -.. code-block:: none - :emphasize-lines: 1-14 - - mlr put ' - begin { - @num_total = 0; - @num_positive = 0; - }; - @num_total += 1; - $x > 0.0 { - @num_positive += 1; - $y = log10($x); $z = sqrt($y) - }; - end { - emitf @num_total, @num_positive - } - ' data/put-gating-example-1.dkvp - x=-1 - x=0 - x=1,y=0,z=0 - x=2,y=0.3010299956639812,z=0.5486620049392715 - x=3,y=0.4771212547196624,z=0.6907396432228734 - num_total=5,num_positive=3 - -.. _reference-dsl-local-variables: - -Local variables -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Local variables are similar to out-of-stream variables, except that their extent is limited to the expressions in which they appear (and their basenames can't be computed using square brackets). There are three kinds of local variables: **arguments** to functions/subroutines, **variables bound within for-loops**, and **locals** defined within control blocks. They may be untyped using ``var``, or typed using ``num``, ``int``, ``float``, ``str``, ``bool``, and ``map``. - -For example: - -.. code-block:: none - :emphasize-lines: 1-16 - - # Here I'm using a specified random-number seed so this example always - # produces the same output for this web document: in everyday practice we - # would leave off the --seed 12345 part. - mlr --seed 12345 seqgen --start 1 --stop 10 then put ' - func f(a, b) { # function arguments a and b - r = 0.0; # local r scoped to the function - for (int i = 0; i < 6; i += 1) { # local i scoped to the for-loop - num u = urand(); # local u scoped to the for-loop - r += u; # updates r from the enclosing scope - } - r /= 6; - return a + (b - a) * r; - } - num o = f(10, 20); # local to the top-level scope - $o = o; - ' - i=1,o=15.952526011537227 - i=2,o=12.782237754999116 - i=3,o=15.126606630220966 - i=4,o=14.794357488895775 - i=5,o=15.168665974047421 - i=6,o=16.20662783079942 - i=7,o=13.966128063060479 - i=8,o=13.99248245928659 - i=9,o=15.784270485515197 - i=10,o=15.37686787628025 - -Things which are completely unsurprising, resembling many other languages: - -* Parameter names are bound to their arguments but can be reassigned, e.g. if there is a parameter named ``a`` then you can reassign the value of ``a`` to be something else within the function if you like. - -* However, you cannot redeclare the *type* of an argument or a local: ``var a=1; var a=2`` is an error but ``var a=1; a=2`` is OK. - -* All argument-passing is positional rather than by name; arguments are passed by value, not by reference. (This is also true for map-valued variables: they are not, and cannot be, passed by reference) - -* You can define locals (using ``var``, ``num``, etc.) at any scope (if-statements, else-statements, while-loops, for-loops, or the top-level scope), and nested scopes will have access (more details on scope in the next section). If you define a local variable with the same name inside an inner scope, then a new variable is created with the narrower scope. - -* If you assign to a local variable for the first time in a scope without declaring it as ``var``, ``num``, etc. then: if it exists in an outer scope, that outer-scope variable will be updated; if not, it will be defined in the current scope as if ``var`` had been used. (See also :ref:`reference-dsl-type-checking` for an example.) I recommend always declaring variables explicitly to make the intended scoping clear. - -* Functions and subroutines never have access to locals from their callee (unless passed by value as arguments). - -Things which are perhaps surprising compared to other languages: - -* Type declarations using ``var``, or typed using ``num``, ``int``, ``float``, ``str``, and ``bool`` are necessary to declare local variables. Function arguments and variables bound in for-loops over stream records and out-of-stream variables are *implicitly* declared using ``var``. (Some examples are shown below.) - -* Type-checking is done at assignment time. For example, ``float f = 0`` is an error (since ``0`` is an integer), as is ``float f = 0.0; f = 1``. For this reason I prefer to use ``num`` over ``float`` in most contexts since ``num`` encompasses integer and floating-point values. More information about type-checking is at :ref:`reference-dsl-type-checking`. - -* Bound variables in for-loops over stream records and out-of-stream variables are implicitly local to that block. E.g. in ``for (k, v in $*) { ... }`` ``for ((k1, k2), v in @*) { ... }`` if there are ``k``, ``v``, etc. in the enclosing scope then those will be masked by the loop-local bound variables in the loop, and moreover the values of the loop-local bound variables are not available after the end of the loop. - -* For C-style triple-for loops, if a for-loop variable is defined using ``var``, ``int``, etc. then it is scoped to that for-loop. E.g. ``for (i = 0; i < 10; i += 1) { ... }`` and ``for (int i = 0; i < 10; i += 1) { ... }``. (This is unsurprising.). If there is no typedecl and an outer-scope variable of that name exists, then it is used. (This is also unsurprising.) But of there is no outer-scope variable of that name then the variable is scoped to the for-loop only. - -The following example demonstrates the scope rules: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/scope-example.mlr - func f(a) { # argument is local to the function - var b = 100; # local to the function - c = 100; # local to the function; does not overwrite outer c - return a + 1; - } - var a = 10; # local at top level - var b = 20; # local at top level - c = 30; # local at top level; there is no more-outer-scope c - if (NR == 3) { - var a = 40; # scoped to the if-statement; doesn't overwrite outer a - b = 50; # not scoped to the if-statement; overwrites outer b - c = 60; # not scoped to the if-statement; overwrites outer c - d = 70; # there is no outer d so a local d is created here - - $inner_a = a; - $inner_b = b; - $inner_c = c; - $inner_d = d; - } - $outer_a = a; - $outer_b = b; - $outer_c = c; - $outer_d = d; # there is no outer d defined so no assignment happens - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/scope-example.dat - n=1,x=123 - n=2,x=456 - n=3,x=789 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --oxtab --from data/scope-example.dat put -f data/scope-example.mlr - n 1 - x 123 - outer_a 10 - outer_b 20 - outer_c 30 - - n 2 - x 456 - outer_a 10 - outer_b 20 - outer_c 30 - - n 3 - x 789 - inner_a 40 - inner_b 50 - inner_c 60 - inner_d 70 - outer_a 10 - outer_b 50 - outer_c 60 - -And this example demonstrates the type-declaration rules: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/type-decl-example.mlr - subr s(a, str b, int c) { # a is implicitly var (untyped). - # b is explicitly str. - # c is explicitly int. - # The type-checking is done at the callsite - # when arguments are bound to parameters. - # - var b = 100; # error # Re-declaration in the same scope is disallowed. - int n = 10; # Declaration of variable local to the subroutine. - n = 20; # Assignment is OK. - int n = 30; # error # Re-declaration in the same scope is disallowed. - str n = "abc"; # error # Re-declaration in the same scope is disallowed. - # - float f1 = 1; # error # 1 is an int, not a float. - float f2 = 2.0; # 2.0 is a float. - num f3 = 3; # 3 is a num. - num f4 = 4.0; # 4.0 is a num. - } # - # - call s(1, 2, 3); # Type-assertion '3 is int' is done here at the callsite. - # - k = "def"; # Top-level variable k. - # - for (str k, v in $*) { # k and v are bound here, masking outer k. - print k . ":" . v; # k is explicitly str; v is implicitly var. - } # - # - print "k is".k; # k at this scope level is still "def". - print "v is".v; # v is undefined in this scope. - # - i = -1; # - for (i = 1, int j = 2; i <= 10; i += 1, j *= 2) { # C-style triple-for variables use enclosing scope, unless - # declared local: i is outer, j is local to the loop. - print "inner i =" . i; # - print "inner j =" . j; # - } # - print "outer i =" . i; # i has been modified by the loop. - print "outer j =" . j; # j is undefined in this scope. - -Map literals -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Miller's ``put``/``filter`` DSL has four kinds of hashmaps. **Stream records** are (single-level) maps from name to value. **Out-of-stream variables** and **local variables** can also be maps, although they can be multi-level hashmaps (e.g. ``@sum[$x][$y]``). The fourth kind is **map literals**. These cannot be on the left-hand side of assignment expressions. Syntactically they look like JSON, although Miller allows string and integer keys in its map literals while JSON allows only string keys (e.g. ``"3"`` rather than ``3``). - -For example, the following swaps the input stream's ``a`` and ``i`` fields, modifies ``y``, and drops the rest: - -.. code-block:: none - :emphasize-lines: 1-7 - - mlr --opprint put ' - $* = { - "a": $i, - "i": $a, - "y": $y * 10, - } - ' data/small - a i y - 1 pan 7.268028627434533 - 2 eks 5.221511083334796 - 3 wye 3.3831852551664774 - 4 eks 1.3418874328430463 - 5 wye 8.63624469903273 - -Likewise, you can assign map literals to out-of-stream variables or local variables; pass them as arguments to user-defined functions, return them from functions, and so on: - -.. code-block:: none - :emphasize-lines: 1-7 - - mlr --from data/small put ' - func f(map m): map { - m["x"] *= 200; - return m; - } - $* = f({"a": $a, "x": $x}); - ' - a=pan,x=69.35802886761648 - a=eks,x=151.73599295799272 - a=wye,x=40.92066115326061 - a=eks,x=76.2798787742282 - a=wye,x=114.65778396040011 - -Like out-of-stream and local variables, map literals can be multi-level: - -.. code-block:: none - :emphasize-lines: 1-19 - - mlr --from data/small put -q ' - begin { - @o = { - "nrec": 0, - "nkey": {"numeric":0, "non-numeric":0}, - }; - } - @o["nrec"] += 1; - for (k, v in $*) { - if (is_numeric(v)) { - @o["nkey"]["numeric"] += 1; - } else { - @o["nkey"]["non-numeric"] += 1; - } - } - end { - dump @o; - } - ' - { - "nrec": 5, - "nkey": { - "numeric": 15, - "non-numeric": 10 - } - } - -By default, map-valued expressions are dumped using JSON formatting. If you use ``dump`` to print a hashmap with integer keys and you don't want them double-quoted (JSON-style) then you can use ``mlr put --jknquoteint``. See also ``mlr put --help``. - -.. _reference-dsl-type-checking: - -Type-checking -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Miller's ``put``/``filter`` DSLs support two optional kinds of type-checking. One is inline **type-tests** and **type-assertions** within expressions. The other is **type declarations** for assignments to local variables, binding of arguments to user-defined functions, and return values from user-defined functions, These are discussed in the following subsections. - -Use of type-checking is entirely up to you: omit it if you want flexibility with heterogeneous data; use it if you want to help catch misspellings in your DSL code or unexpected irregularities in your input data. - -.. _reference-dsl-type-tests-and-assertions: - -Type-test and type-assertion expressions -................................................................ - -The following ``is...`` functions take a value and return a boolean indicating whether the argument is of the indicated type. The ``assert_...`` functions return their argument if it is of the specified type, and cause a fatal error otherwise: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr -f | grep ^is - is_absent - is_array - is_bool - is_boolean - is_empty - is_empty_map - is_error - is_float - is_int - is_map - is_nonempty_map - is_not_array - is_not_empty - is_not_map - is_not_null - is_null - is_numeric - is_present - is_string - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr -f | grep ^assert - asserting_absent - asserting_array - asserting_bool - asserting_boolean - asserting_empty - asserting_empty_map - asserting_error - asserting_float - asserting_int - asserting_map - asserting_nonempty_map - asserting_not_array - asserting_not_empty - asserting_not_map - asserting_not_null - asserting_null - asserting_numeric - asserting_present - asserting_string - -See :doc:`data-cleaning-examples` for examples of how to use these. - -Type-declarations for local variables, function parameter, and function return values -............................................................................................... - -Local variables can be defined either untyped as in ``x = 1``, or typed as in ``int x = 1``. Types include **var** (explicitly untyped), **int**, **float**, **num** (int or float), **str**, **bool**, and **map**. These optional type declarations are enforced at the time values are assigned to variables: whether at the initial value assignment as in ``int x = 1`` or in any subsequent assignments to the same variable farther down in the scope. - -The reason for ``num`` is that ``int`` and ``float`` typedecls are very precise: - -.. code-block:: none - - float a = 0; # Runtime error since 0 is int not float - int b = 1.0; # Runtime error since 1.0 is float not int - num c = 0; # OK - num d = 1.0; # OK - -A suggestion is to use ``num`` for general use when you want numeric content, and use ``int`` when you genuinely want integer-only values, e.g. in loop indices or map keys (since Miller map keys can only be strings or ints). - -The ``var`` type declaration indicates no type restrictions, e.g. ``var x = 1`` has the same type restrictions on ``x`` as ``x = 1``. The difference is in intentional shadowing: if you have ``x = 1`` in outer scope and ``x = 2`` in inner scope (e.g. within a for-loop or an if-statement) then outer-scope ``x`` has value 2 after the second assignment. But if you have ``var x = 2`` in the inner scope, then you are declaring a variable scoped to the inner block.) For example: - -.. code-block:: none - - x = 1; - if (NR == 4) { - x = 2; # Refers to outer-scope x: value changes from 1 to 2. - } - print x; # Value of x is now two - -.. code-block:: none - - x = 1; - if (NR == 4) { - var x = 2; # Defines a new inner-scope x with value 2 - } - print x; # Value of this x is still 1 - -Likewise function arguments can optionally be typed, with type enforced when the function is called: - -.. code-block:: none - - func f(map m, int i) { - ... - } - $a = f({1:2, 3:4}, 5); # OK - $b = f({1:2, 3:4}, "abc"); # Runtime error - $c = f({1:2, 3:4}, $x); # Runtime error for records with non-integer field named x - if (NR == 4) { - var x = 2; # Defines a new inner-scope x with value 2 - } - print x; # Value of this x is still 1 - -Thirdly, function return values can be type-checked at the point of ``return`` using ``:`` and a typedecl after the parameter list: - -.. code-block:: none - - func f(map m, int i): bool { - ... - ... - if (...) { - return "false"; # Runtime error if this branch is taken - } - ... - ... - if (...) { - return retval; # Runtime error if this function doesn't have an in-scope - # boolean-valued variable named retval - } - ... - ... - # In Miller if your functions don't explicitly return a value, they return absent-null. - # So it would also be a runtime error on reaching the end of this function without - # an explicit return statement. - } - -Null data: empty and absent -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Please see :doc:`reference-main-null-data`. - -Aggregate variable assignments -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -There are three remaining kinds of variable assignment using out-of-stream variables, the last two of which use the ``$*`` syntax: - -* Recursive copy of out-of-stream variables -* Out-of-stream variable assigned to full stream record -* Full stream record assigned to an out-of-stream variable - -Example recursive copy of out-of-stream variables: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint put -q '@v["sum"] += $x; @v["count"] += 1; end{dump; @w = @v; dump}' data/small - { - "v": { - "sum": 2.264761728567491, - "count": 5 - } - } - { - "v": { - "sum": 2.264761728567491, - "count": 5 - }, - "w": { - "sum": 2.264761728567491, - "count": 5 - } - } - -Example of out-of-stream variable assigned to full stream record, where the 2nd record is stashed, and the 4th record is overwritten with that: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put 'NR == 2 {@keep = $*}; NR == 4 {$* = @keep}' data/small - a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533 - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797 - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776 - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729 - -Example of full stream record assigned to an out-of-stream variable, finding the record for which the ``x`` field has the largest value in the input stream: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/small - a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533 - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797 - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776 - a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729 - -.. code-block:: none - :emphasize-lines: 1-4 - - mlr --opprint put -q ' - is_null(@xmax) || $x > @xmax {@xmax=$x; @recmax=$*}; - end {emit @recmax} - ' data/small - a b i x y - eks pan 2 0.7586799647899636 0.5221511083334797 - -Keywords for filter and put -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr help usage-keywords - all: used in "emit", "emitp", and "unset" as a synonym for @* - - begin: defines a block of statements to be executed before input records - are ingested. The body statements must be wrapped in curly braces. - - Example: 'begin { @count = 0 }' - - bool: declares a boolean local variable in the current curly-braced scope. - Type-checking happens at assignment: 'bool b = 1' is an error. - - break: causes execution to continue after the body of the current for/while/do-while loop. - - call: used for invoking a user-defined subroutine. - - Example: 'subr s(k,v) { print k . " is " . v} call s("a", $a)' - - continue: causes execution to skip the remaining statements in the body of - the current for/while/do-while loop. For-loop increments are still applied. - - do: with "while", introduces a do-while loop. The body statements must be wrapped - in curly braces. - - dump: prints all currently defined out-of-stream variables immediately - to stdout as JSON. - - With >, >>, or |, the data do not become part of the output record stream but - are instead redirected. - - The > and >> are for write and append, as in the shell, but (as with awk) the - file-overwrite for > is on first write, not per record. The | is for piping to - a process which will process the data. There will be one open file for each - distinct file name (for > and >>) or one subordinate process for each distinct - value of the piped-to command (for |). Output-formatting flags are taken from - the main command line. - - Example: mlr --from f.dat put -q '@v[NR]=$*; end { dump }' - Example: mlr --from f.dat put -q '@v[NR]=$*; end { dump > "mytap.dat"}' - Example: mlr --from f.dat put -q '@v[NR]=$*; end { dump >> "mytap.dat"}' - Example: mlr --from f.dat put -q '@v[NR]=$*; end { dump | "jq .[]"}' - - edump: prints all currently defined out-of-stream variables immediately - to stderr as JSON. - - Example: mlr --from f.dat put -q '@v[NR]=$*; end { edump }' - - elif: the way Miller spells "else if". The body statements must be wrapped - in curly braces. - - else: terminates an if/elif/elif chain. The body statements must be wrapped - in curly braces. - - emit: inserts an out-of-stream variable into the output record stream. Hashmap - indices present in the data but not slotted by emit arguments are not output. - - With >, >>, or |, the data do not become part of the output record stream but - are instead redirected. - - The > and >> are for write and append, as in the shell, but (as with awk) the - file-overwrite for > is on first write, not per record. The | is for piping to - a process which will process the data. There will be one open file for each - distinct file name (for > and >>) or one subordinate process for each distinct - value of the piped-to command (for |). Output-formatting flags are taken from - the main command line. - - You can use any of the output-format command-line flags, e.g. --ocsv, --ofs, - etc., to control the format of the output if the output is redirected. See also mlr -h. - - Example: mlr --from f.dat put 'emit > "/tmp/data-".$a, $*' - Example: mlr --from f.dat put 'emit > "/tmp/data-".$a, mapexcept($*, "a")' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emit @sums' - Example: mlr --from f.dat put --ojson '@sums[$a][$b]+=$x; emit > "tap-".$a.$b.".dat", @sums' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emit @sums, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emit @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emit > "mytap.dat", @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emit >> "mytap.dat", @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emit | "gzip > mytap.dat.gz", @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emit > stderr, @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emit | "grep somepattern", @*, "index1", "index2"' - - Please see https://johnkerl.org/miller6://johnkerl.org/miller/doc for more information. - - emitf: inserts non-indexed out-of-stream variable(s) side-by-side into the - output record stream. - - With >, >>, or |, the data do not become part of the output record stream but - are instead redirected. - - The > and >> are for write and append, as in the shell, but (as with awk) the - file-overwrite for > is on first write, not per record. The | is for piping to - a process which will process the data. There will be one open file for each - distinct file name (for > and >>) or one subordinate process for each distinct - value of the piped-to command (for |). Output-formatting flags are taken from - the main command line. - - You can use any of the output-format command-line flags, e.g. --ocsv, --ofs, - etc., to control the format of the output if the output is redirected. See also mlr -h. - - Example: mlr --from f.dat put '@a=$i;@b+=$x;@c+=$y; emitf @a' - Example: mlr --from f.dat put --oxtab '@a=$i;@b+=$x;@c+=$y; emitf > "tap-".$i.".dat", @a' - Example: mlr --from f.dat put '@a=$i;@b+=$x;@c+=$y; emitf @a, @b, @c' - Example: mlr --from f.dat put '@a=$i;@b+=$x;@c+=$y; emitf > "mytap.dat", @a, @b, @c' - Example: mlr --from f.dat put '@a=$i;@b+=$x;@c+=$y; emitf >> "mytap.dat", @a, @b, @c' - Example: mlr --from f.dat put '@a=$i;@b+=$x;@c+=$y; emitf > stderr, @a, @b, @c' - Example: mlr --from f.dat put '@a=$i;@b+=$x;@c+=$y; emitf | "grep somepattern", @a, @b, @c' - Example: mlr --from f.dat put '@a=$i;@b+=$x;@c+=$y; emitf | "grep somepattern > mytap.dat", @a, @b, @c' - - Please see https://johnkerl.org/miller6://johnkerl.org/miller/doc for more information. - - emitp: inserts an out-of-stream variable into the output record stream. - Hashmap indices present in the data but not slotted by emitp arguments are - output concatenated with ":". - - With >, >>, or |, the data do not become part of the output record stream but - are instead redirected. - - The > and >> are for write and append, as in the shell, but (as with awk) the - file-overwrite for > is on first write, not per record. The | is for piping to - a process which will process the data. There will be one open file for each - distinct file name (for > and >>) or one subordinate process for each distinct - value of the piped-to command (for |). Output-formatting flags are taken from - the main command line. - - You can use any of the output-format command-line flags, e.g. --ocsv, --ofs, - etc., to control the format of the output if the output is redirected. See also mlr -h. - - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp @sums' - Example: mlr --from f.dat put --opprint '@sums[$a][$b]+=$x; emitp > "tap-".$a.$b.".dat", @sums' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp @sums, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp > "mytap.dat", @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp >> "mytap.dat", @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp | "gzip > mytap.dat.gz", @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp > stderr, @*, "index1", "index2"' - Example: mlr --from f.dat put '@sums[$a][$b]+=$x; emitp | "grep somepattern", @*, "index1", "index2"' - - Please see https://johnkerl.org/miller6://johnkerl.org/miller/doc for more information. - - end: defines a block of statements to be executed after input records - are ingested. The body statements must be wrapped in curly braces. - - Example: 'end { emit @count }' - Example: 'end { eprint "Final count is " . @count }' - - eprint: prints expression immediately to stderr. - - Example: mlr --from f.dat put -q 'eprint "The sum of x and y is ".($x+$y)' - Example: mlr --from f.dat put -q 'for (k, v in $*) { eprint k . " => " . v }' - Example: mlr --from f.dat put '(NR %% 1000 == 0) { eprint "Checkpoint ".NR}' - - eprintn: prints expression immediately to stderr, without trailing newline. - - Example: mlr --from f.dat put -q 'eprintn "The sum of x and y is ".($x+$y); eprint ""' - - false: the boolean literal value. - - filter: includes/excludes the record in the output record stream. - - Example: mlr --from f.dat put 'filter (NR == 2 || $x > 5.4)' - - Instead of put with 'filter false' you can simply use put -q. The following - uses the input record to accumulate data but only prints the running sum - without printing the input record: - - Example: mlr --from f.dat put -q '@running_sum += $x * $y; emit @running_sum' - - float: declares a floating-point local variable in the current curly-braced scope. - Type-checking happens at assignment: 'float x = 0' is an error. - - for: defines a for-loop using one of three styles. The body statements must - be wrapped in curly braces. - For-loop over stream record: - - Example: 'for (k, v in $*) { ... }' - - For-loop over out-of-stream variables: - - Example: 'for (k, v in @counts) { ... }' - Example: 'for ((k1, k2), v in @counts) { ... }' - Example: 'for ((k1, k2, k3), v in @*) { ... }' - - C-style for-loop: - - Example: 'for (var i = 0, var b = 1; i < 10; i += 1, b *= 2) { ... }' - - func: used for defining a user-defined function. - - Example: 'func f(a,b) { return sqrt(a**2+b**2)} $d = f($x, $y)' - - if: starts an if/elif/elif chain. The body statements must be wrapped - in curly braces. - - in: used in for-loops over stream records or out-of-stream variables. - - int: declares an integer local variable in the current curly-braced scope. - Type-checking happens at assignment: 'int x = 0.0' is an error. - - map: declares an map-valued local variable in the current curly-braced scope. - Type-checking happens at assignment: 'map b = 0' is an error. map b = {} is - always OK. map b = a is OK or not depending on whether a is a map. - - num: declares an int/float local variable in the current curly-braced scope. - Type-checking happens at assignment: 'num b = true' is an error. - - print: prints expression immediately to stdout. - - Example: mlr --from f.dat put -q 'print "The sum of x and y is ".($x+$y)' - Example: mlr --from f.dat put -q 'for (k, v in $*) { print k . " => " . v }' - Example: mlr --from f.dat put '(NR %% 1000 == 0) { print > stderr, "Checkpoint ".NR}' - - printn: prints expression immediately to stdout, without trailing newline. - - Example: mlr --from f.dat put -q 'printn "."; end { print "" }' - - return: specifies the return value from a user-defined function. - Omitted return statements (including via if-branches) result in an absent-null - return value, which in turns results in a skipped assignment to an LHS. - - stderr: Used for tee, emit, emitf, emitp, print, and dump in place of filename - to print to standard error. - - stdout: Used for tee, emit, emitf, emitp, print, and dump in place of filename - to print to standard output. - - str: declares a string local variable in the current curly-braced scope. - Type-checking happens at assignment. - - subr: used for defining a subroutine. - - Example: 'subr s(k,v) { print k . " is " . v} call s("a", $a)' - - tee: prints the current record to specified file. - This is an immediate print to the specified file (except for pprint format - which of course waits until the end of the input stream to format all output). - - The > and >> are for write and append, as in the shell, but (as with awk) the - file-overwrite for > is on first write, not per record. The | is for piping to - a process which will process the data. There will be one open file for each - distinct file name (for > and >>) or one subordinate process for each distinct - value of the piped-to command (for |). Output-formatting flags are taken from - the main command line. - - You can use any of the output-format command-line flags, e.g. --ocsv, --ofs, - etc., to control the format of the output. See also mlr -h. - - emit with redirect and tee with redirect are identical, except tee can only - output $*. - - Example: mlr --from f.dat put 'tee > "/tmp/data-".$a, $*' - Example: mlr --from f.dat put 'tee >> "/tmp/data-".$a.$b, $*' - Example: mlr --from f.dat put 'tee > stderr, $*' - Example: mlr --from f.dat put -q 'tee | "tr \[a-z\\] \[A-Z\\]", $*' - Example: mlr --from f.dat put -q 'tee | "tr \[a-z\\] \[A-Z\\] > /tmp/data-".$a, $*' - Example: mlr --from f.dat put -q 'tee | "gzip > /tmp/data-".$a.".gz", $*' - Example: mlr --from f.dat put -q --ojson 'tee | "gzip > /tmp/data-".$a.".gz", $*' - - true: the boolean literal value. - - unset: clears field(s) from the current record, or an out-of-stream or local variable. - - Example: mlr --from f.dat put 'unset $x' - Example: mlr --from f.dat put 'unset $*' - Example: mlr --from f.dat put 'for (k, v in $*) { if (k =~ "a.*") { unset $[k] } }' - Example: mlr --from f.dat put '...; unset @sums' - Example: mlr --from f.dat put '...; unset @sums["green"]' - Example: mlr --from f.dat put '...; unset @*' - - var: declares an untyped local variable in the current curly-braced scope. - - Examples: 'var a=1', 'var xyz=""' - - while: introduces a while loop, or with "do", introduces a do-while loop. - The body statements must be wrapped in curly braces. - - ENV: access to environment variables by name, e.g. '$home = ENV["HOME"]' - - FILENAME: evaluates to the name of the current file being processed. - - FILENUM: evaluates to the number of the current file being processed, - starting with 1. - - FNR: evaluates to the number of the current record within the current file - being processed, starting with 1. Resets at the start of each file. - - IFS: evaluates to the input field separator from the command line. - - IPS: evaluates to the input pair separator from the command line. - - IRS: evaluates to the input record separator from the command line, - or to LF or CRLF from the input data if in autodetect mode (which is - the default). - - M_E: the mathematical constant e. - - M_PI: the mathematical constant pi. - - NF: evaluates to the number of fields in the current record. - - NR: evaluates to the number of the current record over all files - being processed, starting with 1. Does not reset at the start of each file. - - OFS: evaluates to the output field separator from the command line. - - OPS: evaluates to the output pair separator from the command line. - - ORS: evaluates to the output record separator from the command line, - or to LF or CRLF from the input data if in autodetect mode (which is - the default). - diff --git a/docs6/reference-dsl-variables.rst.in b/docs6/reference-dsl-variables.rst.in deleted file mode 100644 index fefacbe7b..000000000 --- a/docs6/reference-dsl-variables.rst.in +++ /dev/null @@ -1,384 +0,0 @@ -DSL reference: variables -================================================================ - -Miller has the following kinds of variables: - -**Built-in variables** such as ``NF``, ``NF``, ``FILENAME``, ``M_PI``, and ``M_E``. These are all capital letters and are read-only (although some of them change value from one record to another). - -**Fields of stream records**, accessed using the ``$`` prefix. These refer to fields of the current data-stream record. For example, in ``echo x=1,y=2 | mlr put '$z = $x + $y'``, ``$x`` and ``$y`` refer to input fields, and ``$z`` refers to a new, computed output field. In a few contexts, presented below, you can refer to the entire record as ``$*``. - -**Out-of-stream variables** accessed using the ``@`` prefix. These refer to data which persist from one record to the next, including in ``begin`` and ``end`` blocks (which execute before/after the record stream is consumed, respectively). You use them to remember values across records, such as sums, differences, counters, and so on. In a few contexts, presented below, you can refer to the entire out-of-stream-variables collection as ``@*``. - -**Local variables** are limited in scope and extent to the current statements being executed: these include function arguments, bound variables in for loops, and explicitly declared local variables. - -**Keywords** are not variables, but since their names are reserved, you cannot use these names for local variables. - -Built-in variables -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -These are written all in capital letters, such as ``NR``, ``NF``, ``FILENAME``, and only a small, specific set of them is defined by Miller. - -Namely, Miller supports the following five built-in variables for :doc:`filter and put `, all ``awk``-inspired: ``NF``, ``NR``, ``FNR``, ``FILENUM``, and ``FILENAME``, as well as the mathematical constants ``M_PI`` and ``M_E``. Lastly, the ``ENV`` hashmap allows read access to environment variables, e.g. ``ENV["HOME"]`` or ``ENV["foo_".$hostname]``. - -GENRST_RUN_COMMAND -mlr filter 'FNR == 2' data/small* -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put '$fnr = FNR' data/small* -GENRST_EOF - -Their values of ``NF``, ``NR``, ``FNR``, ``FILENUM``, and ``FILENAME`` change from one record to the next as Miller scans through your input data stream. The mathematical constants, of course, do not change; ``ENV`` is populated from the system environment variables at the time Miller starts and is read-only for the remainder of program execution. - -Their **scope is global**: you can refer to them in any ``filter`` or ``put`` statement. Their values are assigned by the input-record reader: - -GENRST_RUN_COMMAND -mlr --csv put '$nr = NR' data/a.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --csv repeat -n 3 then put '$nr = NR' data/a.csv -GENRST_EOF - -The **extent** is for the duration of the put/filter: in a ``begin`` statement (which executes before the first input record is consumed) you will find ``NR=1`` and in an ``end`` statement (which is executed after the last input record is consumed) you will find ``NR`` to be the total number of records ingested. - -These are all **read-only** for the ``mlr put`` and ``mlr filter`` DSLs: they may be assigned from, e.g. ``$nr=NR``, but they may not be assigned to: ``NR=100`` is a syntax error. - -Field names -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Names of fields within stream records must be specified using a ``$`` in :doc:`filter and put expressions `, even though the dollar signs don't appear in the data stream itself. For integer-indexed data, this looks like ``awk``'s ``$1,$2,$3``, except that Miller allows non-numeric names such as ``$quantity`` or ``$hostname``. Likewise, enclose string literals in double quotes in ``filter`` expressions even though they don't appear in file data. In particular, ``mlr filter '$x=="abc"'`` passes through the record ``x=abc``. - -If field names have **special characters** such as ``.`` then you can use braces, e.g. ``'${field.name}'``. - -You may also use a **computed field name** in square brackets, e.g. - -GENRST_RUN_COMMAND -echo a=3,b=4 | mlr filter '$["x"] < 0.5' -GENRST_EOF - -GENRST_RUN_COMMAND -echo s=green,t=blue,a=3,b=4 | mlr put '$[$s."_".$t] = $a * $b' -GENRST_EOF - -Notes: - -The names of record fields depend on the contents of your input data stream, and their values change from one record to the next as Miller scans through your input data stream. - -Their **extent** is limited to the current record; their **scope** is the ``filter`` or ``put`` command in which they appear. - -These are **read-write**: you can do ``$y=2*$x``, ``$x=$x+1``, etc. - -Records are Miller's output: field names present in the input stream are passed through to output (written to standard output) unless fields are removed with ``cut``, or records are excluded with ``filter`` or ``put -q``, etc. Simply assign a value to a field and it will be output. - -Positional field names -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Even though Miller's main selling point is name-indexing, sometimes you really want to refer to a field name by its positional index (starting from 1). - -Use ``$[[3]]`` to access the name of field 3. More generally, any expression evaluating to an integer can go between ``$[[`` and ``]]``. - -Then using a computed field name, ``$[ $[[3]] ]`` is the value in the third field. This has the shorter equivalent notation ``$[[[3]]]``. - -GENRST_RUN_COMMAND -mlr cat data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put '$[[3]] = "NEW"' data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put '$[[[3]]] = "NEW"' data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put '$NEW = $[[NR]]' data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put '$NEW = $[[[NR]]]' data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put '$[[[NR]]] = "NEW"' data/small -GENRST_EOF - -Right-hand side accesses to non-existent fields -- i.e. with index less than 1 or greater than ``NF`` -- return an absent value. Likewise, left-hand side accesses only refer to fields which already exist. For example, if a field has 5 records then assigning the name or value of the 6th (or 600th) field results in a no-op. - -GENRST_RUN_COMMAND -mlr put '$[[6]] = "NEW"' data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put '$[[[6]]] = "NEW"' data/small -GENRST_EOF - -Out-of-stream variables -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -These are prefixed with an at-sign, e.g. ``@sum``. Furthermore, unlike built-in variables and stream-record fields, they are maintained in an arbitrarily nested hashmap: you can do ``@sum += $quanity``, or ``@sum[$color] += $quanity``, or ``@sum[$color][$shape] += $quanity``. The keys for the multi-level hashmap can be any expression which evaluates to string or integer: e.g. ``@sum[NR] = $a + $b``, ``@sum[$a."-".$b] = $x``, etc. - -Their names and their values are entirely under your control; they change only when you assign to them. - -Just as for field names in stream records, if you want to define out-of-stream variables with **special characters** such as ``.`` then you can use braces, e.g. ``'@{variable.name}["index"]'``. - -You may use a **computed key** in square brackets, e.g. - -GENRST_RUN_COMMAND -echo s=green,t=blue,a=3,b=4 | mlr put -q '@[$s."_".$t] = $a * $b; emit all' -GENRST_EOF - -Out-of-stream variables are **scoped** to the ``put`` command in which they appear. In particular, if you have two or more ``put`` commands separated by ``then``, each put will have its own set of out-of-stream variables: - -GENRST_RUN_COMMAND -cat data/a.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put '@sum += $a; end {emit @sum}' \ - then put 'is_present($a) {$a=10*$a; @sum += $a}; end {emit @sum}' \ - data/a.dkvp -GENRST_EOF - -Out-of-stream variables' **extent** is from the start to the end of the record stream, i.e. every time the ``put`` or ``filter`` statement referring to them is executed. - -Out-of-stream variables are **read-write**: you can do ``$sum=@sum``, ``@sum=$sum``, etc. - -Indexed out-of-stream variables -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Using an index on the ``@count`` and ``@sum`` variables, we get the benefit of the ``-g`` (group-by) option which ``mlr stats1`` and various other Miller commands have: - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/begin-end-example-6.sh) - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/begin-end-example-7.sh) - -Indices can be arbitrarily deep -- here there are two or more of them: - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/begin-end-example-6a.sh) - -The idea is that ``stats1``, and other Miller verbs, encapsulate frequently-used patterns with a minimum of keystroking (and run a little faster), whereas using out-of-stream variables you have more flexibility and control in what you do. - -Begin/end blocks can be mixed with pattern/action blocks. For example: - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/begin-end-example-8.sh) - -.. _reference-dsl-local-variables: - -Local variables -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Local variables are similar to out-of-stream variables, except that their extent is limited to the expressions in which they appear (and their basenames can't be computed using square brackets). There are three kinds of local variables: **arguments** to functions/subroutines, **variables bound within for-loops**, and **locals** defined within control blocks. They may be untyped using ``var``, or typed using ``num``, ``int``, ``float``, ``str``, ``bool``, and ``map``. - -For example: - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/local-example-1.sh) - -Things which are completely unsurprising, resembling many other languages: - -* Parameter names are bound to their arguments but can be reassigned, e.g. if there is a parameter named ``a`` then you can reassign the value of ``a`` to be something else within the function if you like. - -* However, you cannot redeclare the *type* of an argument or a local: ``var a=1; var a=2`` is an error but ``var a=1; a=2`` is OK. - -* All argument-passing is positional rather than by name; arguments are passed by value, not by reference. (This is also true for map-valued variables: they are not, and cannot be, passed by reference) - -* You can define locals (using ``var``, ``num``, etc.) at any scope (if-statements, else-statements, while-loops, for-loops, or the top-level scope), and nested scopes will have access (more details on scope in the next section). If you define a local variable with the same name inside an inner scope, then a new variable is created with the narrower scope. - -* If you assign to a local variable for the first time in a scope without declaring it as ``var``, ``num``, etc. then: if it exists in an outer scope, that outer-scope variable will be updated; if not, it will be defined in the current scope as if ``var`` had been used. (See also :ref:`reference-dsl-type-checking` for an example.) I recommend always declaring variables explicitly to make the intended scoping clear. - -* Functions and subroutines never have access to locals from their callee (unless passed by value as arguments). - -Things which are perhaps surprising compared to other languages: - -* Type declarations using ``var``, or typed using ``num``, ``int``, ``float``, ``str``, and ``bool`` are necessary to declare local variables. Function arguments and variables bound in for-loops over stream records and out-of-stream variables are *implicitly* declared using ``var``. (Some examples are shown below.) - -* Type-checking is done at assignment time. For example, ``float f = 0`` is an error (since ``0`` is an integer), as is ``float f = 0.0; f = 1``. For this reason I prefer to use ``num`` over ``float`` in most contexts since ``num`` encompasses integer and floating-point values. More information about type-checking is at :ref:`reference-dsl-type-checking`. - -* Bound variables in for-loops over stream records and out-of-stream variables are implicitly local to that block. E.g. in ``for (k, v in $*) { ... }`` ``for ((k1, k2), v in @*) { ... }`` if there are ``k``, ``v``, etc. in the enclosing scope then those will be masked by the loop-local bound variables in the loop, and moreover the values of the loop-local bound variables are not available after the end of the loop. - -* For C-style triple-for loops, if a for-loop variable is defined using ``var``, ``int``, etc. then it is scoped to that for-loop. E.g. ``for (i = 0; i < 10; i += 1) { ... }`` and ``for (int i = 0; i < 10; i += 1) { ... }``. (This is unsurprising.). If there is no typedecl and an outer-scope variable of that name exists, then it is used. (This is also unsurprising.) But of there is no outer-scope variable of that name then the variable is scoped to the for-loop only. - -The following example demonstrates the scope rules: - -GENRST_RUN_COMMAND -cat data/scope-example.mlr -GENRST_EOF - -GENRST_RUN_COMMAND -cat data/scope-example.dat -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --oxtab --from data/scope-example.dat put -f data/scope-example.mlr -GENRST_EOF - -And this example demonstrates the type-declaration rules: - -GENRST_RUN_COMMAND -cat data/type-decl-example.mlr -GENRST_EOF - -Map literals -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Miller's ``put``/``filter`` DSL has four kinds of hashmaps. **Stream records** are (single-level) maps from name to value. **Out-of-stream variables** and **local variables** can also be maps, although they can be multi-level hashmaps (e.g. ``@sum[$x][$y]``). The fourth kind is **map literals**. These cannot be on the left-hand side of assignment expressions. Syntactically they look like JSON, although Miller allows string and integer keys in its map literals while JSON allows only string keys (e.g. ``"3"`` rather than ``3``). - -For example, the following swaps the input stream's ``a`` and ``i`` fields, modifies ``y``, and drops the rest: - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/map-literal-example-1.sh) - -Likewise, you can assign map literals to out-of-stream variables or local variables; pass them as arguments to user-defined functions, return them from functions, and so on: - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/map-literal-example-2.sh) - -Like out-of-stream and local variables, map literals can be multi-level: - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/map-literal-example-3.sh) - -By default, map-valued expressions are dumped using JSON formatting. If you use ``dump`` to print a hashmap with integer keys and you don't want them double-quoted (JSON-style) then you can use ``mlr put --jknquoteint``. See also ``mlr put --help``. - -.. _reference-dsl-type-checking: - -Type-checking -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Miller's ``put``/``filter`` DSLs support two optional kinds of type-checking. One is inline **type-tests** and **type-assertions** within expressions. The other is **type declarations** for assignments to local variables, binding of arguments to user-defined functions, and return values from user-defined functions, These are discussed in the following subsections. - -Use of type-checking is entirely up to you: omit it if you want flexibility with heterogeneous data; use it if you want to help catch misspellings in your DSL code or unexpected irregularities in your input data. - -.. _reference-dsl-type-tests-and-assertions: - -Type-test and type-assertion expressions -................................................................ - -The following ``is...`` functions take a value and return a boolean indicating whether the argument is of the indicated type. The ``assert_...`` functions return their argument if it is of the specified type, and cause a fatal error otherwise: - -GENRST_RUN_COMMAND -mlr -f | grep ^is -GENRST_EOF - -GENRST_RUN_COMMAND -mlr -f | grep ^assert -GENRST_EOF - -See :doc:`data-cleaning-examples` for examples of how to use these. - -Type-declarations for local variables, function parameter, and function return values -............................................................................................... - -Local variables can be defined either untyped as in ``x = 1``, or typed as in ``int x = 1``. Types include **var** (explicitly untyped), **int**, **float**, **num** (int or float), **str**, **bool**, and **map**. These optional type declarations are enforced at the time values are assigned to variables: whether at the initial value assignment as in ``int x = 1`` or in any subsequent assignments to the same variable farther down in the scope. - -The reason for ``num`` is that ``int`` and ``float`` typedecls are very precise: - -GENRST_CARDIFY -float a = 0; # Runtime error since 0 is int not float -int b = 1.0; # Runtime error since 1.0 is float not int -num c = 0; # OK -num d = 1.0; # OK -GENRST_EOF - -A suggestion is to use ``num`` for general use when you want numeric content, and use ``int`` when you genuinely want integer-only values, e.g. in loop indices or map keys (since Miller map keys can only be strings or ints). - -The ``var`` type declaration indicates no type restrictions, e.g. ``var x = 1`` has the same type restrictions on ``x`` as ``x = 1``. The difference is in intentional shadowing: if you have ``x = 1`` in outer scope and ``x = 2`` in inner scope (e.g. within a for-loop or an if-statement) then outer-scope ``x`` has value 2 after the second assignment. But if you have ``var x = 2`` in the inner scope, then you are declaring a variable scoped to the inner block.) For example: - -GENRST_CARDIFY -x = 1; -if (NR == 4) { - x = 2; # Refers to outer-scope x: value changes from 1 to 2. -} -print x; # Value of x is now two -GENRST_EOF - -GENRST_CARDIFY -x = 1; -if (NR == 4) { - var x = 2; # Defines a new inner-scope x with value 2 -} -print x; # Value of this x is still 1 -GENRST_EOF - -Likewise function arguments can optionally be typed, with type enforced when the function is called: - -GENRST_CARDIFY -func f(map m, int i) { - ... -} -$a = f({1:2, 3:4}, 5); # OK -$b = f({1:2, 3:4}, "abc"); # Runtime error -$c = f({1:2, 3:4}, $x); # Runtime error for records with non-integer field named x -if (NR == 4) { - var x = 2; # Defines a new inner-scope x with value 2 -} -print x; # Value of this x is still 1 -GENRST_EOF - -Thirdly, function return values can be type-checked at the point of ``return`` using ``:`` and a typedecl after the parameter list: - -GENRST_CARDIFY -func f(map m, int i): bool { - ... - ... - if (...) { - return "false"; # Runtime error if this branch is taken - } - ... - ... - if (...) { - return retval; # Runtime error if this function doesn't have an in-scope - # boolean-valued variable named retval - } - ... - ... - # In Miller if your functions don't explicitly return a value, they return absent-null. - # So it would also be a runtime error on reaching the end of this function without - # an explicit return statement. -} -GENRST_EOF - -Null data: empty and absent -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Please see :doc:`reference-main-null-data`. - -Aggregate variable assignments -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -There are three remaining kinds of variable assignment using out-of-stream variables, the last two of which use the ``$*`` syntax: - -* Recursive copy of out-of-stream variables -* Out-of-stream variable assigned to full stream record -* Full stream record assigned to an out-of-stream variable - -Example recursive copy of out-of-stream variables: - -GENRST_RUN_COMMAND -mlr --opprint put -q '@v["sum"] += $x; @v["count"] += 1; end{dump; @w = @v; dump}' data/small -GENRST_EOF - -Example of out-of-stream variable assigned to full stream record, where the 2nd record is stashed, and the 4th record is overwritten with that: - -GENRST_RUN_COMMAND -mlr put 'NR == 2 {@keep = $*}; NR == 4 {$* = @keep}' data/small -GENRST_EOF - -Example of full stream record assigned to an out-of-stream variable, finding the record for which the ``x`` field has the largest value in the input stream: - -GENRST_RUN_COMMAND -cat data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint put -q ' - is_null(@xmax) || $x > @xmax {@xmax=$x; @recmax=$*}; - end {emit @recmax} -' data/small -GENRST_EOF - -Keywords for filter and put -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -GENRST_RUN_COMMAND -mlr help usage-keywords -GENRST_EOF - diff --git a/docs6/reference-dsl.rst b/docs6/reference-dsl.rst deleted file mode 100644 index 3343eb5f0..000000000 --- a/docs6/reference-dsl.rst +++ /dev/null @@ -1,90 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -DSL reference: overview -================================================================ - -Overview ----------------------------------------------------------------- - -Here's comparison of verbs and ``put``/``filter`` DSL expressions: - -Example: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr stats1 -a sum -f x -g a data/small - a=pan,x_sum=0.3467901443380824 - a=eks,x_sum=1.1400793586611044 - a=wye,x_sum=0.7778922255683036 - -* Verbs are coded in Go -* They run a bit faster -* They take fewer keystrokes -* There is less to learn -* Their customization is limited to each verb's options - -Example: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put -q '@x_sum[$a] += $x; end{emit @x_sum, "a"}' data/small - a=pan,x_sum=0.3467901443380824 - a=eks,x_sum=1.1400793586611044 - a=wye,x_sum=0.7778922255683036 - -* You get to write your own DSL expressions -* They run a bit slower -* They take more keystrokes -* There is more to learn -* They are highly customizable - -Please see :doc:`reference-verbs` for information on verbs other than ``put`` and ``filter``. - -The essential usages of ``mlr filter`` and ``mlr put`` are for record-selection and record-updating expressions, respectively. For example, given the following input data: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/small - a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533 - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797 - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776 - a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729 - -you might retain only the records whose ``a`` field has value ``eks``: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr filter '$a == "eks"' data/small - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797 - a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463 - -or you might add a new field which is a function of existing fields: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put '$ab = $a . "_" . $b ' data/small - a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533,ab=pan_pan - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797,ab=eks_pan - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776,ab=wye_wye - a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463,ab=eks_wye - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729,ab=wye_pan - -The two verbs ``mlr filter`` and ``mlr put`` are essentially the same. The only differences are: - -* Expressions sent to ``mlr filter`` must end with a boolean expression, which is the filtering criterion; - -* ``mlr filter`` expressions may not reference the ``filter`` keyword within them; and - -* ``mlr filter`` expressions may not use ``tee``, ``emit``, ``emitp``, or ``emitf``. - -All the rest is the same: in particular, you can define and invoke functions and subroutines to help produce the final boolean statement, and record fields may be assigned to in the statements preceding the final boolean statement. - -There are more details and more choices, of course, as detailed in the following sections. - diff --git a/docs6/reference-dsl.rst.in b/docs6/reference-dsl.rst.in deleted file mode 100644 index df034d81c..000000000 --- a/docs6/reference-dsl.rst.in +++ /dev/null @@ -1,64 +0,0 @@ -DSL reference: overview -================================================================ - -Overview ----------------------------------------------------------------- - -Here's comparison of verbs and ``put``/``filter`` DSL expressions: - -Example: - -GENRST_RUN_COMMAND -mlr stats1 -a sum -f x -g a data/small -GENRST_EOF - -* Verbs are coded in Go -* They run a bit faster -* They take fewer keystrokes -* There is less to learn -* Their customization is limited to each verb's options - -Example: - -GENRST_RUN_COMMAND -mlr put -q '@x_sum[$a] += $x; end{emit @x_sum, "a"}' data/small -GENRST_EOF - -* You get to write your own DSL expressions -* They run a bit slower -* They take more keystrokes -* There is more to learn -* They are highly customizable - -Please see :doc:`reference-verbs` for information on verbs other than ``put`` and ``filter``. - -The essential usages of ``mlr filter`` and ``mlr put`` are for record-selection and record-updating expressions, respectively. For example, given the following input data: - -GENRST_RUN_COMMAND -cat data/small -GENRST_EOF - -you might retain only the records whose ``a`` field has value ``eks``: - -GENRST_RUN_COMMAND -mlr filter '$a == "eks"' data/small -GENRST_EOF - -or you might add a new field which is a function of existing fields: - -GENRST_RUN_COMMAND -mlr put '$ab = $a . "_" . $b ' data/small -GENRST_EOF - -The two verbs ``mlr filter`` and ``mlr put`` are essentially the same. The only differences are: - -* Expressions sent to ``mlr filter`` must end with a boolean expression, which is the filtering criterion; - -* ``mlr filter`` expressions may not reference the ``filter`` keyword within them; and - -* ``mlr filter`` expressions may not use ``tee``, ``emit``, ``emitp``, or ``emitf``. - -All the rest is the same: in particular, you can define and invoke functions and subroutines to help produce the final boolean statement, and record fields may be assigned to in the statements preceding the final boolean statement. - -There are more details and more choices, of course, as detailed in the following sections. - diff --git a/docs6/reference-main-arithmetic.rst b/docs6/reference-main-arithmetic.rst deleted file mode 100644 index fe536c0de..000000000 --- a/docs6/reference-main-arithmetic.rst +++ /dev/null @@ -1,50 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Reference: arithmetic -================================================================ - -Input scanning ----------------------------------------------------------------- - -Numbers in Miller are double-precision float or 64-bit signed integers. Anything scannable as int, e.g ``123`` or ``0xabcd``, is treated as an integer; otherwise, input scannable as float (``4.56`` or ``8e9``) is treated as float; everything else is a string. - -If you want all numbers to be treated as floats, then you may use ``float()`` in your filter/put expressions (e.g. replacing ``$c = $a * $b`` with ``$c = float($a) * float($b)``) -- or, more simply, use ``mlr filter -F`` and ``mlr put -F`` which forces all numeric input, whether from expression literals or field values, to float. Likewise ``mlr stats1 -F`` and ``mlr step -F`` force integerable accumulators (such as ``count``) to be done in floating-point. - -Conversion by math routines ----------------------------------------------------------------- - -For most math functions, integers are cast to float on input, and produce float output: e.g. ``exp(0) = 1.0`` rather than ``1``. The following, however, produce integer output if their inputs are integers: ``+`` ``-`` ``*`` ``/`` ``//`` ``%`` ``abs`` ``ceil`` ``floor`` ``max`` ``min`` ``round`` ``roundm`` ``sgn``. As well, ``stats1 -a min``, ``stats1 -a max``, ``stats1 -a sum``, ``step -a delta``, and ``step -a rsum`` produce integer output if their inputs are integers. - -Conversion by arithmetic operators ----------------------------------------------------------------- - -The sum, difference, and product of integers is again integer, except for when that would overflow a 64-bit integer at which point Miller converts the result to float. - -The short of it is that Miller does this transparently for you so you needn't think about it. - -Implementation details of this, for the interested: integer adds and subtracts overflow by at most one bit so it suffices to check sign-changes. Thus, Miller allows you to add and subtract arbitrary 64-bit signed integers, converting only to float precisely when the result is less than -2\ :sup:`63` or greater than 2\ :sup:`63`\ -1. Multiplies, on the other hand, can overflow by a word size and a sign-change technique does not suffice to detect overflow. Instead Miller tests whether the floating-point product exceeds the representable integer range. Now, 64-bit integers have 64-bit precision while IEEE-doubles have only 52-bit mantissas -- so, there are 53 bits including implicit leading one. The following experiment explicitly demonstrates the resolution at this range: - -.. code-block:: none - - 64-bit integer 64-bit integer Casted to double Back to 64-bit - in hex in decimal integer - 0x7ffffffffffff9ff 9223372036854774271 9223372036854773760.000000 0x7ffffffffffff800 - 0x7ffffffffffffa00 9223372036854774272 9223372036854773760.000000 0x7ffffffffffff800 - 0x7ffffffffffffbff 9223372036854774783 9223372036854774784.000000 0x7ffffffffffffc00 - 0x7ffffffffffffc00 9223372036854774784 9223372036854774784.000000 0x7ffffffffffffc00 - 0x7ffffffffffffdff 9223372036854775295 9223372036854774784.000000 0x7ffffffffffffc00 - 0x7ffffffffffffe00 9223372036854775296 9223372036854775808.000000 0x8000000000000000 - 0x7ffffffffffffffe 9223372036854775806 9223372036854775808.000000 0x8000000000000000 - 0x7fffffffffffffff 9223372036854775807 9223372036854775808.000000 0x8000000000000000 - -That is, one cannot check an integer product to see if it is precisely greater than 2\ :sup:`63`\ -1 or less than -2\ :sup:`63` using either integer arithmetic (it may have already overflowed) or using double-precision (due to granularity). Instead Miller checks for overflow in 64-bit integer multiplication by seeing whether the absolute value of the double-precision product exceeds the largest representable IEEE double less than 2\ :sup:`63`, which we see from the listing above is 9223372036854774784. (An alternative would be to do all integer multiplies using handcrafted multi-word 128-bit arithmetic. This approach is not taken.) - -Pythonic division ----------------------------------------------------------------- - -Division and remainder are `pythonic `_: - -* Quotient of integers is floating-point: ``7/2`` is ``3.5``. -* Integer division is done with ``//``: ``7//2`` is ``3``. This rounds toward the negative. -* Remainders are non-negative. diff --git a/docs6/reference-main-arithmetic.rst.in b/docs6/reference-main-arithmetic.rst.in deleted file mode 100644 index 467aab14f..000000000 --- a/docs6/reference-main-arithmetic.rst.in +++ /dev/null @@ -1,47 +0,0 @@ -Reference: arithmetic -================================================================ - -Input scanning ----------------------------------------------------------------- - -Numbers in Miller are double-precision float or 64-bit signed integers. Anything scannable as int, e.g ``123`` or ``0xabcd``, is treated as an integer; otherwise, input scannable as float (``4.56`` or ``8e9``) is treated as float; everything else is a string. - -If you want all numbers to be treated as floats, then you may use ``float()`` in your filter/put expressions (e.g. replacing ``$c = $a * $b`` with ``$c = float($a) * float($b)``) -- or, more simply, use ``mlr filter -F`` and ``mlr put -F`` which forces all numeric input, whether from expression literals or field values, to float. Likewise ``mlr stats1 -F`` and ``mlr step -F`` force integerable accumulators (such as ``count``) to be done in floating-point. - -Conversion by math routines ----------------------------------------------------------------- - -For most math functions, integers are cast to float on input, and produce float output: e.g. ``exp(0) = 1.0`` rather than ``1``. The following, however, produce integer output if their inputs are integers: ``+`` ``-`` ``*`` ``/`` ``//`` ``%`` ``abs`` ``ceil`` ``floor`` ``max`` ``min`` ``round`` ``roundm`` ``sgn``. As well, ``stats1 -a min``, ``stats1 -a max``, ``stats1 -a sum``, ``step -a delta``, and ``step -a rsum`` produce integer output if their inputs are integers. - -Conversion by arithmetic operators ----------------------------------------------------------------- - -The sum, difference, and product of integers is again integer, except for when that would overflow a 64-bit integer at which point Miller converts the result to float. - -The short of it is that Miller does this transparently for you so you needn't think about it. - -Implementation details of this, for the interested: integer adds and subtracts overflow by at most one bit so it suffices to check sign-changes. Thus, Miller allows you to add and subtract arbitrary 64-bit signed integers, converting only to float precisely when the result is less than -2\ :sup:`63` or greater than 2\ :sup:`63`\ -1. Multiplies, on the other hand, can overflow by a word size and a sign-change technique does not suffice to detect overflow. Instead Miller tests whether the floating-point product exceeds the representable integer range. Now, 64-bit integers have 64-bit precision while IEEE-doubles have only 52-bit mantissas -- so, there are 53 bits including implicit leading one. The following experiment explicitly demonstrates the resolution at this range: - -GENRST_CARDIFY -64-bit integer 64-bit integer Casted to double Back to 64-bit -in hex in decimal integer -0x7ffffffffffff9ff 9223372036854774271 9223372036854773760.000000 0x7ffffffffffff800 -0x7ffffffffffffa00 9223372036854774272 9223372036854773760.000000 0x7ffffffffffff800 -0x7ffffffffffffbff 9223372036854774783 9223372036854774784.000000 0x7ffffffffffffc00 -0x7ffffffffffffc00 9223372036854774784 9223372036854774784.000000 0x7ffffffffffffc00 -0x7ffffffffffffdff 9223372036854775295 9223372036854774784.000000 0x7ffffffffffffc00 -0x7ffffffffffffe00 9223372036854775296 9223372036854775808.000000 0x8000000000000000 -0x7ffffffffffffffe 9223372036854775806 9223372036854775808.000000 0x8000000000000000 -0x7fffffffffffffff 9223372036854775807 9223372036854775808.000000 0x8000000000000000 -GENRST_EOF - -That is, one cannot check an integer product to see if it is precisely greater than 2\ :sup:`63`\ -1 or less than -2\ :sup:`63` using either integer arithmetic (it may have already overflowed) or using double-precision (due to granularity). Instead Miller checks for overflow in 64-bit integer multiplication by seeing whether the absolute value of the double-precision product exceeds the largest representable IEEE double less than 2\ :sup:`63`, which we see from the listing above is 9223372036854774784. (An alternative would be to do all integer multiplies using handcrafted multi-word 128-bit arithmetic. This approach is not taken.) - -Pythonic division ----------------------------------------------------------------- - -Division and remainder are `pythonic `_: - -* Quotient of integers is floating-point: ``7/2`` is ``3.5``. -* Integer division is done with ``//``: ``7//2`` is ``3``. This rounds toward the negative. -* Remainders are non-negative. diff --git a/docs6/reference-main-auxiliary-commands.rst b/docs6/reference-main-auxiliary-commands.rst deleted file mode 100644 index b316aefc8..000000000 --- a/docs6/reference-main-auxiliary-commands.rst +++ /dev/null @@ -1,119 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Reference: auxiliary commands -================================================================ - -There are a few nearly-standalone programs which have nothing to do with the rest of Miller, do not participate in record streams, and do not deal with file formats. They might as well be little standalone executables but they're delivered within the main Miller executable for convenience. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr aux-list - Available subcommands: - aux-list - hex - lecat - termcvt - unhex - help - regtest - repl - For more information, please invoke mlr {subcommand} --help. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr lecat --help - Usage: mlr lecat [options] {zero or more file names} - Simply echoes input, but flags CR characters in red and LF characters in green. - If zero file names are supplied, standard input is read. - Options: - --mono: don't try to colorize the output - -h or --help: print this message - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr termcvt --help - Usage: mlr termcvt [option] {zero or more file names} - Option (exactly one is required): - --cr2crlf - --lf2crlf - --crlf2cr - --crlf2lf - --cr2lf - --lf2cr - -I in-place processing (default is to write to stdout) - -h or --help: print this message - Zero file names means read from standard input. - Output is always to standard output; files are not written in-place. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr hex --help - Usage: mlr hex [options] {zero or more file names} - Simple hex-dump. - If zero file names are supplied, standard input is read. - Options: - -r: print only raw hex without leading offset indicators or trailing ASCII dump. - -h or --help: print this message - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr unhex --help - Usage: mlr unhex [option] {zero or more file names} - Options: - -h or --help: print this message - Zero file names means read from standard input. - Output is always to standard output; files are not written in-place. - -Examples: - -.. code-block:: none - :emphasize-lines: 1-1 - - echo 'Hello, world!' | mlr lecat --mono - Hello, world![LF] - -.. code-block:: none - :emphasize-lines: 1-1 - - echo 'Hello, world!' | mlr termcvt --lf2crlf | mlr lecat --mono - Hello, world![CR][LF] - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr hex data/budget.csv - 00000000: 23 20 41 73 61 6e 61 20 2d 2d 20 68 65 72 65 20 |# Asana -- here | - 00000010: 61 72 65 20 74 68 65 20 62 75 64 67 65 74 20 66 |are the budget f| - 00000020: 69 67 75 72 65 73 20 79 6f 75 20 61 73 6b 65 64 |igures you asked| - 00000030: 20 66 6f 72 21 0a 74 79 70 65 2c 71 75 61 6e 74 | for!.type,quant| - 00000040: 69 74 79 0a 70 75 72 70 6c 65 2c 34 35 36 2e 37 |ity.purple,456.7| - 00000050: 38 0a 67 72 65 65 6e 2c 36 37 38 2e 31 32 0a 6f |8.green,678.12.o| - 00000060: 72 61 6e 67 65 2c 31 32 33 2e 34 35 0a |range,123.45.| - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr hex -r data/budget.csv - 23 20 41 73 61 6e 61 20 2d 2d 20 68 65 72 65 20 - 61 72 65 20 74 68 65 20 62 75 64 67 65 74 20 66 - 69 67 75 72 65 73 20 79 6f 75 20 61 73 6b 65 64 - 20 66 6f 72 21 0a 74 79 70 65 2c 71 75 61 6e 74 - 69 74 79 0a 70 75 72 70 6c 65 2c 34 35 36 2e 37 - 38 0a 67 72 65 65 6e 2c 36 37 38 2e 31 32 0a 6f - 72 61 6e 67 65 2c 31 32 33 2e 34 35 0a - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr hex -r data/budget.csv | sed 's/20/2a/g' | mlr unhex - #*Asana*--*here*are*the*budget*figures*you*asked*for! - type,quantity - purple,456.78 - green,678.12 - orange,123.45 diff --git a/docs6/reference-main-auxiliary-commands.rst.in b/docs6/reference-main-auxiliary-commands.rst.in deleted file mode 100644 index 471f562f0..000000000 --- a/docs6/reference-main-auxiliary-commands.rst.in +++ /dev/null @@ -1,46 +0,0 @@ -Reference: auxiliary commands -================================================================ - -There are a few nearly-standalone programs which have nothing to do with the rest of Miller, do not participate in record streams, and do not deal with file formats. They might as well be little standalone executables but they're delivered within the main Miller executable for convenience. - -GENRST_RUN_COMMAND -mlr aux-list -GENRST_EOF - -GENRST_RUN_COMMAND -mlr lecat --help -GENRST_EOF - -GENRST_RUN_COMMAND -mlr termcvt --help -GENRST_EOF - -GENRST_RUN_COMMAND -mlr hex --help -GENRST_EOF - -GENRST_RUN_COMMAND -mlr unhex --help -GENRST_EOF - -Examples: - -GENRST_RUN_COMMAND -echo 'Hello, world!' | mlr lecat --mono -GENRST_EOF - -GENRST_RUN_COMMAND -echo 'Hello, world!' | mlr termcvt --lf2crlf | mlr lecat --mono -GENRST_EOF - -GENRST_RUN_COMMAND -mlr hex data/budget.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr hex -r data/budget.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr hex -r data/budget.csv | sed 's/20/2a/g' | mlr unhex -GENRST_EOF diff --git a/docs6/reference-main-data-types.rst b/docs6/reference-main-data-types.rst deleted file mode 100644 index 02ef18864..000000000 --- a/docs6/reference-main-data-types.rst +++ /dev/null @@ -1,49 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Reference: data types -================================================================ - -Miller's input and output are all string-oriented: there is (as of August 2015 anyway) no support for binary record packing. In this sense, everything is a string in and out of Miller. During processing, field names are always strings, even if they have names like "3"; field values are usually strings. Field values' ability to be interpreted as a non-string type only has meaning when comparison or function operations are done on them. And it is an error condition if Miller encounters non-numeric (or otherwise mistyped) data in a field in which it has been asked to do numeric (or otherwise type-specific) operations. - -Field values are treated as numeric for the following: - -* Numeric sort: ``mlr sort -n``, ``mlr sort -nr``. -* Statistics: ``mlr histogram``, ``mlr stats1``, ``mlr stats2``. -* Cross-record arithmetic: ``mlr step``. - -For ``mlr put`` and ``mlr filter``: - -* Miller's types for function processing are **empty-null** (empty string), **absent-null** (reads of unset right-hand sides, or fall-through non-explicit return values from user-defined functions), **error**, **string**, **float** (double-precision), **int** (64-bit signed), and **boolean**. - -* On input, string values representable as numbers, e.g. "3" or "3.1", are treated as int or float, respectively. If a record has ``x=1,y=2`` then ``mlr put '$z=$x+$y'`` will produce ``x=1,y=2,z=3``, and ``mlr put '$z=$x.$y'`` does not give an error simply because the dot operator has been generalized to stringify non-strings. To coerce back to string for processing, use the ``string`` function: ``mlr put '$z=string($x).string($y)'`` will produce ``x=1,y=2,z=12``. - -* On input, string values representable as boolean (e.g. ``"true"``, ``"false"``) are *not* automatically treated as boolean. (This is because ``"true"`` and ``"false"`` are ordinary words, and auto string-to-boolean on a column consisting of words would result in some strings mixed with some booleans.) Use the ``boolean`` function to coerce: e.g. giving the record ``x=1,y=2,w=false`` to ``mlr put '$z=($x<$y) || boolean($w)'``. - -* Functions take types as described in ``mlr --help-all-functions``: for example, ``log10`` takes float input and produces float output, ``gmt2sec`` maps string to int, and ``sec2gmt`` maps int to string. - -* All math functions described in ``mlr --help-all-functions`` take integer as well as float input. - -String literals ----------------------------------------------------------------- - -You can use the following backslash escapes for strings such as between the double quotes in contexts such as ``mlr filter '$name =~ "..."'``, ``mlr put '$name = $othername . "..."'``, ``mlr put '$name = sub($name, "...", "...")``, etc.: - -* ``\a``: ASCII code 0x07 (alarm/bell) -* ``\b``: ASCII code 0x08 (backspace) -* ``\f``: ASCII code 0x0c (formfeed) -* ``\n``: ASCII code 0x0a (LF/linefeed/newline) -* ``\r``: ASCII code 0x0d (CR/carriage return) -* ``\t``: ASCII code 0x09 (tab) -* ``\v``: ASCII code 0x0b (vertical tab) -* ``\\``: backslash -* ``\"``: double quote -* ``\123``: Octal 123, etc. for ``\000`` up to ``\377`` -* ``\x7f``: Hexadecimal 7f, etc. for ``\x00`` up to ``\xff`` - -See also https://en.wikipedia.org/wiki/Escape_sequences_in_C. - -These replacements apply only to strings you key in for the DSL expressions for ``filter`` and ``put``: that is, if you type ``\t`` in a string literal for a ``filter``/``put`` expression, it will be turned into a tab character. If you want a backslash followed by a ``t``, then please type ``\\t``. - -However, these replacements are not done automatically within your data stream. If you wish to make these replacements, you can do, for example, for a field named ``field``, ``mlr put '$field = gsub($field, "\\t", "\t")'``. If you need to make such a replacement for all fields in your data, you should probably simply use the system ``sed`` command. - diff --git a/docs6/reference-main-data-types.rst.in b/docs6/reference-main-data-types.rst.in deleted file mode 100644 index eb883f66e..000000000 --- a/docs6/reference-main-data-types.rst.in +++ /dev/null @@ -1,46 +0,0 @@ -Reference: data types -================================================================ - -Miller's input and output are all string-oriented: there is (as of August 2015 anyway) no support for binary record packing. In this sense, everything is a string in and out of Miller. During processing, field names are always strings, even if they have names like "3"; field values are usually strings. Field values' ability to be interpreted as a non-string type only has meaning when comparison or function operations are done on them. And it is an error condition if Miller encounters non-numeric (or otherwise mistyped) data in a field in which it has been asked to do numeric (or otherwise type-specific) operations. - -Field values are treated as numeric for the following: - -* Numeric sort: ``mlr sort -n``, ``mlr sort -nr``. -* Statistics: ``mlr histogram``, ``mlr stats1``, ``mlr stats2``. -* Cross-record arithmetic: ``mlr step``. - -For ``mlr put`` and ``mlr filter``: - -* Miller's types for function processing are **empty-null** (empty string), **absent-null** (reads of unset right-hand sides, or fall-through non-explicit return values from user-defined functions), **error**, **string**, **float** (double-precision), **int** (64-bit signed), and **boolean**. - -* On input, string values representable as numbers, e.g. "3" or "3.1", are treated as int or float, respectively. If a record has ``x=1,y=2`` then ``mlr put '$z=$x+$y'`` will produce ``x=1,y=2,z=3``, and ``mlr put '$z=$x.$y'`` does not give an error simply because the dot operator has been generalized to stringify non-strings. To coerce back to string for processing, use the ``string`` function: ``mlr put '$z=string($x).string($y)'`` will produce ``x=1,y=2,z=12``. - -* On input, string values representable as boolean (e.g. ``"true"``, ``"false"``) are *not* automatically treated as boolean. (This is because ``"true"`` and ``"false"`` are ordinary words, and auto string-to-boolean on a column consisting of words would result in some strings mixed with some booleans.) Use the ``boolean`` function to coerce: e.g. giving the record ``x=1,y=2,w=false`` to ``mlr put '$z=($x<$y) || boolean($w)'``. - -* Functions take types as described in ``mlr --help-all-functions``: for example, ``log10`` takes float input and produces float output, ``gmt2sec`` maps string to int, and ``sec2gmt`` maps int to string. - -* All math functions described in ``mlr --help-all-functions`` take integer as well as float input. - -String literals ----------------------------------------------------------------- - -You can use the following backslash escapes for strings such as between the double quotes in contexts such as ``mlr filter '$name =~ "..."'``, ``mlr put '$name = $othername . "..."'``, ``mlr put '$name = sub($name, "...", "...")``, etc.: - -* ``\a``: ASCII code 0x07 (alarm/bell) -* ``\b``: ASCII code 0x08 (backspace) -* ``\f``: ASCII code 0x0c (formfeed) -* ``\n``: ASCII code 0x0a (LF/linefeed/newline) -* ``\r``: ASCII code 0x0d (CR/carriage return) -* ``\t``: ASCII code 0x09 (tab) -* ``\v``: ASCII code 0x0b (vertical tab) -* ``\\``: backslash -* ``\"``: double quote -* ``\123``: Octal 123, etc. for ``\000`` up to ``\377`` -* ``\x7f``: Hexadecimal 7f, etc. for ``\x00`` up to ``\xff`` - -See also https://en.wikipedia.org/wiki/Escape_sequences_in_C. - -These replacements apply only to strings you key in for the DSL expressions for ``filter`` and ``put``: that is, if you type ``\t`` in a string literal for a ``filter``/``put`` expression, it will be turned into a tab character. If you want a backslash followed by a ``t``, then please type ``\\t``. - -However, these replacements are not done automatically within your data stream. If you wish to make these replacements, you can do, for example, for a field named ``field``, ``mlr put '$field = gsub($field, "\\t", "\t")'``. If you need to make such a replacement for all fields in your data, you should probably simply use the system ``sed`` command. - diff --git a/docs6/reference-main-env-vars.rst b/docs6/reference-main-env-vars.rst deleted file mode 100644 index a658cb097..000000000 --- a/docs6/reference-main-env-vars.rst +++ /dev/null @@ -1,12 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Reference: Miller environment variables -================================================================ - -The following environment variables affect how Miller works: - -* ``MLRRC``: see :doc:`customization` -* ``MLR_NO_COLOR``, ``MLR_ALWAYS_COLOR``, ``MLR_KEY_COLOR``, ``MLR_VALUE_COLOR``, ``MLR_PASS_COLOR``, ``MLR_FAIL_COLOR``, ``MLR_REPL_PS1_COLOR``, ``MLR_REPL_PS2_COLOR``, ``MLR_HELP_COLOR``, ``TERM``, * ``MSYSTEM``: see :doc:`output-colorization` -* ``MLR_REPL_PS1``, ``MLR_REPL_PS2``: see :doc:`repl` - diff --git a/docs6/reference-main-env-vars.rst.in b/docs6/reference-main-env-vars.rst.in deleted file mode 100644 index fd4b4ad74..000000000 --- a/docs6/reference-main-env-vars.rst.in +++ /dev/null @@ -1,9 +0,0 @@ -Reference: Miller environment variables -================================================================ - -The following environment variables affect how Miller works: - -* ``MLRRC``: see :doc:`customization` -* ``MLR_NO_COLOR``, ``MLR_ALWAYS_COLOR``, ``MLR_KEY_COLOR``, ``MLR_VALUE_COLOR``, ``MLR_PASS_COLOR``, ``MLR_FAIL_COLOR``, ``MLR_REPL_PS1_COLOR``, ``MLR_REPL_PS2_COLOR``, ``MLR_HELP_COLOR``, ``TERM``, * ``MSYSTEM``: see :doc:`output-colorization` -* ``MLR_REPL_PS1``, ``MLR_REPL_PS2``: see :doc:`repl` - diff --git a/docs6/reference-main-io-options.rst b/docs6/reference-main-io-options.rst deleted file mode 100644 index c5d58d87b..000000000 --- a/docs6/reference-main-io-options.rst +++ /dev/null @@ -1,156 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Reference: I/O options -=========================== - -Formats ----------------------------------------------------------------- - -Options: - -.. code-block:: none - - --dkvp --idkvp --odkvp - --nidx --inidx --onidx - --csv --icsv --ocsv - --csvlite --icsvlite --ocsvlite - --pprint --ipprint --opprint --right - --xtab --ixtab --oxtab - --json --ijson --ojson - -These are as discussed in :doc:`file-formats`, with the exception of ``--right`` which makes pretty-printed output right-aligned: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint cat data/small - a b i x y - pan pan 1 0.3467901443380824 0.7268028627434533 - eks pan 2 0.7586799647899636 0.5221511083334797 - wye wye 3 0.20460330576630303 0.33831852551664776 - eks wye 4 0.38139939387114097 0.13418874328430463 - wye pan 5 0.5732889198020006 0.8636244699032729 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint --right cat data/small - a b i x y - pan pan 1 0.3467901443380824 0.7268028627434533 - eks pan 2 0.7586799647899636 0.5221511083334797 - wye wye 3 0.20460330576630303 0.33831852551664776 - eks wye 4 0.38139939387114097 0.13418874328430463 - wye pan 5 0.5732889198020006 0.8636244699032729 - -Additional notes: - -* Use ``--csv``, ``--pprint``, etc. when the input and output formats are the same. - -* Use ``--icsv --opprint``, etc. when you want format conversion as part of what Miller does to your data. - -* DKVP (key-value-pair) format is the default for input and output. So, ``--oxtab`` is the same as ``--idkvp --oxtab``. - -**Pro-tip:** Please use either **--format1**, or **--iformat1 --oformat2**. If you use **--format1 --oformat2** then what happens is that flags are set up for input *and* output for format1, some of which are overwritten for output in format2. For technical reasons, having ``--oformat2`` clobber all the output-related effects of ``--format1`` also removes some flexibility from the command-line interface. See also https://github.com/johnkerl/miller/issues/180 and https://github.com/johnkerl/miller/issues/199. - -In-place mode ----------------------------------------------------------------- - -Use the ``mlr -I`` flag to process files in-place. For example, ``mlr -I --csv cut -x -f unwanted_column_name mydata/*.csv`` will remove ``unwanted_column_name`` from all your ``*.csv`` files in your ``mydata/`` subdirectory. - -By default, Miller output goes to the screen (or you can redirect a file using ``>`` or to another process using ``|``). With ``-I``, for each file name on the command line, output is written to a temporary file in the same directory. Miller writes its output into that temp file, which is then renamed over the original. Then, processing continues on the next file. Each file is processed in isolation: if the output format is CSV, CSV headers will be present in each output file; statistics are only over each file's own records; and so on. - -Please see :ref:`10min-choices-for-printing-to-files` for examples. - -Compression ----------------------------------------------------------------- - -Options: - -.. code-block:: none - - --prepipe {command} - - -The prepipe command is anything which reads from standard input and produces data acceptable to Miller. Nominally this allows you to use whichever decompression utilities you have installed on your system, on a per-file basis. If the command has flags, quote them: e.g. ``mlr --prepipe 'zcat -cf'``. Examples: - -.. code-block:: none - - # These two produce the same output: - $ gunzip < myfile1.csv.gz | mlr cut -f hostname,uptime - $ mlr --prepipe gunzip cut -f hostname,uptime myfile1.csv.gz - # With multiple input files you need --prepipe: - $ mlr --prepipe gunzip cut -f hostname,uptime myfile1.csv.gz myfile2.csv.gz - $ mlr --prepipe gunzip --idkvp --oxtab cut -f hostname,uptime myfile1.dat.gz myfile2.dat.gz - -.. code-block:: none - - # Similar to the above, but with compressed output as well as input: - $ gunzip < myfile1.csv.gz | mlr cut -f hostname,uptime | gzip > outfile.csv.gz - $ mlr --prepipe gunzip cut -f hostname,uptime myfile1.csv.gz | gzip > outfile.csv.gz - $ mlr --prepipe gunzip cut -f hostname,uptime myfile1.csv.gz myfile2.csv.gz | gzip > outfile.csv.gz - -.. code-block:: none - - # Similar to the above, but with different compression tools for input and output: - $ gunzip < myfile1.csv.gz | mlr cut -f hostname,uptime | xz -z > outfile.csv.xz - $ xz -cd < myfile1.csv.xz | mlr cut -f hostname,uptime | gzip > outfile.csv.xz - $ mlr --prepipe 'xz -cd' cut -f hostname,uptime myfile1.csv.xz myfile2.csv.xz | xz -z > outfile.csv.xz - -.. _reference-separators: - -Record/field/pair separators ----------------------------------------------------------------- - -Miller has record separators ``IRS`` and ``ORS``, field separators ``IFS`` and ``OFS``, and pair separators ``IPS`` and ``OPS``. For example, in the DKVP line ``a=1,b=2,c=3``, the record separator is newline, field separator is comma, and pair separator is the equals sign. These are the default values. - -Options: - -.. code-block:: none - - --rs --irs --ors - --fs --ifs --ofs --repifs - --ps --ips --ops - -* You can change a separator from input to output via e.g. ``--ifs = --ofs :``. Or, you can specify that the same separator is to be used for input and output via e.g. ``--fs :``. - -* The pair separator is only relevant to DKVP format. - -* Pretty-print and xtab formats ignore the separator arguments altogether. - -* The ``--repifs`` means that multiple successive occurrences of the field separator count as one. For example, in CSV data we often signify nulls by empty strings, e.g. ``2,9,,,,,6,5,4``. On the other hand, if the field separator is a space, it might be more natural to parse ``2 4 5`` the same as ``2 4 5``: ``--repifs --ifs ' '`` lets this happen. In fact, the ``--ipprint`` option above is internally implemented in terms of ``--repifs``. - -* Just write out the desired separator, e.g. ``--ofs '|'``. But you may use the symbolic names ``newline``, ``space``, ``tab``, ``pipe``, or ``semicolon`` if you like. - -Number formatting ----------------------------------------------------------------- - -The command-line option ``--ofmt {format string}`` is the global number format for commands which generate numeric output, e.g. ``stats1``, ``stats2``, ``histogram``, and ``step``, as well as ``mlr put``. Examples: - -.. code-block:: none - - --ofmt %.9le --ofmt %.6lf --ofmt %.0lf - -These are just familiar ``printf`` formats applied to double-precision numbers. Please don't use ``%s`` or ``%d``. Additionally, if you use leading width (e.g. ``%18.12lf``) then the output will contain embedded whitespace, which may not be what you want if you pipe the output to something else, particularly CSV. I use Miller's pretty-print format (``mlr --opprint``) to column-align numerical data. - -To apply formatting to a single field, overriding the global ``ofmt``, use ``fmtnum`` function within ``mlr put``. For example: - -.. code-block:: none - :emphasize-lines: 1-1 - - echo 'x=3.1,y=4.3' | mlr put '$z=fmtnum($x*$y,"%08lf")' - x=3.1,y=4.3,z=%!l(float64=00013.33)f - -.. code-block:: none - :emphasize-lines: 1-1 - - echo 'x=0xffff,y=0xff' | mlr put '$z=fmtnum(int($x*$y),"%08llx")' - x=0xffff,y=0xff,z=%!l(int=16711425)lx - -Input conversion from hexadecimal is done automatically on fields handled by ``mlr put`` and ``mlr filter`` as long as the field value begins with "0x". To apply output conversion to hexadecimal on a single column, you may use ``fmtnum``, or the keystroke-saving ``hexfmt`` function. Example: - -.. code-block:: none - :emphasize-lines: 1-1 - - echo 'x=0xffff,y=0xff' | mlr put '$z=hexfmt($x*$y)' - x=0xffff,y=0xff,z=0xfeff01 diff --git a/docs6/reference-main-io-options.rst.in b/docs6/reference-main-io-options.rst.in deleted file mode 100644 index 4a3404815..000000000 --- a/docs6/reference-main-io-options.rst.in +++ /dev/null @@ -1,133 +0,0 @@ -Reference: I/O options -=========================== - -Formats ----------------------------------------------------------------- - -Options: - -GENRST_CARDIFY ---dkvp --idkvp --odkvp ---nidx --inidx --onidx ---csv --icsv --ocsv ---csvlite --icsvlite --ocsvlite ---pprint --ipprint --opprint --right ---xtab --ixtab --oxtab ---json --ijson --ojson -GENRST_EOF - -These are as discussed in :doc:`file-formats`, with the exception of ``--right`` which makes pretty-printed output right-aligned: - -GENRST_RUN_COMMAND -mlr --opprint cat data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint --right cat data/small -GENRST_EOF - -Additional notes: - -* Use ``--csv``, ``--pprint``, etc. when the input and output formats are the same. - -* Use ``--icsv --opprint``, etc. when you want format conversion as part of what Miller does to your data. - -* DKVP (key-value-pair) format is the default for input and output. So, ``--oxtab`` is the same as ``--idkvp --oxtab``. - -**Pro-tip:** Please use either **--format1**, or **--iformat1 --oformat2**. If you use **--format1 --oformat2** then what happens is that flags are set up for input *and* output for format1, some of which are overwritten for output in format2. For technical reasons, having ``--oformat2`` clobber all the output-related effects of ``--format1`` also removes some flexibility from the command-line interface. See also https://github.com/johnkerl/miller/issues/180 and https://github.com/johnkerl/miller/issues/199. - -In-place mode ----------------------------------------------------------------- - -Use the ``mlr -I`` flag to process files in-place. For example, ``mlr -I --csv cut -x -f unwanted_column_name mydata/*.csv`` will remove ``unwanted_column_name`` from all your ``*.csv`` files in your ``mydata/`` subdirectory. - -By default, Miller output goes to the screen (or you can redirect a file using ``>`` or to another process using ``|``). With ``-I``, for each file name on the command line, output is written to a temporary file in the same directory. Miller writes its output into that temp file, which is then renamed over the original. Then, processing continues on the next file. Each file is processed in isolation: if the output format is CSV, CSV headers will be present in each output file; statistics are only over each file's own records; and so on. - -Please see :ref:`10min-choices-for-printing-to-files` for examples. - -Compression ----------------------------------------------------------------- - -Options: - -GENRST_CARDIFY ---prepipe {command} -GENRST_EOF - - -The prepipe command is anything which reads from standard input and produces data acceptable to Miller. Nominally this allows you to use whichever decompression utilities you have installed on your system, on a per-file basis. If the command has flags, quote them: e.g. ``mlr --prepipe 'zcat -cf'``. Examples: - -GENRST_CARDIFY -# These two produce the same output: -$ gunzip < myfile1.csv.gz | mlr cut -f hostname,uptime -$ mlr --prepipe gunzip cut -f hostname,uptime myfile1.csv.gz -# With multiple input files you need --prepipe: -$ mlr --prepipe gunzip cut -f hostname,uptime myfile1.csv.gz myfile2.csv.gz -$ mlr --prepipe gunzip --idkvp --oxtab cut -f hostname,uptime myfile1.dat.gz myfile2.dat.gz -GENRST_EOF - -GENRST_CARDIFY -# Similar to the above, but with compressed output as well as input: -$ gunzip < myfile1.csv.gz | mlr cut -f hostname,uptime | gzip > outfile.csv.gz -$ mlr --prepipe gunzip cut -f hostname,uptime myfile1.csv.gz | gzip > outfile.csv.gz -$ mlr --prepipe gunzip cut -f hostname,uptime myfile1.csv.gz myfile2.csv.gz | gzip > outfile.csv.gz -GENRST_EOF - -GENRST_CARDIFY -# Similar to the above, but with different compression tools for input and output: -$ gunzip < myfile1.csv.gz | mlr cut -f hostname,uptime | xz -z > outfile.csv.xz -$ xz -cd < myfile1.csv.xz | mlr cut -f hostname,uptime | gzip > outfile.csv.xz -$ mlr --prepipe 'xz -cd' cut -f hostname,uptime myfile1.csv.xz myfile2.csv.xz | xz -z > outfile.csv.xz -GENRST_EOF - -.. _reference-separators: - -Record/field/pair separators ----------------------------------------------------------------- - -Miller has record separators ``IRS`` and ``ORS``, field separators ``IFS`` and ``OFS``, and pair separators ``IPS`` and ``OPS``. For example, in the DKVP line ``a=1,b=2,c=3``, the record separator is newline, field separator is comma, and pair separator is the equals sign. These are the default values. - -Options: - -GENRST_CARDIFY ---rs --irs --ors ---fs --ifs --ofs --repifs ---ps --ips --ops -GENRST_EOF - -* You can change a separator from input to output via e.g. ``--ifs = --ofs :``. Or, you can specify that the same separator is to be used for input and output via e.g. ``--fs :``. - -* The pair separator is only relevant to DKVP format. - -* Pretty-print and xtab formats ignore the separator arguments altogether. - -* The ``--repifs`` means that multiple successive occurrences of the field separator count as one. For example, in CSV data we often signify nulls by empty strings, e.g. ``2,9,,,,,6,5,4``. On the other hand, if the field separator is a space, it might be more natural to parse ``2 4 5`` the same as ``2 4 5``: ``--repifs --ifs ' '`` lets this happen. In fact, the ``--ipprint`` option above is internally implemented in terms of ``--repifs``. - -* Just write out the desired separator, e.g. ``--ofs '|'``. But you may use the symbolic names ``newline``, ``space``, ``tab``, ``pipe``, or ``semicolon`` if you like. - -Number formatting ----------------------------------------------------------------- - -The command-line option ``--ofmt {format string}`` is the global number format for commands which generate numeric output, e.g. ``stats1``, ``stats2``, ``histogram``, and ``step``, as well as ``mlr put``. Examples: - -GENRST_CARDIFY ---ofmt %.9le --ofmt %.6lf --ofmt %.0lf -GENRST_EOF - -These are just familiar ``printf`` formats applied to double-precision numbers. Please don't use ``%s`` or ``%d``. Additionally, if you use leading width (e.g. ``%18.12lf``) then the output will contain embedded whitespace, which may not be what you want if you pipe the output to something else, particularly CSV. I use Miller's pretty-print format (``mlr --opprint``) to column-align numerical data. - -To apply formatting to a single field, overriding the global ``ofmt``, use ``fmtnum`` function within ``mlr put``. For example: - -GENRST_RUN_COMMAND -echo 'x=3.1,y=4.3' | mlr put '$z=fmtnum($x*$y,"%08lf")' -GENRST_EOF - -GENRST_RUN_COMMAND -echo 'x=0xffff,y=0xff' | mlr put '$z=fmtnum(int($x*$y),"%08llx")' -GENRST_EOF - -Input conversion from hexadecimal is done automatically on fields handled by ``mlr put`` and ``mlr filter`` as long as the field value begins with "0x". To apply output conversion to hexadecimal on a single column, you may use ``fmtnum``, or the keystroke-saving ``hexfmt`` function. Example: - -GENRST_RUN_COMMAND -echo 'x=0xffff,y=0xff' | mlr put '$z=hexfmt($x*$y)' -GENRST_EOF diff --git a/docs6/reference-main-null-data.rst b/docs6/reference-main-null-data.rst deleted file mode 100644 index 5afd1068a..000000000 --- a/docs6/reference-main-null-data.rst +++ /dev/null @@ -1,148 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Reference: null data -================================================================ - -One of Miller's key features is its support for **heterogeneous** data. For example, take ``mlr sort``: if you try to sort on field ``hostname`` when not all records in the data stream *have* a field named ``hostname``, it is not an error (although you could pre-filter the data stream using ``mlr having-fields --at-least hostname then sort ...``). Rather, records lacking one or more sort keys are simply output contiguously by ``mlr sort``. - -Miller has two kinds of null data: - -* **Empty (key present, value empty)**: a field name is present in a record (or in an out-of-stream variable) with empty value: e.g. ``x=,y=2`` in the data input stream, or assignment ``$x=""`` or ``@x=""`` in ``mlr put``. - -* **Absent (key not present)**: a field name is not present, e.g. input record is ``x=1,y=2`` and a ``put`` or ``filter`` expression refers to ``$z``. Or, reading an out-of-stream variable which hasn't been assigned a value yet, e.g. ``mlr put -q '@sum += $x; end{emit @sum}'`` or ``mlr put -q '@sum[$a][$b] += $x; end{emit @sum, "a", "b"}'``. - -You can test these programatically using the functions ``is_empty``/``is_not_empty``, ``is_absent``/``is_present``, and ``is_null``/``is_not_null``. For the last pair, note that null means either empty or absent. - -Rules for null-handling: - -* Records with one or more empty sort-field values sort after records with all sort-field values present: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr cat data/sort-null.dat - a=3,b=2 - a=1,b=8 - a=,b=4 - x=9,b=10 - a=5,b=7 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr sort -n a data/sort-null.dat - a=1,b=8 - a=3,b=2 - a=5,b=7 - a=,b=4 - x=9,b=10 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr sort -nr a data/sort-null.dat - a=,b=4 - a=5,b=7 - a=3,b=2 - a=1,b=8 - x=9,b=10 - -* Functions/operators which have one or more *empty* arguments produce empty output: e.g. - -.. code-block:: none - :emphasize-lines: 1-1 - - echo 'x=2,y=3' | mlr put '$a=$x+$y' - x=2,y=3,a=5 - -.. code-block:: none - :emphasize-lines: 1-1 - - echo 'x=,y=3' | mlr put '$a=$x+$y' - x=,y=3,a= - -.. code-block:: none - :emphasize-lines: 1-1 - - echo 'x=,y=3' | mlr put '$a=log($x);$b=log($y)' - x=,y=3,a=,b=1.0986122886681096 - -with the exception that the ``min`` and ``max`` functions are special: if one argument is non-null, it wins: - -.. code-block:: none - :emphasize-lines: 1-1 - - echo 'x=,y=3' | mlr put '$a=min($x,$y);$b=max($x,$y)' - x=,y=3,a=3,b= - -* Functions of *absent* variables (e.g. ``mlr put '$y = log10($nonesuch)'``) evaluate to absent, and arithmetic/bitwise/boolean operators with both operands being absent evaluate to absent. Arithmetic operators with one absent operand return the other operand. More specifically, absent values act like zero for addition/subtraction, and one for multiplication: Furthermore, **any expression which evaluates to absent is not stored in the left-hand side of an assignment statement**: - -.. code-block:: none - :emphasize-lines: 1-1 - - echo 'x=2,y=3' | mlr put '$a=$u+$v; $b=$u+$y; $c=$x+$y' - x=2,y=3,b=3,c=5 - -.. code-block:: none - :emphasize-lines: 1-1 - - echo 'x=2,y=3' | mlr put '$a=min($x,$v);$b=max($u,$y);$c=min($u,$v)' - x=2,y=3,a=2,b=3 - -* Likewise, for assignment to maps, **absent-valued keys or values result in a skipped assignment**. - -The reasoning is as follows: - -* Empty values are explicit in the data so they should explicitly affect accumulations: ``mlr put '@sum += $x'`` should accumulate numeric ``x`` values into the sum but an empty ``x``, when encountered in the input data stream, should make the sum non-numeric. To work around this you can use the ``is_not_null`` function as follows: ``mlr put 'is_not_null($x) { @sum += $x }'`` - -* Absent stream-record values should not break accumulations, since Miller by design handles heterogenous data: the running ``@sum`` in ``mlr put '@sum += $x'`` should not be invalidated for records which have no ``x``. - -* Absent out-of-stream-variable values are precisely what allow you to write ``mlr put '@sum += $x'``. Otherwise you would have to write ``mlr put 'begin{@sum = 0}; @sum += $x'`` -- which is tolerable -- but for ``mlr put 'begin{...}; @sum[$a][$b] += $x'`` you'd have to pre-initialize ``@sum`` for all values of ``$a`` and ``$b`` in your input data stream, which is intolerable. - -* The penalty for the absent feature is that misspelled variables can be hard to find: e.g. in ``mlr put 'begin{@sumx = 10}; ...; update @sumx somehow per-record; ...; end {@something = @sum * 2}'`` the accumulator is spelt ``@sumx`` in the begin-block but ``@sum`` in the end-block, where since it is absent, ``@sum*2`` evaluates to 2. See also the section on :doc:`reference-dsl-errors`. - -Since absent plus absent is absent (and likewise for other operators), accumulations such as ``@sum += $x`` work correctly on heterogenous data, as do within-record formulas if both operands are absent. If one operand is present, you may get behavior you don't desire. To work around this -- namely, to set an output field only for records which have all the inputs present -- you can use a pattern-action block with ``is_present``: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr cat data/het.dkvp - resource=/path/to/file,loadsec=0.45,ok=true - record_count=100,resource=/path/to/file - resource=/path/to/second/file,loadsec=0.32,ok=true - record_count=150,resource=/path/to/second/file - resource=/some/other/path,loadsec=0.97,ok=false - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put 'is_present($loadsec) { $loadmillis = $loadsec * 1000 }' data/het.dkvp - resource=/path/to/file,loadsec=0.45,ok=true,loadmillis=450 - record_count=100,resource=/path/to/file - resource=/path/to/second/file,loadsec=0.32,ok=true,loadmillis=320 - record_count=150,resource=/path/to/second/file - resource=/some/other/path,loadsec=0.97,ok=false,loadmillis=970 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put '$loadmillis = (is_present($loadsec) ? $loadsec : 0.0) * 1000' data/het.dkvp - resource=/path/to/file,loadsec=0.45,ok=true,loadmillis=450 - record_count=100,resource=/path/to/file,loadmillis=0 - resource=/path/to/second/file,loadsec=0.32,ok=true,loadmillis=320 - record_count=150,resource=/path/to/second/file,loadmillis=0 - resource=/some/other/path,loadsec=0.97,ok=false,loadmillis=970 - -If you're interested in a formal description of how empty and absent fields participate in arithmetic, here's a table for plus (other arithmetic/boolean/bitwise operators are similar): - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr help type-arithmetic-info - (+) | 1 2.5 (absent) (error) - ------ + ------ ------ ------ ------ - 1 | 2 3.5 1 (error) - 2.5 | 3.5 5 2.5 (error) - (absent) | 1 2.5 (absent) (error) - (error) | (error) (error) (error) (error) diff --git a/docs6/reference-main-null-data.rst.in b/docs6/reference-main-null-data.rst.in deleted file mode 100644 index ec61d1f83..000000000 --- a/docs6/reference-main-null-data.rst.in +++ /dev/null @@ -1,90 +0,0 @@ -Reference: null data -================================================================ - -One of Miller's key features is its support for **heterogeneous** data. For example, take ``mlr sort``: if you try to sort on field ``hostname`` when not all records in the data stream *have* a field named ``hostname``, it is not an error (although you could pre-filter the data stream using ``mlr having-fields --at-least hostname then sort ...``). Rather, records lacking one or more sort keys are simply output contiguously by ``mlr sort``. - -Miller has two kinds of null data: - -* **Empty (key present, value empty)**: a field name is present in a record (or in an out-of-stream variable) with empty value: e.g. ``x=,y=2`` in the data input stream, or assignment ``$x=""`` or ``@x=""`` in ``mlr put``. - -* **Absent (key not present)**: a field name is not present, e.g. input record is ``x=1,y=2`` and a ``put`` or ``filter`` expression refers to ``$z``. Or, reading an out-of-stream variable which hasn't been assigned a value yet, e.g. ``mlr put -q '@sum += $x; end{emit @sum}'`` or ``mlr put -q '@sum[$a][$b] += $x; end{emit @sum, "a", "b"}'``. - -You can test these programatically using the functions ``is_empty``/``is_not_empty``, ``is_absent``/``is_present``, and ``is_null``/``is_not_null``. For the last pair, note that null means either empty or absent. - -Rules for null-handling: - -* Records with one or more empty sort-field values sort after records with all sort-field values present: - -GENRST_RUN_COMMAND -mlr cat data/sort-null.dat -GENRST_EOF - -GENRST_RUN_COMMAND -mlr sort -n a data/sort-null.dat -GENRST_EOF - -GENRST_RUN_COMMAND -mlr sort -nr a data/sort-null.dat -GENRST_EOF - -* Functions/operators which have one or more *empty* arguments produce empty output: e.g. - -GENRST_RUN_COMMAND -echo 'x=2,y=3' | mlr put '$a=$x+$y' -GENRST_EOF - -GENRST_RUN_COMMAND -echo 'x=,y=3' | mlr put '$a=$x+$y' -GENRST_EOF - -GENRST_RUN_COMMAND -echo 'x=,y=3' | mlr put '$a=log($x);$b=log($y)' -GENRST_EOF - -with the exception that the ``min`` and ``max`` functions are special: if one argument is non-null, it wins: - -GENRST_RUN_COMMAND -echo 'x=,y=3' | mlr put '$a=min($x,$y);$b=max($x,$y)' -GENRST_EOF - -* Functions of *absent* variables (e.g. ``mlr put '$y = log10($nonesuch)'``) evaluate to absent, and arithmetic/bitwise/boolean operators with both operands being absent evaluate to absent. Arithmetic operators with one absent operand return the other operand. More specifically, absent values act like zero for addition/subtraction, and one for multiplication: Furthermore, **any expression which evaluates to absent is not stored in the left-hand side of an assignment statement**: - -GENRST_RUN_COMMAND -echo 'x=2,y=3' | mlr put '$a=$u+$v; $b=$u+$y; $c=$x+$y' -GENRST_EOF - -GENRST_RUN_COMMAND -echo 'x=2,y=3' | mlr put '$a=min($x,$v);$b=max($u,$y);$c=min($u,$v)' -GENRST_EOF - -* Likewise, for assignment to maps, **absent-valued keys or values result in a skipped assignment**. - -The reasoning is as follows: - -* Empty values are explicit in the data so they should explicitly affect accumulations: ``mlr put '@sum += $x'`` should accumulate numeric ``x`` values into the sum but an empty ``x``, when encountered in the input data stream, should make the sum non-numeric. To work around this you can use the ``is_not_null`` function as follows: ``mlr put 'is_not_null($x) { @sum += $x }'`` - -* Absent stream-record values should not break accumulations, since Miller by design handles heterogenous data: the running ``@sum`` in ``mlr put '@sum += $x'`` should not be invalidated for records which have no ``x``. - -* Absent out-of-stream-variable values are precisely what allow you to write ``mlr put '@sum += $x'``. Otherwise you would have to write ``mlr put 'begin{@sum = 0}; @sum += $x'`` -- which is tolerable -- but for ``mlr put 'begin{...}; @sum[$a][$b] += $x'`` you'd have to pre-initialize ``@sum`` for all values of ``$a`` and ``$b`` in your input data stream, which is intolerable. - -* The penalty for the absent feature is that misspelled variables can be hard to find: e.g. in ``mlr put 'begin{@sumx = 10}; ...; update @sumx somehow per-record; ...; end {@something = @sum * 2}'`` the accumulator is spelt ``@sumx`` in the begin-block but ``@sum`` in the end-block, where since it is absent, ``@sum*2`` evaluates to 2. See also the section on :doc:`reference-dsl-errors`. - -Since absent plus absent is absent (and likewise for other operators), accumulations such as ``@sum += $x`` work correctly on heterogenous data, as do within-record formulas if both operands are absent. If one operand is present, you may get behavior you don't desire. To work around this -- namely, to set an output field only for records which have all the inputs present -- you can use a pattern-action block with ``is_present``: - -GENRST_RUN_COMMAND -mlr cat data/het.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put 'is_present($loadsec) { $loadmillis = $loadsec * 1000 }' data/het.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put '$loadmillis = (is_present($loadsec) ? $loadsec : 0.0) * 1000' data/het.dkvp -GENRST_EOF - -If you're interested in a formal description of how empty and absent fields participate in arithmetic, here's a table for plus (other arithmetic/boolean/bitwise operators are similar): - -GENRST_RUN_COMMAND -mlr help type-arithmetic-info -GENRST_EOF diff --git a/docs6/reference-main-online-help.rst b/docs6/reference-main-online-help.rst deleted file mode 100644 index ad006fe51..000000000 --- a/docs6/reference-main-online-help.rst +++ /dev/null @@ -1,43 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Reference: online help -================================================================ - -TODO: expand this section - -Examples: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --help - Usage: mlr [I/O options] {verb} [verb-dependent options ...] {zero or more file names} - Output of one verb may be chained as input to another using "then", e.g. - mlr stats1 -a min,mean,max -f flag,u,v -g color then sort -f color - Please see 'mlr help topics' for more information. - Please also see https://johnkerl.org/miller6 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr sort --help - Usage: mlr sort {flags} - Sorts records primarily by the first specified field, secondarily by the second - field, and so on. (Any records not having all specified sort keys will appear - at the end of the output, in the order they were encountered, regardless of the - specified sort order.) The sort is stable: records that compare equal will sort - in the order they were encountered in the input record stream. - - Options: - -f {comma-separated field names} Lexical ascending - -n {comma-separated field names} Numerical ascending; nulls sort last - -nf {comma-separated field names} Same as -n - -r {comma-separated field names} Lexical descending - -nr {comma-separated field names} Numerical descending; nulls sort first - -h|--help Show this message. - - Example: - mlr sort -f a,b -nr x,y,z - which is the same as: - mlr sort -f a -f b -nr x -nr y -nr z diff --git a/docs6/reference-main-online-help.rst.in b/docs6/reference-main-online-help.rst.in deleted file mode 100644 index 6607c6c1d..000000000 --- a/docs6/reference-main-online-help.rst.in +++ /dev/null @@ -1,14 +0,0 @@ -Reference: online help -================================================================ - -TODO: expand this section - -Examples: - -GENRST_RUN_COMMAND -mlr --help -GENRST_EOF - -GENRST_RUN_COMMAND -mlr sort --help -GENRST_EOF diff --git a/docs6/reference-main-overview.rst b/docs6/reference-main-overview.rst deleted file mode 100644 index 4573d1cf5..000000000 --- a/docs6/reference-main-overview.rst +++ /dev/null @@ -1,78 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Reference: Miller commands -=============================== - -Overview ----------------------------------------------------------------- - -The outline of an invocation of Miller is - -* ``mlr`` -* Options controlling input/output formatting, etc. (:doc:`reference-main-io-options`). -* One or more verbs (such as ``cut``, ``sort``, etc.) (:doc:`reference-verbs`) -- chained together using ``then`` (:doc:`reference-main-then-chaining`). You use these to transform your data. -* Zero or more filenames, with input taken from standard input if there are no filenames present. - -For example, reading from a file: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --opprint head -n 2 then sort -f shape example.csv - color shape flag index quantity rate - red square true 15 79.2778 0.0130 - yellow triangle true 11 43.6498 9.8870 - -Reading from standard input: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat example.csv | mlr --icsv --opprint head -n 2 then sort -f shape - color shape flag index quantity rate - red square true 15 79.2778 0.0130 - yellow triangle true 11 43.6498 9.8870 - -The rest of this reference section gives you full information on each of these parts of the command line. - -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 :doc:`reference-dsl`. - -Here's a comparison of verbs and ``put``/``filter`` DSL expressions: - -Example of using a verb for data processing: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr stats1 -a sum -f x -g a data/small - a=pan,x_sum=0.3467901443380824 - a=eks,x_sum=1.1400793586611044 - a=wye,x_sum=0.7778922255683036 - -* 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: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put -q '@x_sum[$a] += $x; end{emit @x_sum, "a"}' data/small - a=pan,x_sum=0.3467901443380824 - a=eks,x_sum=1.1400793586611044 - a=wye,x_sum=0.7778922255683036 - -* 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 diff --git a/docs6/reference-main-overview.rst.in b/docs6/reference-main-overview.rst.in deleted file mode 100644 index 387fb4389..000000000 --- a/docs6/reference-main-overview.rst.in +++ /dev/null @@ -1,59 +0,0 @@ -Reference: Miller commands -=============================== - -Overview ----------------------------------------------------------------- - -The outline of an invocation of Miller is - -* ``mlr`` -* Options controlling input/output formatting, etc. (:doc:`reference-main-io-options`). -* One or more verbs (such as ``cut``, ``sort``, etc.) (:doc:`reference-verbs`) -- chained together using ``then`` (:doc:`reference-main-then-chaining`). You use these to transform your data. -* Zero or more filenames, with input taken from standard input if there are no filenames present. - -For example, reading from a file: - -GENRST_RUN_COMMAND -mlr --icsv --opprint head -n 2 then sort -f shape example.csv -GENRST_EOF - -Reading from standard input: - -GENRST_RUN_COMMAND -cat example.csv | mlr --icsv --opprint head -n 2 then sort -f shape -GENRST_EOF - -The rest of this reference section gives you full information on each of these parts of the command line. - -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 :doc:`reference-dsl`. - -Here's a comparison of verbs and ``put``/``filter`` DSL expressions: - -Example of using a verb for data processing: - -GENRST_RUN_COMMAND -mlr stats1 -a sum -f x -g a data/small -GENRST_EOF - -* 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: - -GENRST_RUN_COMMAND -mlr put -q '@x_sum[$a] += $x; end{emit @x_sum, "a"}' data/small -GENRST_EOF - -* 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 diff --git a/docs6/reference-main-regular-expressions.rst b/docs6/reference-main-regular-expressions.rst deleted file mode 100644 index 630a652b5..000000000 --- a/docs6/reference-main-regular-expressions.rst +++ /dev/null @@ -1,83 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Reference: regular expressions -================================================================ - -Miller lets you use regular expressions (of type POSIX.2) in the following contexts: - -* In ``mlr filter`` with ``=~`` or ``!=~``, e.g. ``mlr filter '$url =~ "http.*com"'`` - -* In ``mlr put`` with ``sub`` or ``gsub``, e.g. ``mlr put '$url = sub($url, "http.*com", "")'`` - -* In ``mlr having-fields``, e.g. ``mlr having-fields --any-matching '^sda[0-9]'`` - -* In ``mlr cut``, e.g. ``mlr cut -r -f '^status$,^sda[0-9]'`` - -* In ``mlr rename``, e.g. ``mlr rename -r '^(sda[0-9]).*$,dev/\1'`` - -* In ``mlr grep``, e.g. ``mlr --csv grep 00188555487 myfiles*.csv`` - -Points demonstrated by the above examples: - -* There are no implicit start-of-string or end-of-string anchors; please use ``^`` and/or ``$`` explicitly. - -* Miller regexes are wrapped with double quotes rather than slashes. - -* The ``i`` after the ending double quote indicates a case-insensitive regex. - -* Capture groups are wrapped with ``(...)`` rather than ``\(...\)``; use ``\(`` and ``\)`` to match against parentheses. - -For ``filter`` and ``put``, if the regular expression is a string literal (the normal case), it is precompiled at process start and reused thereafter, which is efficient. If the regular expression is a more complex expression, including string concatenation using ``.``, or a column name (in which case you can take regular expressions from input data!), then regexes are compiled on each record which works but is less efficient. As well, in this case there is no way to specify case-insensitive matching. - -Example: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/regex-in-data.dat - name=jane,regex=^j.*e$ - name=bill,regex=^b[ou]ll$ - name=bull,regex=^b[ou]ll$ - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr filter '$name =~ $regex' data/regex-in-data.dat - name=jane,regex=^j.*e$ - name=bull,regex=^b[ou]ll$ - -Regex captures ----------------------------------------------------------------- - -Regex captures of the form ``\0`` through ``\9`` are supported as - -* Captures have in-function context for ``sub`` and ``gsub``. For example, the first ``\1,\2`` pair belong to the first ``sub`` and the second ``\1,\2`` pair belong to the second ``sub``: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put '$b = sub($a, "(..)_(...)", "\2-\1"); $c = sub($a, "(..)_(.)(..)", ":\1:\2:\3")' - -* Captures endure for the entirety of a ``put`` for the ``=~`` and ``!=~`` operators. For example, here the ``\1,\2`` are set by the ``=~`` operator and are used by both subsequent assignment statements: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put '$a =~ "(..)_(....); $b = "left_\1"; $c = "right_\2"' - -* The captures are not retained across multiple puts. For example, here the ``\1,\2`` won't be expanded from the regex capture: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put '$a =~ "(..)_(....)' then {... something else ...} then put '$b = "left_\1"; $c = "right_\2"' - -* Captures are ignored in ``filter`` for the ``=~`` and ``!=~`` operators. For example, there is no mechanism provided to refer to the first ``(..)`` as ``\1`` or to the second ``(....)`` as ``\2`` in the following filter statement: - -.. code-block:: none - - mlr filter '$a =~ "(..)_(....)' - -* Up to nine matches are supported: ``\1`` through ``\9``, while ``\0`` is the entire match string; ``\15`` is treated as ``\1`` followed by an unrelated ``5``. - diff --git a/docs6/reference-main-regular-expressions.rst.in b/docs6/reference-main-regular-expressions.rst.in deleted file mode 100644 index d94730420..000000000 --- a/docs6/reference-main-regular-expressions.rst.in +++ /dev/null @@ -1,70 +0,0 @@ -Reference: regular expressions -================================================================ - -Miller lets you use regular expressions (of type POSIX.2) in the following contexts: - -* In ``mlr filter`` with ``=~`` or ``!=~``, e.g. ``mlr filter '$url =~ "http.*com"'`` - -* In ``mlr put`` with ``sub`` or ``gsub``, e.g. ``mlr put '$url = sub($url, "http.*com", "")'`` - -* In ``mlr having-fields``, e.g. ``mlr having-fields --any-matching '^sda[0-9]'`` - -* In ``mlr cut``, e.g. ``mlr cut -r -f '^status$,^sda[0-9]'`` - -* In ``mlr rename``, e.g. ``mlr rename -r '^(sda[0-9]).*$,dev/\1'`` - -* In ``mlr grep``, e.g. ``mlr --csv grep 00188555487 myfiles*.csv`` - -Points demonstrated by the above examples: - -* There are no implicit start-of-string or end-of-string anchors; please use ``^`` and/or ``$`` explicitly. - -* Miller regexes are wrapped with double quotes rather than slashes. - -* The ``i`` after the ending double quote indicates a case-insensitive regex. - -* Capture groups are wrapped with ``(...)`` rather than ``\(...\)``; use ``\(`` and ``\)`` to match against parentheses. - -For ``filter`` and ``put``, if the regular expression is a string literal (the normal case), it is precompiled at process start and reused thereafter, which is efficient. If the regular expression is a more complex expression, including string concatenation using ``.``, or a column name (in which case you can take regular expressions from input data!), then regexes are compiled on each record which works but is less efficient. As well, in this case there is no way to specify case-insensitive matching. - -Example: - -GENRST_RUN_COMMAND -cat data/regex-in-data.dat -GENRST_EOF - -GENRST_RUN_COMMAND -mlr filter '$name =~ $regex' data/regex-in-data.dat -GENRST_EOF - -Regex captures ----------------------------------------------------------------- - -Regex captures of the form ``\0`` through ``\9`` are supported as - -* Captures have in-function context for ``sub`` and ``gsub``. For example, the first ``\1,\2`` pair belong to the first ``sub`` and the second ``\1,\2`` pair belong to the second ``sub``: - -GENRST_SHOW_COMMAND -mlr put '$b = sub($a, "(..)_(...)", "\2-\1"); $c = sub($a, "(..)_(.)(..)", ":\1:\2:\3")' -GENRST_EOF - -* Captures endure for the entirety of a ``put`` for the ``=~`` and ``!=~`` operators. For example, here the ``\1,\2`` are set by the ``=~`` operator and are used by both subsequent assignment statements: - -GENRST_SHOW_COMMAND -mlr put '$a =~ "(..)_(....); $b = "left_\1"; $c = "right_\2"' -GENRST_EOF - -* The captures are not retained across multiple puts. For example, here the ``\1,\2`` won't be expanded from the regex capture: - -GENRST_SHOW_COMMAND -mlr put '$a =~ "(..)_(....)' then {... something else ...} then put '$b = "left_\1"; $c = "right_\2"' -GENRST_EOF - -* Captures are ignored in ``filter`` for the ``=~`` and ``!=~`` operators. For example, there is no mechanism provided to refer to the first ``(..)`` as ``\1`` or to the second ``(....)`` as ``\2`` in the following filter statement: - -GENRST_CARDIFY -mlr filter '$a =~ "(..)_(....)' -GENRST_EOF - -* Up to nine matches are supported: ``\1`` through ``\9``, while ``\0`` is the entire match string; ``\15`` is treated as ``\1`` followed by an unrelated ``5``. - diff --git a/docs6/reference-main-then-chaining.rst b/docs6/reference-main-then-chaining.rst deleted file mode 100644 index a673b1ed9..000000000 --- a/docs6/reference-main-then-chaining.rst +++ /dev/null @@ -1,46 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Reference: then-chaining -================================================================ - -In accord with the `Unix philosophy `_, you can pipe data into or out of Miller. For example: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr cut --complement -f os_version *.dat | mlr sort -f hostname,uptime - -You can, if you like, instead simply chain commands together using the ``then`` keyword: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr cut --complement -f os_version then sort -f hostname,uptime *.dat - -(You can precede the very first verb with ``then``, if you like, for symmetry.) - -Here's a performance comparison: - -.. code-block:: none - - % cat piped.sh - mlr cut -x -f i,y data/big | mlr sort -n y > /dev/null - - % time sh piped.sh - real 0m2.828s - user 0m3.183s - sys 0m0.137s - - - % cat chained.sh - mlr cut -x -f i,y then sort -n y data/big > /dev/null - - % time sh chained.sh - real 0m2.082s - user 0m1.933s - sys 0m0.137s - -There are two reasons to use then-chaining: one is for performance, although I don't expect this to be a win in all cases. Using then-chaining avoids redundant string-parsing and string-formatting at each pipeline step: instead input records are parsed once, they are fed through each pipeline stage in memory, and then output records are formatted once. On the other hand, Miller is single-threaded, while modern systems are usually multi-processor, and when streaming-data programs operate through pipes, each one can use a CPU. Rest assured you get the same results either way. - -The other reason to use then-chaining is for simplicity: you don't have re-type formatting flags (e.g. ``--csv --fs tab``) at every pipeline stage. diff --git a/docs6/reference-main-then-chaining.rst.in b/docs6/reference-main-then-chaining.rst.in deleted file mode 100644 index c3d71f019..000000000 --- a/docs6/reference-main-then-chaining.rst.in +++ /dev/null @@ -1,24 +0,0 @@ -Reference: then-chaining -================================================================ - -In accord with the `Unix philosophy `_, you can pipe data into or out of Miller. For example: - -GENRST_SHOW_COMMAND -mlr cut --complement -f os_version *.dat | mlr sort -f hostname,uptime -GENRST_EOF - -You can, if you like, instead simply chain commands together using the ``then`` keyword: - -GENRST_SHOW_COMMAND -mlr cut --complement -f os_version then sort -f hostname,uptime *.dat -GENRST_EOF - -(You can precede the very first verb with ``then``, if you like, for symmetry.) - -Here's a performance comparison: - -GENRST_INCLUDE_ESCAPED(data/then-chaining-performance.txt) - -There are two reasons to use then-chaining: one is for performance, although I don't expect this to be a win in all cases. Using then-chaining avoids redundant string-parsing and string-formatting at each pipeline step: instead input records are parsed once, they are fed through each pipeline stage in memory, and then output records are formatted once. On the other hand, Miller is single-threaded, while modern systems are usually multi-processor, and when streaming-data programs operate through pipes, each one can use a CPU. Rest assured you get the same results either way. - -The other reason to use then-chaining is for simplicity: you don't have re-type formatting flags (e.g. ``--csv --fs tab``) at every pipeline stage. diff --git a/docs6/reference-verbs.rst b/docs6/reference-verbs.rst deleted file mode 100644 index 15b7f2bb2..000000000 --- a/docs6/reference-verbs.rst +++ /dev/null @@ -1,3678 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Reference: list of verbs -================================================================ - -Overview ----------------------------------------------------------------- - -Whereas the Unix toolkit is made of the separate executables ``cat``, ``tail``, ``cut``, -``sort``, etc., Miller has subcommands, or **verbs**, invoked as follows: - -.. code-block:: none - - mlr tac *.dat - mlr cut --complement -f os_version *.dat - mlr sort -f hostname,uptime *.dat - -These fall into categories as follows: - -* Analogs of their Unix-toolkit namesakes, discussed below as well as in :doc:`feature-comparison`: :ref:`reference-verbs-cat`, :ref:`reference-verbs-cut`, :ref:`reference-verbs-grep`, :ref:`reference-verbs-head`, :ref:`reference-verbs-join`, :ref:`reference-verbs-sort`, :ref:`reference-verbs-tac`, :ref:`reference-verbs-tail`, :ref:`reference-verbs-top`, :ref:`reference-verbs-uniq`. - -* ``awk``-like functionality: :ref:`reference-verbs-filter`, :ref:`reference-verbs-put`, :ref:`reference-verbs-sec2gmt`, :ref:`reference-verbs-sec2gmtdate`, :ref:`reference-verbs-step`, :ref:`reference-verbs-tee`. - -* Statistically oriented: :ref:`reference-verbs-bar`, :ref:`reference-verbs-bootstrap`, :ref:`reference-verbs-decimate`, :ref:`reference-verbs-histogram`, :ref:`reference-verbs-least-frequent`, :ref:`reference-verbs-most-frequent`, :ref:`reference-verbs-sample`, :ref:`reference-verbs-shuffle`, :ref:`reference-verbs-stats1`, :ref:`reference-verbs-stats2`. - -* Particularly oriented toward :doc:`record-heterogeneity`, although all Miller commands can handle heterogeneous records: :ref:`reference-verbs-group-by`, :ref:`reference-verbs-group-like`, :ref:`reference-verbs-having-fields`. - -* These draw from other sources (see also :doc:`originality`): :ref:`reference-verbs-count-distinct` is SQL-ish, and :ref:`reference-verbs-rename` can be done by ``sed`` (which does it faster: see :doc:`performance`. Verbs: :ref:`reference-verbs-check`, :ref:`reference-verbs-count-distinct`, :ref:`reference-verbs-label`, :ref:`reference-verbs-merge-fields`, :ref:`reference-verbs-nest`, :ref:`reference-verbs-nothing`, :ref:`reference-verbs-regularize`, :ref:`reference-verbs-rename`, :ref:`reference-verbs-reorder`, :ref:`reference-verbs-reshape`, :ref:`reference-verbs-seqgen`. - -.. _reference-verbs-altkv: - -altkv ----------------------------------------------------------------- - -Map list of values to alternating key/value pairs. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr altkv -h - Usage: mlr altkv [options] - Given fields with values of the form a,b,c,d,e,f emits a=b,c=d,e=f pairs. - Options: - -h|--help Show this message. - -.. code-block:: none - :emphasize-lines: 1-1 - - echo 'a,b,c,d,e,f' | mlr altkv - a=b,c=d,e=f - -.. code-block:: none - :emphasize-lines: 1-1 - - echo 'a,b,c,d,e,f,g' | mlr altkv - a=b,c=d,e=f,4=g - -.. _reference-verbs-bar: - -bar ----------------------------------------------------------------- - -Cheesy bar-charting. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr bar -h - Usage: mlr bar [options] - Replaces a numeric field with a number of asterisks, allowing for cheesy - bar plots. These align best with --opprint or --oxtab output format. - Options: - -f {a,b,c} Field names to convert to bars. - --lo {lo} Lower-limit value for min-width bar: default '0.000000'. - --hi {hi} Upper-limit value for max-width bar: default '100.000000'. - -w {n} Bar-field width: default '40'. - --auto Automatically computes limits, ignoring --lo and --hi. - Holds all records in memory before producing any output. - -c {character} Fill character: default '*'. - -x {character} Out-of-bounds character: default '#'. - -b {character} Blank character: default '.'. - Nominally the fill, out-of-bounds, and blank characters will be strings of length 1. - However you can make them all longer if you so desire. - -h|--help Show this message. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint cat data/small - a b i x y - pan pan 1 0.3467901443380824 0.7268028627434533 - eks pan 2 0.7586799647899636 0.5221511083334797 - wye wye 3 0.20460330576630303 0.33831852551664776 - eks wye 4 0.38139939387114097 0.13418874328430463 - wye pan 5 0.5732889198020006 0.8636244699032729 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint bar --lo 0 --hi 1 -f x,y data/small - a b i x y - pan pan 1 *************........................... *****************************........... - eks pan 2 ******************************.......... ********************.................... - wye wye 3 ********................................ *************........................... - eks wye 4 ***************......................... *****................................... - wye pan 5 **********************.................. **********************************...... - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint bar --lo 0.4 --hi 0.6 -f x,y data/small - a b i x y - pan pan 1 #....................................... ***************************************# - eks pan 2 ***************************************# ************************................ - wye wye 3 #....................................... #....................................... - eks wye 4 #....................................... #....................................... - wye pan 5 **********************************...... ***************************************# - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint bar --auto -f x,y data/small - a b i x y - pan pan 1 [0.20460330576630303]**********..............................[0.7586799647899636] [0.13418874328430463]********************************........[0.8636244699032729] - eks pan 2 [0.20460330576630303]***************************************#[0.7586799647899636] [0.13418874328430463]*********************...................[0.8636244699032729] - wye wye 3 [0.20460330576630303]#.......................................[0.7586799647899636] [0.13418874328430463]***********.............................[0.8636244699032729] - eks wye 4 [0.20460330576630303]************............................[0.7586799647899636] [0.13418874328430463]#.......................................[0.8636244699032729] - wye pan 5 [0.20460330576630303]**************************..............[0.7586799647899636] [0.13418874328430463]***************************************#[0.8636244699032729] - -.. _reference-verbs-bootstrap: - -bootstrap ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr bootstrap --help - Usage: mlr bootstrap [options] - Emits an n-sample, with replacement, of the input records. - See also mlr sample and mlr shuffle. - Options: - -n Number of samples to output. Defaults to number of input records. - Must be non-negative. - -h|--help Show this message. - -The canonical use for bootstrap sampling is to put error bars on statistical quantities, such as mean. For example: - -.. - hard-coded, not live-code, since random sampling would generate different data on each doc run - which would needlessly complicate git diff - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint stats1 -a mean,count -f u -g color data/colored-shapes.dkvp - color u_mean u_count - yellow 0.497129 1413 - red 0.492560 4641 - purple 0.494005 1142 - green 0.504861 1109 - blue 0.517717 1470 - orange 0.490532 303 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint bootstrap then stats1 -a mean,count -f u -g color data/colored-shapes.dkvp - color u_mean u_count - yellow 0.500651 1380 - purple 0.501556 1111 - green 0.503272 1068 - red 0.493895 4702 - blue 0.512529 1496 - orange 0.521030 321 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint bootstrap then stats1 -a mean,count -f u -g color data/colored-shapes.dkvp - color u_mean u_count - yellow 0.498046 1485 - blue 0.513576 1417 - red 0.492870 4595 - orange 0.507697 307 - green 0.496803 1075 - purple 0.486337 1199 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint bootstrap then stats1 -a mean,count -f u -g color data/colored-shapes.dkvp - color u_mean u_count - blue 0.522921 1447 - red 0.490717 4617 - yellow 0.496450 1419 - purple 0.496523 1192 - green 0.507569 1111 - orange 0.468014 292 - -.. _reference-verbs-cat: - -cat ----------------------------------------------------------------- - -Most useful for format conversions (see :doc:`file-formats`, and concatenating multiple same-schema CSV files to have the same header: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr cat -h - Usage: mlr cat [options] - Passes input records directly to output. Most useful for format conversion. - Options: - -n Prepend field "n" to each record with record-counter starting at 1. - -N {name} Prepend field {name} to each record with record-counter starting at 1. - -g {a,b,c} Optional group-by-field names for counters, e.g. a,b,c - -h|--help Show this message. - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/a.csv - a,b,c - 1,2,3 - 4,5,6 - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/b.csv - a,b,c - 7,8,9 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv cat data/a.csv data/b.csv - a,b,c - 1,2,3 - 4,5,6 - 7,8,9 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --oxtab cat data/a.csv data/b.csv - a 1 - b 2 - c 3 - - a 4 - b 5 - c 6 - - a 7 - b 8 - c 9 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv cat -n data/a.csv data/b.csv - n,a,b,c - 1,1,2,3 - 2,4,5,6 - 3,7,8,9 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint cat data/small - a b i x y - pan pan 1 0.3467901443380824 0.7268028627434533 - eks pan 2 0.7586799647899636 0.5221511083334797 - wye wye 3 0.20460330576630303 0.33831852551664776 - eks wye 4 0.38139939387114097 0.13418874328430463 - wye pan 5 0.5732889198020006 0.8636244699032729 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint cat -n -g a data/small - n a b i x y - 1 pan pan 1 0.3467901443380824 0.7268028627434533 - 1 eks pan 2 0.7586799647899636 0.5221511083334797 - 1 wye wye 3 0.20460330576630303 0.33831852551664776 - 2 eks wye 4 0.38139939387114097 0.13418874328430463 - 2 wye pan 5 0.5732889198020006 0.8636244699032729 - -.. _reference-verbs-check: - -check ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr check --help - Usage: mlr check [options] - Consumes records without printing any output. - Useful for doing a well-formatted check on input data. - Options: - -h|--help Show this message. - -.. _reference-verbs-clean-whitespace: - -clean-whitespace ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr clean-whitespace --help - Usage: mlr clean-whitespace [options] - For each record, for each field in the record, whitespace-cleans the keys and/or - values. Whitespace-cleaning entails stripping leading and trailing whitespace, - and replacing multiple whitespace with singles. For finer-grained control, - please see the DSL functions lstrip, rstrip, strip, collapse_whitespace, - and clean_whitespace. - - Options: - -k|--keys-only Do not touch values. - -v|--values-only Do not touch keys. - It is an error to specify -k as well as -v -- to clean keys and values, - leave off -k as well as -v. - -h|--help Show this message. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --ojson cat data/clean-whitespace.csv - { - " Name ": " Ann Simons", - " Preference ": " blue " - } - { - " Name ": "Bob Wang ", - " Preference ": " red " - } - { - " Name ": " Carol Vee", - " Preference ": " yellow" - } - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --ojson clean-whitespace -k data/clean-whitespace.csv - { - "Name": " Ann Simons", - "Preference": " blue " - } - { - "Name": "Bob Wang ", - "Preference": " red " - } - { - "Name": " Carol Vee", - "Preference": " yellow" - } - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --ojson clean-whitespace -v data/clean-whitespace.csv - { - " Name ": "Ann Simons", - " Preference ": "blue" - } - { - " Name ": "Bob Wang", - " Preference ": "red" - } - { - " Name ": "Carol Vee", - " Preference ": "yellow" - } - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --ojson clean-whitespace data/clean-whitespace.csv - { - "Name": "Ann Simons", - "Preference": "blue" - } - { - "Name": "Bob Wang", - "Preference": "red" - } - { - "Name": "Carol Vee", - "Preference": "yellow" - } - -Function links: - -* :ref:`reference-dsl-lstrip` -* :ref:`reference-dsl-rstrip` -* :ref:`reference-dsl-strip` -* :ref:`reference-dsl-collapse_whitespace` -* :ref:`reference-dsl-clean_whitespace` - -.. _reference-verbs-count: - -count ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr count --help - Usage: mlr count [options] - Prints number of records, optionally grouped by distinct values for specified field names. - Options: - -g {a,b,c} Optional group-by-field names for counts, e.g. a,b,c - -n {n} Show only the number of distinct values. Not interesting without -g. - -o {name} Field name for output-count. Default "count". - -h|--help Show this message. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr count data/medium - count=10000 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr count -g a data/medium - a=pan,count=2081 - a=eks,count=1965 - a=wye,count=1966 - a=zee,count=2047 - a=hat,count=1941 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr count -n -g a data/medium - count=5 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr count -g b data/medium - b=pan,count=1942 - b=wye,count=2057 - b=zee,count=1943 - b=eks,count=2008 - b=hat,count=2050 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr count -n -g b data/medium - count=5 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr count -g a,b data/medium - a=pan,b=pan,count=427 - a=eks,b=pan,count=371 - a=wye,b=wye,count=377 - a=eks,b=wye,count=407 - a=wye,b=pan,count=392 - a=zee,b=pan,count=389 - a=eks,b=zee,count=357 - a=zee,b=wye,count=455 - a=hat,b=wye,count=423 - a=pan,b=wye,count=395 - a=zee,b=eks,count=391 - a=hat,b=zee,count=385 - a=hat,b=eks,count=389 - a=wye,b=hat,count=426 - a=pan,b=eks,count=429 - a=eks,b=eks,count=413 - a=hat,b=hat,count=381 - a=hat,b=pan,count=363 - a=zee,b=zee,count=403 - a=pan,b=hat,count=417 - a=pan,b=zee,count=413 - a=zee,b=hat,count=409 - a=wye,b=zee,count=385 - a=eks,b=hat,count=417 - a=wye,b=eks,count=386 - -.. _reference-verbs-count-distinct: - -count-distinct ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr count-distinct --help - Usage: mlr count-distinct [options] - Prints number of records having distinct values for specified field names. - Same as uniq -c. - - Options: - -f {a,b,c} Field names for distinct count. - -n Show only the number of distinct values. Not compatible with -u. - -o {name} Field name for output count. Default "count". - Ignored with -u. - -u Do unlashed counts for multiple field names. With -f a,b and - without -u, computes counts for distinct combinations of a - and b field values. With -f a,b and with -u, computes counts - for distinct a field values and counts for distinct b field - values separately. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr count-distinct -f a,b then sort -nr count data/medium - a=zee,b=wye,count=455 - a=pan,b=eks,count=429 - a=pan,b=pan,count=427 - a=wye,b=hat,count=426 - a=hat,b=wye,count=423 - a=pan,b=hat,count=417 - a=eks,b=hat,count=417 - a=eks,b=eks,count=413 - a=pan,b=zee,count=413 - a=zee,b=hat,count=409 - a=eks,b=wye,count=407 - a=zee,b=zee,count=403 - a=pan,b=wye,count=395 - a=wye,b=pan,count=392 - a=zee,b=eks,count=391 - a=zee,b=pan,count=389 - a=hat,b=eks,count=389 - a=wye,b=eks,count=386 - a=hat,b=zee,count=385 - a=wye,b=zee,count=385 - a=hat,b=hat,count=381 - a=wye,b=wye,count=377 - a=eks,b=pan,count=371 - a=hat,b=pan,count=363 - a=eks,b=zee,count=357 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr count-distinct -u -f a,b data/medium - field=a,value=pan,count=2081 - field=a,value=eks,count=1965 - field=a,value=wye,count=1966 - field=a,value=zee,count=2047 - field=a,value=hat,count=1941 - field=b,value=pan,count=1942 - field=b,value=wye,count=2057 - field=b,value=zee,count=1943 - field=b,value=eks,count=2008 - field=b,value=hat,count=2050 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr count-distinct -f a,b -o someothername then sort -nr someothername data/medium - a=zee,b=wye,someothername=455 - a=pan,b=eks,someothername=429 - a=pan,b=pan,someothername=427 - a=wye,b=hat,someothername=426 - a=hat,b=wye,someothername=423 - a=pan,b=hat,someothername=417 - a=eks,b=hat,someothername=417 - a=eks,b=eks,someothername=413 - a=pan,b=zee,someothername=413 - a=zee,b=hat,someothername=409 - a=eks,b=wye,someothername=407 - a=zee,b=zee,someothername=403 - a=pan,b=wye,someothername=395 - a=wye,b=pan,someothername=392 - a=zee,b=eks,someothername=391 - a=zee,b=pan,someothername=389 - a=hat,b=eks,someothername=389 - a=wye,b=eks,someothername=386 - a=hat,b=zee,someothername=385 - a=wye,b=zee,someothername=385 - a=hat,b=hat,someothername=381 - a=wye,b=wye,someothername=377 - a=eks,b=pan,someothername=371 - a=hat,b=pan,someothername=363 - a=eks,b=zee,someothername=357 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr count-distinct -n -f a,b data/medium - count=25 - -.. _reference-verbs-count-similar: - -count-similar ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr count-similar --help - Usage: mlr count-similar [options] - Ingests all records, then emits each record augmented by a count of - the number of other records having the same group-by field values. - Options: - -g {a,b,c} Group-by-field names for counts, e.g. a,b,c - -o {name} Field name for output-counts. Defaults to "count". - -h|--help Show this message. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint head -n 20 data/medium - a b i x y - pan pan 1 0.3467901443380824 0.7268028627434533 - eks pan 2 0.7586799647899636 0.5221511083334797 - wye wye 3 0.20460330576630303 0.33831852551664776 - eks wye 4 0.38139939387114097 0.13418874328430463 - wye pan 5 0.5732889198020006 0.8636244699032729 - zee pan 6 0.5271261600918548 0.49322128674835697 - eks zee 7 0.6117840605678454 0.1878849191181694 - zee wye 8 0.5985540091064224 0.976181385699006 - hat wye 9 0.03144187646093577 0.7495507603507059 - pan wye 10 0.5026260055412137 0.9526183602969864 - pan pan 11 0.7930488423451967 0.6505816637259333 - zee pan 12 0.3676141320555616 0.23614420670296965 - eks pan 13 0.4915175580479536 0.7709126592971468 - eks zee 14 0.5207382318405251 0.34141681118811673 - eks pan 15 0.07155556372719507 0.3596137145616235 - pan pan 16 0.5736853980681922 0.7554169353781729 - zee eks 17 0.29081949506712723 0.054478717073354166 - hat zee 18 0.05727869223575699 0.13343527626645157 - zee pan 19 0.43144132839222604 0.8442204830496998 - eks wye 20 0.38245149780530685 0.4730652428100751 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint head -n 20 then count-similar -g a data/medium - a b i x y count - pan pan 1 0.3467901443380824 0.7268028627434533 4 - pan wye 10 0.5026260055412137 0.9526183602969864 4 - pan pan 11 0.7930488423451967 0.6505816637259333 4 - pan pan 16 0.5736853980681922 0.7554169353781729 4 - eks pan 2 0.7586799647899636 0.5221511083334797 7 - eks wye 4 0.38139939387114097 0.13418874328430463 7 - eks zee 7 0.6117840605678454 0.1878849191181694 7 - eks pan 13 0.4915175580479536 0.7709126592971468 7 - eks zee 14 0.5207382318405251 0.34141681118811673 7 - eks pan 15 0.07155556372719507 0.3596137145616235 7 - eks wye 20 0.38245149780530685 0.4730652428100751 7 - wye wye 3 0.20460330576630303 0.33831852551664776 2 - wye pan 5 0.5732889198020006 0.8636244699032729 2 - zee pan 6 0.5271261600918548 0.49322128674835697 5 - zee wye 8 0.5985540091064224 0.976181385699006 5 - zee pan 12 0.3676141320555616 0.23614420670296965 5 - zee eks 17 0.29081949506712723 0.054478717073354166 5 - zee pan 19 0.43144132839222604 0.8442204830496998 5 - hat wye 9 0.03144187646093577 0.7495507603507059 2 - hat zee 18 0.05727869223575699 0.13343527626645157 2 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint head -n 20 then count-similar -g a then sort -f a data/medium - a b i x y count - eks pan 2 0.7586799647899636 0.5221511083334797 7 - eks wye 4 0.38139939387114097 0.13418874328430463 7 - eks zee 7 0.6117840605678454 0.1878849191181694 7 - eks pan 13 0.4915175580479536 0.7709126592971468 7 - eks zee 14 0.5207382318405251 0.34141681118811673 7 - eks pan 15 0.07155556372719507 0.3596137145616235 7 - eks wye 20 0.38245149780530685 0.4730652428100751 7 - hat wye 9 0.03144187646093577 0.7495507603507059 2 - hat zee 18 0.05727869223575699 0.13343527626645157 2 - pan pan 1 0.3467901443380824 0.7268028627434533 4 - pan wye 10 0.5026260055412137 0.9526183602969864 4 - pan pan 11 0.7930488423451967 0.6505816637259333 4 - pan pan 16 0.5736853980681922 0.7554169353781729 4 - wye wye 3 0.20460330576630303 0.33831852551664776 2 - wye pan 5 0.5732889198020006 0.8636244699032729 2 - zee pan 6 0.5271261600918548 0.49322128674835697 5 - zee wye 8 0.5985540091064224 0.976181385699006 5 - zee pan 12 0.3676141320555616 0.23614420670296965 5 - zee eks 17 0.29081949506712723 0.054478717073354166 5 - zee pan 19 0.43144132839222604 0.8442204830496998 5 - -.. _reference-verbs-cut: - -cut ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr cut --help - Usage: mlr cut [options] - Passes through input records with specified fields included/excluded. - Options: - -f {a,b,c} Comma-separated field names for cut, e.g. a,b,c. - -o Retain fields in the order specified here in the argument list. - Default is to retain them in the order found in the input data. - -x|--complement Exclude, rather than include, field names specified by -f. - -r Treat field names as regular expressions. "ab", "a.*b" will - match any field name containing the substring "ab" or matching - "a.*b", respectively; anchors of the form "^ab$", "^a.*b$" may - be used. The -o flag is ignored when -r is present. - -h|--help Show this message. - Examples: - mlr cut -f hostname,status - mlr cut -x -f hostname,status - mlr cut -r -f '^status$,sda[0-9]' - mlr cut -r -f '^status$,"sda[0-9]"' - mlr cut -r -f '^status$,"sda[0-9]"i' (this is case-insensitive) - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint cat data/small - a b i x y - pan pan 1 0.3467901443380824 0.7268028627434533 - eks pan 2 0.7586799647899636 0.5221511083334797 - wye wye 3 0.20460330576630303 0.33831852551664776 - eks wye 4 0.38139939387114097 0.13418874328430463 - wye pan 5 0.5732889198020006 0.8636244699032729 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint cut -f y,x,i data/small - i x y - 1 0.3467901443380824 0.7268028627434533 - 2 0.7586799647899636 0.5221511083334797 - 3 0.20460330576630303 0.33831852551664776 - 4 0.38139939387114097 0.13418874328430463 - 5 0.5732889198020006 0.8636244699032729 - -.. code-block:: none - :emphasize-lines: 1-1 - - echo 'a=1,b=2,c=3' | mlr cut -f b,c,a - a=1,b=2,c=3 - -.. code-block:: none - :emphasize-lines: 1-1 - - echo 'a=1,b=2,c=3' | mlr cut -o -f b,c,a - b=2,c=3,a=1 - -.. _reference-verbs-decimate: - -decimate ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr decimate --help - Usage: mlr decimate [options] - Passes through one of every n records, optionally by category. - Options: - -b Decimate by printing first of every n. - -e Decimate by printing last of every n (default). - -g {a,b,c} Optional group-by-field names for decimate counts, e.g. a,b,c. - -n {n} Decimation factor (default 10). - -h|--help Show this message. - -.. _reference-verbs-fill-down: - -fill-down ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr fill-down --help - Usage: mlr fill-down [options] - If a given record has a missing value for a given field, fill that from - the corresponding value from a previous record, if any. - By default, a 'missing' field either is absent, or has the empty-string value. - With -a, a field is 'missing' only if it is absent. - - Options: - --all Operate on all fields in the input. - -a|--only-if-absent If a given record has a missing value for a given field, - fill that from the corresponding value from a previous record, if any. - By default, a 'missing' field either is absent, or has the empty-string value. - With -a, a field is 'missing' only if it is absent. - -f Field names for fill-down. - -h|--help Show this message. - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/fill-down.csv - a,b,c - 1,,3 - 4,5,6 - 7,,9 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv fill-down -f b data/fill-down.csv - a,b,c - 1,,3 - 4,5,6 - 7,5,9 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv fill-down -a -f b data/fill-down.csv - a,b,c - 1,,3 - 4,5,6 - 7,,9 - -.. _reference-verbs-filter: - -filter ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr filter --help - Usage: mlr put [options] {DSL expression} - Options: - -f {file name} File containing a DSL expression. If the filename is a directory, - all *.mlr files in that directory are loaded. - - -e {expression} You can use this after -f to add an expression. Example use - case: define functions/subroutines in a file you specify with -f, then call - them with an expression you specify with -e. - - (If you mix -e and -f then the expressions are evaluated in the order encountered. - Since the expression pieces are simply concatenated, please be sure to use intervening - semicolons to separate expressions.) - - -s name=value: Predefines out-of-stream variable @name to have - Thus mlr put -s foo=97 '$column += @foo' is like - mlr put 'begin {@foo = 97} $column += @foo'. - The value part is subject to type-inferencing. - May be specified more than once, e.g. -s name1=value1 -s name2=value2. - Note: the value may be an environment variable, e.g. -s sequence=$SEQUENCE - - -x (default false) Prints records for which {expression} evaluates to false, not true, - i.e. invert the sense of the filter expression. - - -q Does not include the modified record in the output stream. - Useful for when all desired output is in begin and/or end blocks. - - -S and -F: There are no-ops in Miller 6 and above, since now type-inferencing is done - by the record-readers before filter/put is executed. Supported as no-op pass-through - flags for backward compatibility. - - -h|--help Show this message. - - Parser-info options: - - -w Print warnings about things like uninitialized variables. - - -W Same as -w, but exit the process if there are any warnings. - - -p Prints the expressions's AST (abstract syntax tree), which gives full - transparency on the precedence and associativity rules of Miller's grammar, - to stdout. - - -d Like -p but uses a parenthesized-expression format for the AST. - - -D Like -d but with output all on one line. - - -E Echo DSL expression before printing parse-tree - - -v Same as -E -p. - - -X Exit after parsing but before stream-processing. Useful with -v/-d/-D, if you - only want to look at parser information. - -Features which filter shares with put -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Please see :doc:`reference-dsl` for more information about the expression language for ``mlr filter``. - -.. _reference-verbs-format-values: - -format-values ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr format-values --help - Usage: mlr format-values [options] - Applies format strings to all field values, depending on autodetected type. - * If a field value is detected to be integer, applies integer format. - * Else, if a field value is detected to be float, applies float format. - * Else, applies string format. - - Note: this is a low-keystroke way to apply formatting to many fields. To get - finer control, please see the fmtnum function within the mlr put DSL. - - Note: this verb lets you apply arbitrary format strings, which can produce - undefined behavior and/or program crashes. See your system's "man printf". - - Options: - -i {integer format} Defaults to "%d". - Examples: "%06lld", "%08llx". - Note that Miller integers are long long so you must use - formats which apply to long long, e.g. with ll in them. - Undefined behavior results otherwise. - -f {float format} Defaults to "%f". - Examples: "%8.3lf", "%.6le". - Note that Miller floats are double-precision so you must - use formats which apply to double, e.g. with l[efg] in them. - Undefined behavior results otherwise. - -s {string format} Defaults to "%s". - Examples: "_%s", "%08s". - Note that you must use formats which apply to string, e.g. - with s in them. Undefined behavior results otherwise. - -n Coerce field values autodetected as int to float, and then - apply the float format. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint format-values data/small - a b i x y - pan pan 1 0.346790 0.726803 - eks pan 2 0.758680 0.522151 - wye wye 3 0.204603 0.338319 - eks wye 4 0.381399 0.134189 - wye pan 5 0.573289 0.863624 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint format-values -n data/small - a b i x y - pan pan 1.000000 0.346790 0.726803 - eks pan 2.000000 0.758680 0.522151 - wye wye 3.000000 0.204603 0.338319 - eks wye 4.000000 0.381399 0.134189 - wye pan 5.000000 0.573289 0.863624 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint format-values -i %08llx -f %.6le -s X%sX data/small - a b i x y - XpanX XpanX %!l(int=00000001)lx %!l(float64=0.34679)e %!l(float64=0.726803)e - XeksX XpanX %!l(int=00000002)lx %!l(float64=0.75868)e %!l(float64=0.522151)e - XwyeX XwyeX %!l(int=00000003)lx %!l(float64=0.204603)e %!l(float64=0.338319)e - XeksX XwyeX %!l(int=00000004)lx %!l(float64=0.381399)e %!l(float64=0.134189)e - XwyeX XpanX %!l(int=00000005)lx %!l(float64=0.573289)e %!l(float64=0.863624)e - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint format-values -i %08llx -f %.6le -s X%sX -n data/small - a b i x y - XpanX XpanX %!l(float64=1)e %!l(float64=0.34679)e %!l(float64=0.726803)e - XeksX XpanX %!l(float64=2)e %!l(float64=0.75868)e %!l(float64=0.522151)e - XwyeX XwyeX %!l(float64=3)e %!l(float64=0.204603)e %!l(float64=0.338319)e - XeksX XwyeX %!l(float64=4)e %!l(float64=0.381399)e %!l(float64=0.134189)e - XwyeX XpanX %!l(float64=5)e %!l(float64=0.573289)e %!l(float64=0.863624)e - -.. _reference-verbs-fraction: - -fraction ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr fraction --help - Usage: mlr fraction [options] - For each record's value in specified fields, computes the ratio of that - value to the sum of values in that field over all input records. - E.g. with input records x=1 x=2 x=3 and x=4, emits output records - x=1,x_fraction=0.1 x=2,x_fraction=0.2 x=3,x_fraction=0.3 and x=4,x_fraction=0.4 - - Note: this is internally a two-pass algorithm: on the first pass it retains - input records and accumulates sums; on the second pass it computes quotients - and emits output records. This means it produces no output until all input is read. - - Options: - -f {a,b,c} Field name(s) for fraction calculation - -g {d,e,f} Optional group-by-field name(s) for fraction counts - -p Produce percents [0..100], not fractions [0..1]. Output field names - end with "_percent" rather than "_fraction" - -c Produce cumulative distributions, i.e. running sums: each output - value folds in the sum of the previous for the specified group - E.g. with input records x=1 x=2 x=3 and x=4, emits output records - x=1,x_cumulative_fraction=0.1 x=2,x_cumulative_fraction=0.3 - x=3,x_cumulative_fraction=0.6 and x=4,x_cumulative_fraction=1.0 - -For example, suppose you have the following CSV file: - -.. code-block:: none - - u=female,v=red,n=2458 - u=female,v=green,n=192 - u=female,v=blue,n=337 - u=female,v=purple,n=468 - u=female,v=yellow,n=3 - u=female,v=orange,n=17 - u=male,v=red,n=143 - u=male,v=green,n=227 - u=male,v=blue,n=2034 - u=male,v=purple,n=12 - u=male,v=yellow,n=1192 - u=male,v=orange,n=448 - -Then we can see what each record's ``n`` contributes to the total ``n``: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint fraction -f n data/fraction-example.csv - u v n n_fraction - female red 2458 0.32638427831629263 - female green 192 0.025494622228123754 - female blue 337 0.04474837338998805 - female purple 468 0.06214314168105165 - female yellow 3 0.00039835347231443366 - female orange 17 0.002257336343115124 - male red 143 0.018988182180321337 - male green 227 0.03014207940512548 - male blue 2034 0.270083654229186 - male purple 12 0.0015934138892577346 - male yellow 1192 0.15827911299960165 - male orange 448 0.0594874518656221 - -Using ``-g`` we can split those out by gender, or by color: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint fraction -f n -g u data/fraction-example.csv - u v n n_fraction - female red 2458 0.7073381294964028 - female green 192 0.05525179856115108 - female blue 337 0.09697841726618706 - female purple 468 0.13467625899280575 - female yellow 3 0.0008633093525179857 - female orange 17 0.004892086330935252 - male red 143 0.035256410256410256 - male green 227 0.05596646942800789 - male blue 2034 0.5014792899408284 - male purple 12 0.0029585798816568047 - male yellow 1192 0.2938856015779093 - male orange 448 0.11045364891518737 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint fraction -f n -g v data/fraction-example.csv - u v n n_fraction - female red 2458 0.9450211457131872 - female green 192 0.45823389021479716 - female blue 337 0.1421341206242092 - female purple 468 0.975 - female yellow 3 0.002510460251046025 - female orange 17 0.03655913978494624 - male red 143 0.05497885428681276 - male green 227 0.5417661097852029 - male blue 2034 0.8578658793757908 - male purple 12 0.025 - male yellow 1192 0.9974895397489539 - male orange 448 0.9634408602150538 - -We can see, for example, that 70.9% of females have red (on the left) while 94.5% of reds are for females. - -To convert fractions to percents, you may use ``-p``: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint fraction -f n -p data/fraction-example.csv - u v n n_percent - female red 2458 32.638427831629265 - female green 192 2.5494622228123753 - female blue 337 4.474837338998805 - female purple 468 6.214314168105165 - female yellow 3 0.039835347231443365 - female orange 17 0.2257336343115124 - male red 143 1.8988182180321338 - male green 227 3.014207940512548 - male blue 2034 27.0083654229186 - male purple 12 0.15934138892577346 - male yellow 1192 15.827911299960165 - male orange 448 5.94874518656221 - -Another often-used idiom is to convert from a point distribution to a cumulative distribution, also known as "running sums". Here, you can use ``-c``: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint fraction -f n -p -c data/fraction-example.csv - u v n n_cumulative_percent - female red 2458 32.638427831629265 - female green 192 35.18789005444164 - female blue 337 39.66272739344044 - female purple 468 45.87704156154561 - female yellow 3 45.916876908777056 - female orange 17 46.142610543088566 - male red 143 48.041428761120706 - male green 227 51.05563670163325 - male blue 2034 78.06400212455186 - male purple 12 78.22334351347763 - male yellow 1192 94.0512548134378 - male orange 448 100 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint fraction -f n -g u -p -c data/fraction-example.csv - u v n n_cumulative_percent - female red 2458 70.73381294964028 - female green 192 76.2589928057554 - female blue 337 85.9568345323741 - female purple 468 99.42446043165467 - female yellow 3 99.51079136690647 - female orange 17 100 - male red 143 3.5256410256410255 - male green 227 9.122287968441814 - male blue 2034 59.27021696252466 - male purple 12 59.56607495069034 - male yellow 1192 88.95463510848126 - male orange 448 100 - -.. _reference-verbs-grep: - -grep ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr grep -h - Usage: mlr grep [options] {regular expression} - Passes through records which match the regular expression. - Options: - -i Use case-insensitive search. - -v Invert: pass through records which do not match the regex. - -h|--help Show this message. - Note that "mlr filter" is more powerful, but requires you to know field names. - By contrast, "mlr grep" allows you to regex-match the entire record. It does - this by formatting each record in memory as DKVP, using command-line-specified - ORS/OFS/OPS, and matching the resulting line against the regex specified - here. In particular, the regex is not applied to the input stream: if you - have CSV with header line "x,y,z" and data line "1,2,3" then the regex will - be matched, not against either of these lines, but against the DKVP line - "x=1,y=2,z=3". Furthermore, not all the options to system grep are supported, - and this command is intended to be merely a keystroke-saver. To get all the - features of system grep, you can do - "mlr --odkvp ... | grep ... | mlr --idkvp ..." - -.. _reference-verbs-group-by: - -group-by ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr group-by --help - Usage: mlr group-by [options] {comma-separated field names} - Outputs records in batches having identical values at specified field names.Options: - -h|--help Show this message. - -This is similar to ``sort`` but with less work. Namely, Miller's sort has three steps: read through the data and append linked lists of records, one for each unique combination of the key-field values; after all records are read, sort the key-field values; then print each record-list. The group-by operation simply omits the middle sort. An example should make this more clear. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint group-by a data/small - a b i x y - pan pan 1 0.3467901443380824 0.7268028627434533 - eks pan 2 0.7586799647899636 0.5221511083334797 - eks wye 4 0.38139939387114097 0.13418874328430463 - wye wye 3 0.20460330576630303 0.33831852551664776 - wye pan 5 0.5732889198020006 0.8636244699032729 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint sort -f a data/small - a b i x y - eks pan 2 0.7586799647899636 0.5221511083334797 - eks wye 4 0.38139939387114097 0.13418874328430463 - pan pan 1 0.3467901443380824 0.7268028627434533 - wye wye 3 0.20460330576630303 0.33831852551664776 - wye pan 5 0.5732889198020006 0.8636244699032729 - -In this example, since the sort is on field ``a``, the first step is to group together all records having the same value for field ``a``; the second step is to sort the distinct ``a``-field values ``pan``, ``eks``, and ``wye`` into ``eks``, ``pan``, and ``wye``; the third step is to print out the record-list for ``a=eks``, then the record-list for ``a=pan``, then the record-list for ``a=wye``. The group-by operation omits the middle sort and just puts like records together, for those times when a sort isn't desired. In particular, the ordering of group-by fields for group-by is the order in which they were encountered in the data stream, which in some cases may be more interesting to you. - -.. _reference-verbs-group-like: - -group-like ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr group-like --help - Usage: mlr group-like [options] - Outputs records in batches having identical field names.Options: - -h|--help Show this message. - -This groups together records having the same schema (i.e. same ordered list of field names) which is useful for making sense of time-ordered output as described in :doc:`record-heterogeneity` -- in particular, in preparation for CSV or pretty-print output. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr cat data/het.dkvp - resource=/path/to/file,loadsec=0.45,ok=true - record_count=100,resource=/path/to/file - resource=/path/to/second/file,loadsec=0.32,ok=true - record_count=150,resource=/path/to/second/file - resource=/some/other/path,loadsec=0.97,ok=false - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint group-like data/het.dkvp - resource loadsec ok - /path/to/file 0.45 true - /path/to/second/file 0.32 true - /some/other/path 0.97 false - - record_count resource - 100 /path/to/file - 150 /path/to/second/file - -.. _reference-verbs-having-fields: - -having-fields ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr having-fields --help - Usage: mlr having-fields [options] - Conditionally passes through records depending on each record's field names. - Options: - --at-least {comma-separated names} - --which-are {comma-separated names} - --at-most {comma-separated names} - --all-matching {regular expression} - --any-matching {regular expression} - --none-matching {regular expression} - Examples: - mlr having-fields --which-are amount,status,owner - mlr having-fields --any-matching 'sda[0-9]' - mlr having-fields --any-matching '"sda[0-9]"' - mlr having-fields --any-matching '"sda[0-9]"i' (this is case-insensitive) - -Similar to :ref:`reference-verbs-group-like`, this retains records with specified schema. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr cat data/het.dkvp - resource=/path/to/file,loadsec=0.45,ok=true - record_count=100,resource=/path/to/file - resource=/path/to/second/file,loadsec=0.32,ok=true - record_count=150,resource=/path/to/second/file - resource=/some/other/path,loadsec=0.97,ok=false - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr having-fields --at-least resource data/het.dkvp - resource=/path/to/file,loadsec=0.45,ok=true - record_count=100,resource=/path/to/file - resource=/path/to/second/file,loadsec=0.32,ok=true - record_count=150,resource=/path/to/second/file - resource=/some/other/path,loadsec=0.97,ok=false - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr having-fields --which-are resource,ok,loadsec data/het.dkvp - resource=/path/to/file,loadsec=0.45,ok=true - resource=/path/to/second/file,loadsec=0.32,ok=true - resource=/some/other/path,loadsec=0.97,ok=false - -.. _reference-verbs-head: - -head ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr head --help - Usage: mlr head [options] - Passes through the first n records, optionally by category. - Options: - -g {a,b,c} Optional group-by-field names for head counts, e.g. a,b,c. - -n {n} Head-count to print. Default 10. - -h|--help Show this message. - -Note that ``head`` is distinct from :ref:`reference-verbs-top` -- ``head`` shows fields which appear first in the data stream; ``top`` shows fields which are numerically largest (or smallest). - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint head -n 4 data/medium - a b i x y - pan pan 1 0.3467901443380824 0.7268028627434533 - eks pan 2 0.7586799647899636 0.5221511083334797 - wye wye 3 0.20460330576630303 0.33831852551664776 - eks wye 4 0.38139939387114097 0.13418874328430463 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint head -n 1 -g b data/medium - a b i x y - pan pan 1 0.3467901443380824 0.7268028627434533 - wye wye 3 0.20460330576630303 0.33831852551664776 - eks zee 7 0.6117840605678454 0.1878849191181694 - zee eks 17 0.29081949506712723 0.054478717073354166 - wye hat 24 0.7286126830627567 0.19441962592638418 - -.. _reference-verbs-histogram: - -histogram ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr histogram --help - Just a histogram. Input values < lo or > hi are not counted. - Usage: mlr histogram [options] - -f {a,b,c} Value-field names for histogram counts - --lo {lo} Histogram low value - --hi {hi} Histogram high value - --nbins {n} Number of histogram bins - --auto Automatically computes limits, ignoring --lo and --hi. - Holds all values in memory before producing any output. - -o {prefix} Prefix for output field name. Default: no prefix. - -h|--help Show this message. - -This is just a histogram; there's not too much to say here. A note about binning, by example: Suppose you use ``--lo 0.0 --hi 1.0 --nbins 10 -f x``. The input numbers less than 0 or greater than 1 aren't counted in any bin. Input numbers equal to 1 are counted in the last bin. That is, bin 0 has ``0.0 ≤ x < 0.1``, bin 1 has ``0.1 ≤ x < 0.2``, etc., but bin 9 has ``0.9 ≤ x ≤ 1.0``. - -.. code-block:: none - :emphasize-lines: 1-3 - - mlr --opprint put '$x2=$x**2;$x3=$x2*$x' \ - then histogram -f x,x2,x3 --lo 0 --hi 1 --nbins 10 \ - data/medium - bin_lo bin_hi x_count x2_count x3_count - 0 0.1 1072 3231 4661 - 0.1 0.2 938 1254 1184 - 0.2 0.3 1037 988 845 - 0.3 0.4 988 832 676 - 0.4 0.5 950 774 576 - 0.5 0.6 1002 692 476 - 0.6 0.7 1007 591 438 - 0.7 0.8 1007 560 420 - 0.8 0.9 986 571 383 - 0.9 1 1013 507 341 - -.. code-block:: none - :emphasize-lines: 1-3 - - mlr --opprint put '$x2=$x**2;$x3=$x2*$x' \ - then histogram -f x,x2,x3 --lo 0 --hi 1 --nbins 10 -o my_ \ - data/medium - my_bin_lo my_bin_hi my_x_count my_x2_count my_x3_count - 0 0.1 1072 3231 4661 - 0.1 0.2 938 1254 1184 - 0.2 0.3 1037 988 845 - 0.3 0.4 988 832 676 - 0.4 0.5 950 774 576 - 0.5 0.6 1002 692 476 - 0.6 0.7 1007 591 438 - 0.7 0.8 1007 560 420 - 0.8 0.9 986 571 383 - 0.9 1 1013 507 341 - -.. _reference-verbs-join: - -join ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr join --help - Usage: mlr sort {flags} - Sorts records primarily by the first specified field, secondarily by the second - field, and so on. (Any records not having all specified sort keys will appear - at the end of the output, in the order they were encountered, regardless of the - specified sort order.) The sort is stable: records that compare equal will sort - in the order they were encountered in the input record stream. - - Options: - -f {comma-separated field names} Lexical ascending - -n {comma-separated field names} Numerical ascending; nulls sort last - -nf {comma-separated field names} Same as -n - -r {comma-separated field names} Lexical descending - -nr {comma-separated field names} Numerical descending; nulls sort first - -h|--help Show this message. - - Example: - mlr sort -f a,b -nr x,y,z - which is the same as: - mlr sort -f a -f b -nr x -nr y -nr z - -Examples: - -Join larger table with IDs with smaller ID-to-name lookup table, showing only paired records: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsvlite --opprint cat data/join-left-example.csv - id name - 100 alice - 200 bob - 300 carol - 400 david - 500 edgar - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsvlite --opprint cat data/join-right-example.csv - status idcode - present 400 - present 100 - missing 200 - present 100 - present 200 - missing 100 - missing 200 - present 300 - missing 600 - present 400 - present 400 - present 300 - present 100 - missing 400 - present 200 - present 200 - present 200 - present 200 - present 400 - present 300 - -.. code-block:: none - :emphasize-lines: 1-3 - - mlr --icsvlite --opprint \ - join -u -j id -r idcode -f data/join-left-example.csv \ - data/join-right-example.csv - id name status - 400 david present - 100 alice present - 200 bob missing - 100 alice present - 200 bob present - 100 alice missing - 200 bob missing - 300 carol present - 400 david present - 400 david present - 300 carol present - 100 alice present - 400 david missing - 200 bob present - 200 bob present - 200 bob present - 200 bob present - 400 david present - 300 carol present - -Same, but with sorting the input first: - -.. code-block:: none - :emphasize-lines: 1-3 - - mlr --icsvlite --opprint sort -f idcode \ - then join -j id -r idcode -f data/join-left-example.csv \ - data/join-right-example.csv - id name status - 100 alice present - 100 alice present - 100 alice missing - 100 alice present - 200 bob missing - 200 bob present - 200 bob missing - 200 bob present - 200 bob present - 200 bob present - 200 bob present - 300 carol present - 300 carol present - 300 carol present - 400 david present - 400 david present - 400 david present - 400 david missing - 400 david present - -Same, but showing only unpaired records: - -.. code-block:: none - :emphasize-lines: 1-3 - - mlr --icsvlite --opprint \ - join --np --ul --ur -u -j id -r idcode -f data/join-left-example.csv \ - data/join-right-example.csv - status idcode - missing 600 - - id name - 500 edgar - -Use prefixing options to disambiguate between otherwise identical non-join field names: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csvlite --opprint cat data/self-join.csv data/self-join.csv - a b c - 1 2 3 - 1 4 5 - 1 2 3 - 1 4 5 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csvlite --opprint join -j a --lp left_ --rp right_ -f data/self-join.csv data/self-join.csv - a left_b left_c right_b right_c - 1 2 3 2 3 - 1 4 5 2 3 - 1 2 3 4 5 - 1 4 5 4 5 - -Use zero join columns: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csvlite --opprint join -j "" --lp left_ --rp right_ -f data/self-join.csv data/self-join.csv - left_a left_b left_c right_a right_b right_c - 1 2 3 1 2 3 - 1 4 5 1 2 3 - 1 2 3 1 4 5 - 1 4 5 1 4 5 - -.. _reference-verbs-label: - -label ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr label --help - Usage: mlr label [options] {new1,new2,new3,...} - Given n comma-separated names, renames the first n fields of each record to - have the respective name. (Fields past the nth are left with their original - names.) Particularly useful with --inidx or --implicit-csv-header, to give - useful names to otherwise integer-indexed fields. - - Options: - -h|--help Show this message. - -See also :ref:`reference-verbs-rename`. - -Example: Files such as ``/etc/passwd``, ``/etc/group``, and so on have implicit field names which are found in section-5 manpages. These field names may be made explicit as follows: - -.. code-block:: none - - % grep -v '^#' /etc/passwd | mlr --nidx --fs : --opprint label name,password,uid,gid,gecos,home_dir,shell | head - name password uid gid gecos home_dir shell - nobody * -2 -2 Unprivileged User /var/empty /usr/bin/false - root * 0 0 System Administrator /var/root /bin/sh - daemon * 1 1 System Services /var/root /usr/bin/false - _uucp * 4 4 Unix to Unix Copy Protocol /var/spool/uucp /usr/sbin/uucico - _taskgated * 13 13 Task Gate Daemon /var/empty /usr/bin/false - _networkd * 24 24 Network Services /var/networkd /usr/bin/false - _installassistant * 25 25 Install Assistant /var/empty /usr/bin/false - _lp * 26 26 Printing Services /var/spool/cups /usr/bin/false - _postfix * 27 27 Postfix Mail Server /var/spool/postfix /usr/bin/false - -Likewise, if you have CSV/CSV-lite input data which has somehow been bereft of its header line, you can re-add a header line using ``--implicit-csv-header`` and ``label``: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/headerless.csv - John,23,present - Fred,34,present - Alice,56,missing - Carol,45,present - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv --implicit-csv-header cat data/headerless.csv - 1,2,3 - John,23,present - Fred,34,present - Alice,56,missing - Carol,45,present - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv --implicit-csv-header label name,age,status data/headerless.csv - name,age,status - John,23,present - Fred,34,present - Alice,56,missing - Carol,45,present - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --implicit-csv-header --opprint label name,age,status data/headerless.csv - name age status - John 23 present - Fred 34 present - Alice 56 missing - Carol 45 present - -.. _reference-verbs-least-frequent: - -least-frequent ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr least-frequent -h - Usage: mlr least-frequent [options] - Shows the least frequently occurring distinct values for specified field names. - The first entry is the statistical anti-mode; the remaining are runners-up. - Options: - -f {one or more comma-separated field names}. Required flag. - -n {count}. Optional flag defaulting to 10. - -b Suppress counts; show only field values. - -o {name} Field name for output count. Default "count". - See also "mlr most-frequent". - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint --from data/colored-shapes.dkvp least-frequent -f shape -n 5 - shape count - circle 2591 - triangle 3372 - square 4115 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint --from data/colored-shapes.dkvp least-frequent -f shape,color -n 5 - shape color count - circle orange 68 - triangle orange 107 - square orange 128 - circle green 287 - circle purple 289 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint --from data/colored-shapes.dkvp least-frequent -f shape,color -n 5 -o someothername - shape color someothername - circle orange 68 - triangle orange 107 - square orange 128 - circle green 287 - circle purple 289 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint --from data/colored-shapes.dkvp least-frequent -f shape,color -n 5 -b - shape color - circle orange - triangle orange - square orange - circle green - circle purple - -See also :ref:`reference-verbs-most-frequent`. - -.. _reference-verbs-merge-fields: - -merge-fields ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr merge-fields --help - Usage: mlr merge-fields [options] - Computes univariate statistics for each input record, accumulated across - specified fields. - Options: - -a {sum,count,...} Names of accumulators. One or more of: - count Count instances of fields - mode Find most-frequently-occurring values for fields; first-found wins tie - antimode Find least-frequently-occurring values for fields; first-found wins tie - sum Compute sums of specified fields - mean Compute averages (sample means) of specified fields - var Compute sample variance of specified fields - stddev Compute sample standard deviation of specified fields - meaneb Estimate error bars for averages (assuming no sample autocorrelation) - skewness Compute sample skewness of specified fields - kurtosis Compute sample kurtosis of specified fields - min Compute minimum values of specified fields - max Compute maximum values of specified fields - -f {a,b,c} Value-field names on which to compute statistics. Requires -o. - -r {a,b,c} Regular expressions for value-field names on which to compute - statistics. Requires -o. - -c {a,b,c} Substrings for collapse mode. All fields which have the same names - after removing substrings will be accumulated together. Please see - examples below. - -i Use interpolated percentiles, like R's type=7; default like type=1. - Not sensical for string-valued fields. - -o {name} Output field basename for -f/-r. - -k Keep the input fields which contributed to the output statistics; - the default is to omit them. - - String-valued data make sense unless arithmetic on them is required, - e.g. for sum, mean, interpolated percentiles, etc. In case of mixed data, - numbers are less than strings. - - Example input data: "a_in_x=1,a_out_x=2,b_in_y=4,b_out_x=8". - Example: mlr merge-fields -a sum,count -f a_in_x,a_out_x -o foo - produces "b_in_y=4,b_out_x=8,foo_sum=3,foo_count=2" since "a_in_x,a_out_x" are - summed over. - Example: mlr merge-fields -a sum,count -r in_,out_ -o bar - produces "bar_sum=15,bar_count=4" since all four fields are summed over. - Example: mlr merge-fields -a sum,count -c in_,out_ - produces "a_x_sum=3,a_x_count=2,b_y_sum=4,b_y_count=1,b_x_sum=8,b_x_count=1" - since "a_in_x" and "a_out_x" both collapse to "a_x", "b_in_y" collapses to - "b_y", and "b_out_x" collapses to "b_x". - -This is like ``mlr stats1`` but all accumulation is done across fields within each given record: horizontal rather than vertical statistics, if you will. - -Examples: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csvlite --opprint cat data/inout.csv - a_in a_out b_in b_out - 436 490 446 195 - 526 320 963 780 - 220 888 705 831 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csvlite --opprint merge-fields -a min,max,sum -c _in,_out data/inout.csv - a_min a_max a_sum b_min b_max b_sum - 436 490 926 195 446 641 - 320 526 846 780 963 1743 - 220 888 1108 705 831 1536 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csvlite --opprint merge-fields -k -a sum -c _in,_out data/inout.csv - a_in a_out b_in b_out a_sum b_sum - 436 490 446 195 926 641 - 526 320 963 780 846 1743 - 220 888 705 831 1108 1536 - -.. _reference-verbs-most-frequent: - -most-frequent ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr most-frequent -h - Usage: mlr most-frequent [options] - Shows the most frequently occurring distinct values for specified field names. - The first entry is the statistical mode; the remaining are runners-up. - Options: - -f {one or more comma-separated field names}. Required flag. - -n {count}. Optional flag defaulting to 10. - -b Suppress counts; show only field values. - -o {name} Field name for output count. Default "count". - See also "mlr least-frequent". - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint --from data/colored-shapes.dkvp most-frequent -f shape -n 5 - shape count - square 4115 - triangle 3372 - circle 2591 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint --from data/colored-shapes.dkvp most-frequent -f shape,color -n 5 - shape color count - square red 1874 - triangle red 1560 - circle red 1207 - square yellow 589 - square blue 589 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint --from data/colored-shapes.dkvp most-frequent -f shape,color -n 5 -o someothername - shape color someothername - square red 1874 - triangle red 1560 - circle red 1207 - square yellow 589 - square blue 589 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint --from data/colored-shapes.dkvp most-frequent -f shape,color -n 5 -b - shape color - square red - triangle red - circle red - square yellow - square blue - -See also :ref:`reference-verbs-least-frequent`. - -.. _reference-verbs-nest: - -nest ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr nest -h - Usage: mlr nest [options] - Explodes specified field values into separate fields/records, or reverses this. - Options: - --explode,--implode One is required. - --values,--pairs One is required. - --across-records,--across-fields One is required. - -f {field name} Required. - --nested-fs {string} Defaults to ";". Field separator for nested values. - --nested-ps {string} Defaults to ":". Pair separator for nested key-value pairs. - --evar {string} Shorthand for --explode --values ---across-records --nested-fs {string} - --ivar {string} Shorthand for --implode --values ---across-records --nested-fs {string} - Please use "mlr --usage-separator-options" for information on specifying separators. - - Examples: - - mlr nest --explode --values --across-records -f x - with input record "x=a;b;c,y=d" produces output records - "x=a,y=d" - "x=b,y=d" - "x=c,y=d" - Use --implode to do the reverse. - - mlr nest --explode --values --across-fields -f x - with input record "x=a;b;c,y=d" produces output records - "x_1=a,x_2=b,x_3=c,y=d" - Use --implode to do the reverse. - - mlr nest --explode --pairs --across-records -f x - with input record "x=a:1;b:2;c:3,y=d" produces output records - "a=1,y=d" - "b=2,y=d" - "c=3,y=d" - - mlr nest --explode --pairs --across-fields -f x - with input record "x=a:1;b:2;c:3,y=d" produces output records - "a=1,b=2,c=3,y=d" - - Notes: - * With --pairs, --implode doesn't make sense since the original field name has - been lost. - * The combination "--implode --values --across-records" is non-streaming: - no output records are produced until all input records have been read. In - particular, this means it won't work in tail -f contexts. But all other flag - combinations result in streaming (tail -f friendly) data processing. - * It's up to you to ensure that the nested-fs is distinct from your data's IFS: - e.g. by default the former is semicolon and the latter is comma. - See also mlr reshape. - -.. _reference-verbs-nothing: - -nothing ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr nothing -h - Usage: mlr nothing [options] - Drops all input records. Useful for testing, or after tee/print/etc. have - produced other output. - Options: - -h|--help Show this message. - -.. _reference-verbs-put: - -put ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put --help - Usage: mlr put [options] {DSL expression} - Options: - -f {file name} File containing a DSL expression. If the filename is a directory, - all *.mlr files in that directory are loaded. - - -e {expression} You can use this after -f to add an expression. Example use - case: define functions/subroutines in a file you specify with -f, then call - them with an expression you specify with -e. - - (If you mix -e and -f then the expressions are evaluated in the order encountered. - Since the expression pieces are simply concatenated, please be sure to use intervening - semicolons to separate expressions.) - - -s name=value: Predefines out-of-stream variable @name to have - Thus mlr put -s foo=97 '$column += @foo' is like - mlr put 'begin {@foo = 97} $column += @foo'. - The value part is subject to type-inferencing. - May be specified more than once, e.g. -s name1=value1 -s name2=value2. - Note: the value may be an environment variable, e.g. -s sequence=$SEQUENCE - - -x (default false) Prints records for which {expression} evaluates to false, not true, - i.e. invert the sense of the filter expression. - - -q Does not include the modified record in the output stream. - Useful for when all desired output is in begin and/or end blocks. - - -S and -F: There are no-ops in Miller 6 and above, since now type-inferencing is done - by the record-readers before filter/put is executed. Supported as no-op pass-through - flags for backward compatibility. - - -h|--help Show this message. - - Parser-info options: - - -w Print warnings about things like uninitialized variables. - - -W Same as -w, but exit the process if there are any warnings. - - -p Prints the expressions's AST (abstract syntax tree), which gives full - transparency on the precedence and associativity rules of Miller's grammar, - to stdout. - - -d Like -p but uses a parenthesized-expression format for the AST. - - -D Like -d but with output all on one line. - - -E Echo DSL expression before printing parse-tree - - -v Same as -E -p. - - -X Exit after parsing but before stream-processing. Useful with -v/-d/-D, if you - only want to look at parser information. - -Features which put shares with filter -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Please see the :doc:`reference-dsl` for more information about the expression language for ``mlr put``. - -.. _reference-verbs-regularize: - -regularize ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr regularize --help - Usage: mlr regularize [options] - Outputs records sorted lexically ascending by keys.Options: - -h|--help Show this message. - -This exists since hash-map software in various languages and tools encountered in the wild does not always print similar rows with fields in the same order: ``mlr regularize`` helps clean that up. - -See also :ref:`reference-verbs-reorder`. - -.. _reference-verbs-remove-empty-columns: - -remove-empty-columns ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr remove-empty-columns --help - Usage: mlr remove-empty-columns [options] - Omits fields which are empty on every input row. Non-streaming. - Options: - -h|--help Show this message. - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/remove-empty-columns.csv - a,b,c,d,e - 1,,3,,5 - 2,,4,,5 - 3,,5,,7 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv remove-empty-columns data/remove-empty-columns.csv - a,c,e - 1,3,5 - 2,4,5 - 3,5,7 - -Since this verb needs to read all records to see if any of them has a non-empty value for a given field name, it is non-streaming: it will ingest all records before writing any. - -.. _reference-verbs-rename: - -rename ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr rename --help - Usage: mlr rename [options] {old1,new1,old2,new2,...} - Renames specified fields. - Options: - -r Treat old field names as regular expressions. "ab", "a.*b" - will match any field name containing the substring "ab" or - matching "a.*b", respectively; anchors of the form "^ab$", - "^a.*b$" may be used. New field names may be plain strings, - or may contain capture groups of the form "\1" through - "\9". Wrapping the regex in double quotes is optional, but - is required if you wish to follow it with 'i' to indicate - case-insensitivity. - -g Do global replacement within each field name rather than - first-match replacement. - -h|--help Show this message. - Examples: - mlr rename old_name,new_name' - mlr rename old_name_1,new_name_1,old_name_2,new_name_2' - mlr rename -r 'Date_[0-9]+,Date,' Rename all such fields to be "Date" - mlr rename -r '"Date_[0-9]+",Date' Same - mlr rename -r 'Date_([0-9]+).*,\1' Rename all such fields to be of the form 20151015 - mlr rename -r '"name"i,Name' Rename "name", "Name", "NAME", etc. to "Name" - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint cat data/small - a b i x y - pan pan 1 0.3467901443380824 0.7268028627434533 - eks pan 2 0.7586799647899636 0.5221511083334797 - wye wye 3 0.20460330576630303 0.33831852551664776 - eks wye 4 0.38139939387114097 0.13418874328430463 - wye pan 5 0.5732889198020006 0.8636244699032729 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint rename i,INDEX,b,COLUMN2 data/small - a COLUMN2 INDEX x y - pan pan 1 0.3467901443380824 0.7268028627434533 - eks pan 2 0.7586799647899636 0.5221511083334797 - wye wye 3 0.20460330576630303 0.33831852551664776 - eks wye 4 0.38139939387114097 0.13418874328430463 - wye pan 5 0.5732889198020006 0.8636244699032729 - -As discussed in :doc:`performance`, ``sed`` is significantly faster than Miller at doing this. However, Miller is format-aware, so it knows to do renames only within specified field keys and not any others, nor in field values which may happen to contain the same pattern. Example: - -.. code-block:: none - :emphasize-lines: 1-1 - - sed 's/y/COLUMN5/g' data/small - a=pan,b=pan,i=1,x=0.3467901443380824,COLUMN5=0.7268028627434533 - a=eks,b=pan,i=2,x=0.7586799647899636,COLUMN5=0.5221511083334797 - a=wCOLUMN5e,b=wCOLUMN5e,i=3,x=0.20460330576630303,COLUMN5=0.33831852551664776 - a=eks,b=wCOLUMN5e,i=4,x=0.38139939387114097,COLUMN5=0.13418874328430463 - a=wCOLUMN5e,b=pan,i=5,x=0.5732889198020006,COLUMN5=0.8636244699032729 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr rename y,COLUMN5 data/small - a=pan,b=pan,i=1,x=0.3467901443380824,COLUMN5=0.7268028627434533 - a=eks,b=pan,i=2,x=0.7586799647899636,COLUMN5=0.5221511083334797 - a=wye,b=wye,i=3,x=0.20460330576630303,COLUMN5=0.33831852551664776 - a=eks,b=wye,i=4,x=0.38139939387114097,COLUMN5=0.13418874328430463 - a=wye,b=pan,i=5,x=0.5732889198020006,COLUMN5=0.8636244699032729 - -See also :ref:`reference-verbs-label`. - -.. _reference-verbs-reorder: - -reorder ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr reorder --help - Usage: mlr reorder [options] - Moves specified names to start of record, or end of record. - Options: - -e Put specified field names at record end: default is to put them at record start. - -f {a,b,c} Field names to reorder. - -b {x} Put field names specified with -f before field name specified by {x}, - if any. If {x} isn't present in a given record, the specified fields - will not be moved. - -a {x} Put field names specified with -f after field name specified by {x}, - if any. If {x} isn't present in a given record, the specified fields - will not be moved. - -h|--help Show this message. - - Examples: - mlr reorder -f a,b sends input record "d=4,b=2,a=1,c=3" to "a=1,b=2,d=4,c=3". - mlr reorder -e -f a,b sends input record "d=4,b=2,a=1,c=3" to "d=4,c=3,a=1,b=2". - -This pivots specified field names to the start or end of the record -- for -example when you have highly multi-column data and you want to bring a field or -two to the front of line where you can give a quick visual scan. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint cat data/small - a b i x y - pan pan 1 0.3467901443380824 0.7268028627434533 - eks pan 2 0.7586799647899636 0.5221511083334797 - wye wye 3 0.20460330576630303 0.33831852551664776 - eks wye 4 0.38139939387114097 0.13418874328430463 - wye pan 5 0.5732889198020006 0.8636244699032729 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint reorder -f i,b data/small - i b a x y - 1 pan pan 0.3467901443380824 0.7268028627434533 - 2 pan eks 0.7586799647899636 0.5221511083334797 - 3 wye wye 0.20460330576630303 0.33831852551664776 - 4 wye eks 0.38139939387114097 0.13418874328430463 - 5 pan wye 0.5732889198020006 0.8636244699032729 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint reorder -e -f i,b data/small - a x y i b - pan 0.3467901443380824 0.7268028627434533 1 pan - eks 0.7586799647899636 0.5221511083334797 2 pan - wye 0.20460330576630303 0.33831852551664776 3 wye - eks 0.38139939387114097 0.13418874328430463 4 wye - wye 0.5732889198020006 0.8636244699032729 5 pan - -.. _reference-verbs-repeat: - -repeat ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr repeat --help - Usage: mlr repeat [options] - Copies input records to output records multiple times. - Options must be exactly one of the following: - -n {repeat count} Repeat each input record this many times. - -f {field name} Same, but take the repeat count from the specified - field name of each input record. - -h|--help Show this message. - Example: - echo x=0 | mlr repeat -n 4 then put '$x=urand()' - produces: - x=0.488189 - x=0.484973 - x=0.704983 - x=0.147311 - Example: - echo a=1,b=2,c=3 | mlr repeat -f b - produces: - a=1,b=2,c=3 - a=1,b=2,c=3 - Example: - echo a=1,b=2,c=3 | mlr repeat -f c - produces: - a=1,b=2,c=3 - a=1,b=2,c=3 - a=1,b=2,c=3 - -This is useful in at least two ways: one, as a data-generator as in the -above example using ``urand()``; two, for reconstructing individual -samples from data which has been count-aggregated: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/repeat-example.dat - color=blue,count=5 - color=red,count=4 - color=green,count=3 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr repeat -f count then cut -x -f count data/repeat-example.dat - color=blue - color=blue - color=blue - color=blue - color=blue - color=red - color=red - color=red - color=red - color=green - color=green - color=green - -After expansion with ``repeat``, such data can then be sent on to -``stats1 -a mode``, or (if the data are numeric) to ``stats1 -a -p10,p50,p90``, etc. - -.. _reference-verbs-reshape: - -reshape ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr reshape --help - Usage: mlr reshape [options] - Wide-to-long options: - -i {input field names} -o {key-field name,value-field name} - -r {input field regexes} -o {key-field name,value-field name} - These pivot/reshape the input data such that the input fields are removed - and separate records are emitted for each key/value pair. - Note: this works with tail -f and produces output records for each input - record seen. - Long-to-wide options: - -s {key-field name,value-field name} - These pivot/reshape the input data to undo the wide-to-long operation. - Note: this does not work with tail -f; it produces output records only after - all input records have been read. - - Examples: - - Input file "wide.txt": - time X Y - 2009-01-01 0.65473572 2.4520609 - 2009-01-02 -0.89248112 0.2154713 - 2009-01-03 0.98012375 1.3179287 - - mlr --pprint reshape -i X,Y -o item,value wide.txt - time item value - 2009-01-01 X 0.65473572 - 2009-01-01 Y 2.4520609 - 2009-01-02 X -0.89248112 - 2009-01-02 Y 0.2154713 - 2009-01-03 X 0.98012375 - 2009-01-03 Y 1.3179287 - - mlr --pprint reshape -r '[A-Z]' -o item,value wide.txt - time item value - 2009-01-01 X 0.65473572 - 2009-01-01 Y 2.4520609 - 2009-01-02 X -0.89248112 - 2009-01-02 Y 0.2154713 - 2009-01-03 X 0.98012375 - 2009-01-03 Y 1.3179287 - - Input file "long.txt": - time item value - 2009-01-01 X 0.65473572 - 2009-01-01 Y 2.4520609 - 2009-01-02 X -0.89248112 - 2009-01-02 Y 0.2154713 - 2009-01-03 X 0.98012375 - 2009-01-03 Y 1.3179287 - - mlr --pprint reshape -s item,value long.txt - time X Y - 2009-01-01 0.65473572 2.4520609 - 2009-01-02 -0.89248112 0.2154713 - 2009-01-03 0.98012375 1.3179287 - See also mlr nest. - -.. _reference-verbs-sample: - -sample ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr sample --help - Usage: mlr sample [options] - Reservoir sampling (subsampling without replacement), optionally by category. - See also mlr bootstrap and mlr shuffle. - Options: - -g {a,b,c} Optional: group-by-field names for samples, e.g. a,b,c. - -k {k} Required: number of records to output in total, or by group if using -g. - -h|--help Show this message. - -This is reservoir-sampling: select *k* items from *n* with -uniform probability and no repeats in the sample. (If *n* is less than -*k*, then of course only *n* samples are produced.) With ``-g -{field names}``, produce a *k*-sample for each distinct value of the -specified field names. - -.. code-block:: none - - $ mlr --opprint sample -k 4 data/colored-shapes.dkvp - color shape flag i u v w x - purple triangle 0 90122 0.9986871176198068 0.3037738877233719 0.5154934457238382 5.365962021016529 - red circle 0 3139 0.04835898233323954 -0.03964684310055758 0.5263660881848111 5.3758779366493625 - orange triangle 0 67847 0.36746306902109926 0.5161574810505635 0.5176199566173642 3.1748088656576567 - yellow square 1 33576 0.3098376725521097 0.8525628505287842 0.49774122460981685 4.494754378604669 - - $ mlr --opprint sample -k 4 data/colored-shapes.dkvp - color shape flag i u v w x - blue square 1 16783 0.09974385090654347 0.7243899920872646 0.5353718443278438 4.431057737383438 - orange square 1 93291 0.5944176543007182 0.17744449786454086 0.49262281749172077 3.1548117990710653 - yellow square 1 54436 0.5268161165014636 0.8785588662666121 0.5058773791931063 7.019185838783636 - yellow square 1 55491 0.0025440267883102274 0.05474106287787284 0.5102729153751984 3.526301273728043 - - $ mlr --opprint sample -k 2 -g color data/colored-shapes.dkvp - color shape flag i u v w x - yellow triangle 1 11 0.6321695890307647 0.9887207810889004 0.4364983936735774 5.7981881667050565 - yellow square 1 917 0.8547010348386344 0.7356782810796262 0.4531511689924275 5.774541777078352 - red circle 1 4000 0.05490416175132373 0.07392337815122155 0.49416101516594396 5.355725080701707 - red square 0 87506 0.6357719216821314 0.6970867759393995 0.4940826462055272 6.351579417310387 - purple triangle 0 14898 0.7800986870203719 0.23998073813992293 0.5014775988383656 3.141006771777843 - purple triangle 0 151 0.032614487569017414 0.7346633365041219 0.7812143304483805 2.6831992610568047 - green triangle 1 126 0.1513010528347546 0.40346767294704544 0.051213231883952326 5.955109300797182 - green circle 0 17635 0.029856606049114442 0.4724542934246524 0.49529606749929744 5.239153910272168 - blue circle 1 1020 0.414263129226617 0.8304946402876182 0.13151094520189244 4.397873687920433 - blue triangle 0 220 0.441773289968473 0.44597731903759075 0.6329360666849821 4.3064608776550894 - orange square 0 1885 0.8079311983747106 0.8685956833908394 0.3116410800256374 4.390864584500387 - orange triangle 0 1533 0.32904497195507487 0.23168161807490417 0.8722623057355134 5.164071635714438 - - $ mlr --opprint sample -k 2 -g color then sort -f color data/colored-shapes.dkvp - color shape flag i u v w x - blue circle 0 215 0.7803586969333292 0.33146680638888126 0.04289047852629113 5.725365736377487 - blue circle 1 3616 0.8548431579124808 0.4989623130006362 0.3339426415875795 3.696785877560498 - green square 0 356 0.7674272008085286 0.341578843118008 0.4570224877870851 4.830320062215299 - green square 0 152 0.6684429446914862 0.016056003736548696 0.4656148241291592 5.434588759225423 - orange triangle 0 587 0.5175826237797857 0.08989091493635304 0.9011709461770973 4.265854207755811 - orange triangle 0 1533 0.32904497195507487 0.23168161807490417 0.8722623057355134 5.164071635714438 - purple triangle 0 14192 0.5196327866973567 0.7860928603468063 0.4964368415453642 4.899167143824484 - purple triangle 0 65 0.6842806710360729 0.5823723856331258 0.8014053396013747 5.805148213865135 - red square 1 2431 0.38378504852300466 0.11445015005595527 0.49355539228753786 5.146756570128739 - red triangle 0 57097 0.43763430414406546 0.3355450325004481 0.5322349637512487 4.144267240289442 - yellow triangle 1 11 0.6321695890307647 0.9887207810889004 0.4364983936735774 5.7981881667050565 - yellow square 1 158 0.41527900739142165 0.7118027080775757 0.4200799665161291 5.33279067554884 - - -Note that no output is produced until all inputs are in. Another way to do -sampling, which works in the streaming case, is ``mlr filter 'urand() & -0.001'`` where you tune the 0.001 to meet your needs. - -.. _reference-verbs-sec2gmt: - -sec2gmt ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr sec2gmt -h - Usage: mlr sec2gmt [options] {comma-separated list of field names} - Replaces a numeric field representing seconds since the epoch with the - corresponding GMT timestamp; leaves non-numbers as-is. This is nothing - more than a keystroke-saver for the sec2gmt function: - mlr sec2gmt time1,time2 - is the same as - mlr put '$time1 = sec2gmt($time1); $time2 = sec2gmt($time2)' - Options: - -1 through -9: format the seconds using 1..9 decimal places, respectively. - --millis Input numbers are treated as milliseconds since the epoch. - --micros Input numbers are treated as microseconds since the epoch. - --nanos Input numbers are treated as nanoseconds since the epoch. - -h|--help Show this message. - -.. _reference-verbs-sec2gmtdate: - -sec2gmtdate ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr sec2gmtdate -h - Usage: ../c/mlr sec2gmtdate {comma-separated list of field names} - Replaces a numeric field representing seconds since the epoch with the - corresponding GMT year-month-day timestamp; leaves non-numbers as-is. - This is nothing more than a keystroke-saver for the sec2gmtdate function: - ../c/mlr sec2gmtdate time1,time2 - is the same as - ../c/mlr put '$time1=sec2gmtdate($time1);$time2=sec2gmtdate($time2)' - -.. _reference-verbs-seqgen: - -seqgen ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr seqgen -h - Usage: mlr seqgen [options] - Passes input records directly to output. Most useful for format conversion. - Produces a sequence of counters. Discards the input record stream. Produces - output as specified by the options - - Options: - -f {name} (default "i") Field name for counters. - --start {value} (default 1) Inclusive start value. - --step {value} (default 1) Step value. - --stop {value} (default 100) Inclusive stop value. - -h|--help Show this message. - Start, stop, and/or step may be floating-point. Output is integer if start, - stop, and step are all integers. Step may be negative. It may not be zero - unless start == stop. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr seqgen --stop 10 - i=1 - i=2 - i=3 - i=4 - i=5 - i=6 - i=7 - i=8 - i=9 - i=10 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr seqgen --start 20 --stop 40 --step 4 - i=20 - i=24 - i=28 - i=32 - i=36 - i=40 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr seqgen --start 40 --stop 20 --step -4 - i=40 - i=36 - i=32 - i=28 - i=24 - i=20 - -.. _reference-verbs-shuffle: - -shuffle ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr shuffle -h - Usage: mlr shuffle [options] - Outputs records randomly permuted. No output records are produced until - all input records are read. See also mlr bootstrap and mlr sample. - Options: - -h|--help Show this message. - -.. _reference-verbs-skip-trivial-records: - -skip-trivial-records ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr skip-trivial-records -h - Usage: mlr skip-trivial-records [options] - Passes through all records except those with zero fields, - or those for which all fields have empty value. - Options: - -h|--help Show this message. - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/trivial-records.csv - a,b,c - 1,2,3 - 4,,6 - ,, - ,8,9 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv skip-trivial-records data/trivial-records.csv - a,b,c - 1,2,3 - 4,,6 - ,8,9 - -.. _reference-verbs-sort: - -sort ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr sort --help - Usage: mlr sort {flags} - Sorts records primarily by the first specified field, secondarily by the second - field, and so on. (Any records not having all specified sort keys will appear - at the end of the output, in the order they were encountered, regardless of the - specified sort order.) The sort is stable: records that compare equal will sort - in the order they were encountered in the input record stream. - - Options: - -f {comma-separated field names} Lexical ascending - -n {comma-separated field names} Numerical ascending; nulls sort last - -nf {comma-separated field names} Same as -n - -r {comma-separated field names} Lexical descending - -nr {comma-separated field names} Numerical descending; nulls sort first - -h|--help Show this message. - - Example: - mlr sort -f a,b -nr x,y,z - which is the same as: - mlr sort -f a -f b -nr x -nr y -nr z - -Example: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint sort -f a -nr x data/small - a b i x y - eks pan 2 0.7586799647899636 0.5221511083334797 - eks wye 4 0.38139939387114097 0.13418874328430463 - pan pan 1 0.3467901443380824 0.7268028627434533 - wye pan 5 0.5732889198020006 0.8636244699032729 - wye wye 3 0.20460330576630303 0.33831852551664776 - -Here's an example filtering log data: suppose multiple threads (labeled here by color) are all logging progress counts to a single log file. The log file is (by nature) chronological, so the progress of various threads is interleaved: - -.. code-block:: none - :emphasize-lines: 1-1 - - head -n 10 data/multicountdown.dat - upsec=0.002,color=green,count=1203 - upsec=0.083,color=red,count=3817 - upsec=0.188,color=red,count=3801 - upsec=0.395,color=blue,count=2697 - upsec=0.526,color=purple,count=953 - upsec=0.671,color=blue,count=2684 - upsec=0.899,color=purple,count=926 - upsec=0.912,color=red,count=3798 - upsec=1.093,color=blue,count=2662 - upsec=1.327,color=purple,count=917 - -We can group these by thread by sorting on the thread ID (here, -``color``). Since Miller's sort is stable, this means that -timestamps within each thread's log data are still chronological: - -.. code-block:: none - :emphasize-lines: 1-1 - - head -n 20 data/multicountdown.dat | mlr --opprint sort -f color - upsec color count - 0.395 blue 2697 - 0.671 blue 2684 - 1.093 blue 2662 - 2.064 blue 2659 - 2.2880000000000003 blue 2647 - 0.002 green 1203 - 1.407 green 1187 - 1.448 green 1177 - 2.313 green 1161 - 0.526 purple 953 - 0.899 purple 926 - 1.327 purple 917 - 1.703 purple 908 - 0.083 red 3817 - 0.188 red 3801 - 0.912 red 3798 - 1.416 red 3788 - 1.587 red 3782 - 1.601 red 3755 - 1.832 red 3717 - -Any records not having all specified sort keys will appear at the end of the output, in the order they -were encountered, regardless of the specified sort order: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr sort -n x data/sort-missing.dkvp - x=1 - x=2 - x=4 - a=3 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr sort -nr x data/sort-missing.dkvp - x=4 - x=2 - x=1 - a=3 - -.. _reference-verbs-sort-within-records: - -sort-within-records ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr sort-within-records -h - Usage: mlr sort-within-records [options] - Outputs records sorted lexically ascending by keys. - Options: - -r Recursively sort subobjects/submaps, e.g. for JSON input. - -h|--help Show this message. - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/sort-within-records.json - { - "a": 1, - "b": 2, - "c": 3 - } - { - "b": 4, - "a": 5, - "c": 6 - } - { - "c": 7, - "b": 8, - "a": 9 - } - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --ijson --opprint cat data/sort-within-records.json - a b c - 1 2 3 - - b a c - 4 5 6 - - c b a - 7 8 9 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --json sort-within-records data/sort-within-records.json - { - "a": 1, - "b": 2, - "c": 3 - } - { - "a": 5, - "b": 4, - "c": 6 - } - { - "a": 9, - "b": 8, - "c": 7 - } - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --ijson --opprint sort-within-records data/sort-within-records.json - a b c - 1 2 3 - 5 4 6 - 9 8 7 - -.. _reference-verbs-stats1: - -stats1 ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr stats1 --help - Usage: mlr stats1 [options] - Computes univariate statistics for one or more given fields, accumulated across - the input record stream. - Options: - -a {sum,count,...} Names of accumulators: one or more of: - median This is the same as p50 - p10 p25.2 p50 p98 p100 etc. - TODO: flags for interpolated percentiles - count Count instances of fields - mode Find most-frequently-occurring values for fields; first-found wins tie - antimode Find least-frequently-occurring values for fields; first-found wins tie - sum Compute sums of specified fields - mean Compute averages (sample means) of specified fields - var Compute sample variance of specified fields - stddev Compute sample standard deviation of specified fields - meaneb Estimate error bars for averages (assuming no sample autocorrelation) - skewness Compute sample skewness of specified fields - kurtosis Compute sample kurtosis of specified fields - min Compute minimum values of specified fields - max Compute maximum values of specified fields - - -f {a,b,c} Value-field names on which to compute statistics - -g {d,e,f} Optional group-by-field names - - -i Use interpolated percentiles, like R's type=7; default like type=1.\n"); - Not sensical for string-valued fields.\n"); - -s Print iterative stats. Useful in tail -f contexts (in which - case please avoid pprint-format output since end of input - stream will never be seen). - -h|--help Show this message. - [TODO: more] - Example: mlr stats1 -a min,p10,p50,p90,max -f value -g size,shape - mlr stats1 - Example: mlr stats1 -a count,mode -f size - mlr stats1 - Example: mlr stats1 -a count,mode -f size -g shape - mlr stats1 - Example: mlr stats1 -a count,mode --fr '^[a-h].*$' -gr '^k.*$' - mlr stats1 - This computes count and mode statistics on all field names beginning - with a through h, grouped by all field names starting with k. - - Notes: - * p50 and median are synonymous. - * min and max output the same results as p0 and p100, respectively, but use - less memory. - * String-valued data make sense unless arithmetic on them is required, - e.g. for sum, mean, interpolated percentiles, etc. In case of mixed data, - numbers are less than strings. - * count and mode allow text input; the rest require numeric input. - In particular, 1 and 1.0 are distinct text for count and mode. - * When there are mode ties, the first-encountered datum wins. - -These are simple univariate statistics on one or more number-valued fields -(``count`` and ``mode`` apply to non-numeric fields as well), -optionally categorized by one or more other fields. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --oxtab stats1 -a count,sum,min,p10,p50,mean,p90,max -f x,y data/medium - x_count 10000 - x_sum 4986.019681679581 - x_min 0.00004509679127584487 - x_p10 0.09332217805283527 - x_p50 0.5011592202840128 - x_mean 0.49860196816795804 - x_p90 0.900794437962015 - x_max 0.999952670371898 - y_count 10000 - y_sum 5062.057444929905 - y_min 0.00008818962627266114 - y_p10 0.10213207378968225 - y_p50 0.5060212582772865 - y_mean 0.5062057444929905 - y_p90 0.9053657573378745 - y_max 0.9999648102177897 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint stats1 -a mean -f x,y -g b then sort -f b data/medium - b x_mean y_mean - eks 0.5063609846272304 0.510292657158104 - hat 0.4878988625336502 0.5131176341556505 - pan 0.4973036405471583 0.49959885012092725 - wye 0.4975928392133964 0.5045964890907357 - zee 0.5042419022900586 0.5029967546798116 - -.. code-block:: none - :emphasize-lines: 1-3 - - mlr --opprint stats1 -a p50,p99 -f u,v -g color \ - then put '$ur=$u_p99/$u_p50;$vr=$v_p99/$v_p50' \ - data/colored-shapes.dkvp - color u_p50 u_p99 v_p50 v_p99 ur vr - yellow 0.5010187906650703 0.9890464545334569 0.5206303554834582 0.9870337429747029 1.9740705797093183 1.8958436298977264 - red 0.48503770531462564 0.9900536015797581 0.49258608624814926 0.9944442307252868 2.0411889441410493 2.0188232239761583 - purple 0.501319018852234 0.9888929892441335 0.5045708384576747 0.9882869130316426 1.9725822321846005 1.9586683131600438 - green 0.5020151016389706 0.9907635833945612 0.5053591509128329 0.9901745564521951 1.9735732653458684 1.9593482272234264 - blue 0.525225660059 0.9926547550299167 0.48516993577967726 0.993872833141726 1.8899586035427312 2.0485045750919286 - orange 0.4835478569328253 0.9936350141409035 0.48091255603363914 0.9891023960550895 2.0548845370623567 2.0567198415711636 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint count-distinct -f shape then sort -nr count data/colored-shapes.dkvp - shape count - square 4115 - triangle 3372 - circle 2591 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint stats1 -a mode -f color -g shape data/colored-shapes.dkvp - shape color_mode - triangle red - square red - circle red - -.. _reference-verbs-stats2: - -stats2 ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr stats2 --help - Usage: mlr stats2 [options] - Computes bivariate statistics for one or more given field-name pairs, - accumulated across the input record stream. - -a {linreg-ols,corr,...} Names of accumulators: one or more of: - linreg-ols Linear regression using ordinary least squares - linreg-pca Linear regression using principal component analysis - r2 Quality metric for linreg-ols (linreg-pca emits its own) - logireg Logistic regression - corr Sample correlation - cov Sample covariance - covx Sample-covariance matrix - -f {a,b,c,d} Value-field name-pairs on which to compute statistics. - There must be an even number of names. - -g {e,f,g} Optional group-by-field names. - -v Print additional output for linreg-pca. - -s Print iterative stats. Useful in tail -f contexts (in which - case please avoid pprint-format output since end of input - stream will never be seen). - --fit Rather than printing regression parameters, applies them to - the input data to compute new fit fields. All input records are - held in memory until end of input stream. Has effect only for - linreg-ols, linreg-pca, and logireg. - Only one of -s or --fit may be used. - Example: mlr stats2 -a linreg-pca -f x,y - Example: mlr stats2 -a linreg-ols,r2 -f x,y -g size,shape - Example: mlr stats2 -a corr -f x,y - -These are simple bivariate statistics on one or more pairs of number-valued -fields, optionally categorized by one or more fields. - -.. code-block:: none - :emphasize-lines: 1-3 - - mlr --oxtab put '$x2=$x*$x; $xy=$x*$y; $y2=$y**2' \ - then stats2 -a cov,corr -f x,y,y,y,x2,xy,x2,y2 \ - data/medium - x_y_cov 0.000042574820827444476 - x_y_corr 0.0005042001844467462 - y_y_cov 0.08461122467974003 - y_y_corr 1 - x2_xy_cov 0.04188382281779374 - x2_xy_corr 0.630174342037994 - x2_y2_cov -0.00030953725962542085 - x2_y2_corr -0.0034249088761121966 - -.. code-block:: none - :emphasize-lines: 1-3 - - mlr --opprint put '$x2=$x*$x; $xy=$x*$y; $y2=$y**2' \ - then stats2 -a linreg-ols,r2 -f x,y,y,y,xy,y2 -g a \ - data/medium - a x_y_ols_m x_y_ols_b x_y_ols_n x_y_r2 y_y_ols_m y_y_ols_b y_y_ols_n y_y_r2 xy_y2_ols_m xy_y2_ols_b xy_y2_ols_n xy_y2_r2 - pan 0.01702551273681908 0.5004028922897639 2081 0.00028691820445814767 1 0 2081 1 0.8781320866715662 0.11908230147563566 2081 0.41749827377311266 - eks 0.0407804923685586 0.48140207967651016 1965 0.0016461239223448587 1 0 1965 1 0.8978728611690183 0.10734054433612333 1965 0.45563223864254526 - wye -0.03915349075204814 0.5255096523974456 1966 0.0015051268704373607 1 0 1966 1 0.8538317334220835 0.1267454301662969 1966 0.38991721818599295 - zee 0.0027812364960399147 0.5043070448033061 2047 0.000007751652858786137 1 0 2047 1 0.8524439912011013 0.12401684308018937 2047 0.39356598090006495 - hat -0.018620577041095078 0.5179005397264935 1941 0.0003520036646055585 1 0 1941 1 0.8412305086345014 0.13557328318623216 1941 0.3687944261732265 - -Here's an example simple line-fit. The ``x`` and ``y`` -fields of the ``data/medium`` dataset are just independent uniformly -distributed on the unit interval. Here we remove half the data and fit a line to it. - -.. code-block:: none - - - # Prepare input data: - mlr filter '($x<.5 && $y<.5) || ($x>.5 && $y>.5)' data/medium > data/medium-squares - - # Do a linear regression and examine coefficients: - mlr --ofs newline stats2 -a linreg-pca -f x,y data/medium-squares - x_y_pca_m=1.014419 - x_y_pca_b=0.000308 - x_y_pca_quality=0.861354 - - # Option 1 to apply the regression coefficients and produce a linear fit: - # Set x_y_pca_m and x_y_pca_b as shell variables: - eval $(mlr --ofs newline stats2 -a linreg-pca -f x,y data/medium-squares) - # In addition to x and y, make a new yfit which is the line fit, then plot - # using your favorite tool: - mlr --onidx put '$yfit='$x_y_pca_m'*$x+'$x_y_pca_b then cut -x -f a,b,i data/medium-squares \ - | pgr -p -title 'linreg-pca example' -xmin 0 -xmax 1 -ymin 0 -ymax 1 - - # Option 2 to apply the regression coefficients and produce a linear fit: use --fit option - mlr --onidx stats2 -a linreg-pca --fit -f x,y then cut -f a,b,i data/medium-squares \ - | pgr -p -title 'linreg-pca example' -xmin 0 -xmax 1 -ymin 0 -ymax 1 - - -I use `pgr `_ for plotting; here's a screenshot. - -.. image:: data/linreg-example.jpg - - -(Thanks Drew Kunas for a good conversation about PCA!) - -Here's an example estimating time-to-completion for a set of jobs. Input data comes from a log file, with number of work units left to do in the ``count`` field and accumulated seconds in the ``upsec`` field, labeled by the ``color`` field: - -.. code-block:: none - :emphasize-lines: 1-1 - - head -n 10 data/multicountdown.dat - upsec=0.002,color=green,count=1203 - upsec=0.083,color=red,count=3817 - upsec=0.188,color=red,count=3801 - upsec=0.395,color=blue,count=2697 - upsec=0.526,color=purple,count=953 - upsec=0.671,color=blue,count=2684 - upsec=0.899,color=purple,count=926 - upsec=0.912,color=red,count=3798 - upsec=1.093,color=blue,count=2662 - upsec=1.327,color=purple,count=917 - -We can do a linear regression on count remaining as a function of time: with ``c = m*u+b`` we want to find the time when the count goes to zero, i.e. ``u=-b/m``. - -.. code-block:: none - :emphasize-lines: 1-3 - - mlr --oxtab stats2 -a linreg-pca -f upsec,count -g color \ - then put '$donesec = -$upsec_count_pca_b/$upsec_count_pca_m' \ - data/multicountdown.dat - color green - upsec_count_pca_m -32.75691673397728 - upsec_count_pca_b 1213.7227296044375 - upsec_count_pca_n 24 - upsec_count_pca_quality 0.9999839351341062 - donesec 37.052410624028525 - - color red - upsec_count_pca_m -37.367646434187435 - upsec_count_pca_b 3810.1334002923936 - upsec_count_pca_n 30 - upsec_count_pca_quality 0.9999894618183773 - donesec 101.9634299688333 - - color blue - upsec_count_pca_m -29.2312120633493 - upsec_count_pca_b 2698.9328203182517 - upsec_count_pca_n 25 - upsec_count_pca_quality 0.9999590846136102 - donesec 92.33051350964094 - - color purple - upsec_count_pca_m -39.03009744795354 - upsec_count_pca_b 979.9883413064914 - upsec_count_pca_n 21 - upsec_count_pca_quality 0.9999908956206317 - donesec 25.10852919630297 - -.. _reference-verbs-step: - -step ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr step --help - Usage: mlr step [options] - Computes values dependent on the previous record, optionally grouped by category. - Options: - -a {delta,rsum,...} Names of steppers: comma-separated, one or more of: - delta Compute differences in field(s) between successive records - shift Include value(s) in field(s) from previous record, if any - from-first Compute differences in field(s) from first record - ratio Compute ratios in field(s) between successive records - rsum Compute running sums of field(s) between successive records - counter Count instances of field(s) between successive records - ewma Exponentially weighted moving average over successive records - - -f {a,b,c} Value-field names on which to compute statistics - -g {d,e,f} Optional group-by-field names - -F Computes integerable things (e.g. counter) in floating point. - As of Miller 6 this happens automatically, but the flag is accepted - as a no-op for backward compatibility with Miller 5 and below. - -d {x,y,z} Weights for ewma. 1 means current sample gets all weight (no - smoothing), near under under 1 is light smoothing, near over 0 is - heavy smoothing. Multiple weights may be specified, e.g. - "mlr step -a ewma -f sys_load -d 0.01,0.1,0.9". Default if omitted - is "-d 0.5". - -o {a,b,c} Custom suffixes for EWMA output fields. If omitted, these default to - the -d values. If supplied, the number of -o values must be the same - as the number of -d values. - -h|--help Show this message. - - Examples: - mlr step -a rsum -f request_size - mlr step -a delta -f request_size -g hostname - mlr step -a ewma -d 0.1,0.9 -f x,y - mlr step -a ewma -d 0.1,0.9 -o smooth,rough -f x,y - mlr step -a ewma -d 0.1,0.9 -o smooth,rough -f x,y -g group_name - - Please see https://miller.readthedocs.io/en/latest/reference-verbs.html#filter or - https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average - for more information on EWMA. - -Most Miller commands are record-at-a-time, with the exception of ``stats1``, ``stats2``, and ``histogram`` which compute aggregate output. The ``step`` command is intermediate: it allows the option of adding fields which are functions of fields from previous records. Rsum is short for *running sum*. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint step -a shift,delta,rsum,counter -f x data/medium | head -15 - a b i x y x_shift x_delta x_rsum x_counter - pan pan 1 0.3467901443380824 0.7268028627434533 - 0 0.3467901443380824 1 - eks pan 2 0.7586799647899636 0.5221511083334797 0.3467901443380824 0.41188982045188116 1.105470109128046 2 - wye wye 3 0.20460330576630303 0.33831852551664776 0.7586799647899636 -0.5540766590236605 1.3100734148943491 3 - eks wye 4 0.38139939387114097 0.13418874328430463 0.20460330576630303 0.17679608810483793 1.6914728087654902 4 - wye pan 5 0.5732889198020006 0.8636244699032729 0.38139939387114097 0.19188952593085962 2.264761728567491 5 - zee pan 6 0.5271261600918548 0.49322128674835697 0.5732889198020006 -0.04616275971014583 2.7918878886593457 6 - eks zee 7 0.6117840605678454 0.1878849191181694 0.5271261600918548 0.08465790047599064 3.403671949227191 7 - zee wye 8 0.5985540091064224 0.976181385699006 0.6117840605678454 -0.013230051461422976 4.0022259583336135 8 - hat wye 9 0.03144187646093577 0.7495507603507059 0.5985540091064224 -0.5671121326454867 4.033667834794549 9 - pan wye 10 0.5026260055412137 0.9526183602969864 0.03144187646093577 0.47118412908027796 4.536293840335763 10 - pan pan 11 0.7930488423451967 0.6505816637259333 0.5026260055412137 0.29042283680398295 5.32934268268096 11 - zee pan 12 0.3676141320555616 0.23614420670296965 0.7930488423451967 -0.4254347102896351 5.696956814736522 12 - eks pan 13 0.4915175580479536 0.7709126592971468 0.3676141320555616 0.12390342599239201 6.1884743727844755 13 - eks zee 14 0.5207382318405251 0.34141681118811673 0.4915175580479536 0.02922067379257154 6.709212604625001 14 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint step -a shift,delta,rsum,counter -f x -g a data/medium | head -15 - a b i x y x_shift x_delta x_rsum x_counter - pan pan 1 0.3467901443380824 0.7268028627434533 - 0 0.3467901443380824 1 - eks pan 2 0.7586799647899636 0.5221511083334797 - 0 0.7586799647899636 1 - wye wye 3 0.20460330576630303 0.33831852551664776 - 0 0.20460330576630303 1 - eks wye 4 0.38139939387114097 0.13418874328430463 0.7586799647899636 -0.3772805709188226 1.1400793586611044 2 - wye pan 5 0.5732889198020006 0.8636244699032729 0.20460330576630303 0.36868561403569755 0.7778922255683036 2 - zee pan 6 0.5271261600918548 0.49322128674835697 - 0 0.5271261600918548 1 - eks zee 7 0.6117840605678454 0.1878849191181694 0.38139939387114097 0.23038466669670443 1.75186341922895 3 - zee wye 8 0.5985540091064224 0.976181385699006 0.5271261600918548 0.07142784901456767 1.1256801691982772 2 - hat wye 9 0.03144187646093577 0.7495507603507059 - 0 0.03144187646093577 1 - pan wye 10 0.5026260055412137 0.9526183602969864 0.3467901443380824 0.1558358612031313 0.8494161498792961 2 - pan pan 11 0.7930488423451967 0.6505816637259333 0.5026260055412137 0.29042283680398295 1.6424649922244927 3 - zee pan 12 0.3676141320555616 0.23614420670296965 0.5985540091064224 -0.23093987705086083 1.4932943012538389 3 - eks pan 13 0.4915175580479536 0.7709126592971468 0.6117840605678454 -0.1202665025198918 2.2433809772769036 4 - eks zee 14 0.5207382318405251 0.34141681118811673 0.4915175580479536 0.02922067379257154 2.7641192091174287 5 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint step -a ewma -f x -d 0.1,0.9 data/medium | head -15 - a b i x y x_ewma_0.1 x_ewma_0.9 - pan pan 1 0.3467901443380824 0.7268028627434533 0.3467901443380824 0.3467901443380824 - eks pan 2 0.7586799647899636 0.5221511083334797 0.3879791263832706 0.7174909827447755 - wye wye 3 0.20460330576630303 0.33831852551664776 0.36964154432157387 0.25589207346415027 - eks wye 4 0.38139939387114097 0.13418874328430463 0.37081732927653055 0.3688486618304419 - wye pan 5 0.5732889198020006 0.8636244699032729 0.3910644883290776 0.5528448940048447 - zee pan 6 0.5271261600918548 0.49322128674835697 0.4046706555053553 0.5296980334831537 - eks zee 7 0.6117840605678454 0.1878849191181694 0.4253819960116043 0.6035754578593763 - zee wye 8 0.5985540091064224 0.976181385699006 0.44269919732108615 0.5990561539817179 - hat wye 9 0.03144187646093577 0.7495507603507059 0.40157346523507115 0.08820330421301396 - pan wye 10 0.5026260055412137 0.9526183602969864 0.41167871926568544 0.46118373540839375 - pan pan 11 0.7930488423451967 0.6505816637259333 0.44981573157363663 0.7598623316515164 - zee pan 12 0.3676141320555616 0.23614420670296965 0.4415955716218291 0.4068389520151571 - eks pan 13 0.4915175580479536 0.7709126592971468 0.4465877702644416 0.48304969744467396 - eks zee 14 0.5207382318405251 0.34141681118811673 0.4540028164220499 0.51696937840094 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint step -a ewma -f x -d 0.1,0.9 -o smooth,rough data/medium | head -15 - a b i x y x_ewma_smooth x_ewma_rough - pan pan 1 0.3467901443380824 0.7268028627434533 0.3467901443380824 0.3467901443380824 - eks pan 2 0.7586799647899636 0.5221511083334797 0.3879791263832706 0.7174909827447755 - wye wye 3 0.20460330576630303 0.33831852551664776 0.36964154432157387 0.25589207346415027 - eks wye 4 0.38139939387114097 0.13418874328430463 0.37081732927653055 0.3688486618304419 - wye pan 5 0.5732889198020006 0.8636244699032729 0.3910644883290776 0.5528448940048447 - zee pan 6 0.5271261600918548 0.49322128674835697 0.4046706555053553 0.5296980334831537 - eks zee 7 0.6117840605678454 0.1878849191181694 0.4253819960116043 0.6035754578593763 - zee wye 8 0.5985540091064224 0.976181385699006 0.44269919732108615 0.5990561539817179 - hat wye 9 0.03144187646093577 0.7495507603507059 0.40157346523507115 0.08820330421301396 - pan wye 10 0.5026260055412137 0.9526183602969864 0.41167871926568544 0.46118373540839375 - pan pan 11 0.7930488423451967 0.6505816637259333 0.44981573157363663 0.7598623316515164 - zee pan 12 0.3676141320555616 0.23614420670296965 0.4415955716218291 0.4068389520151571 - eks pan 13 0.4915175580479536 0.7709126592971468 0.4465877702644416 0.48304969744467396 - eks zee 14 0.5207382318405251 0.34141681118811673 0.4540028164220499 0.51696937840094 - - -Example deriving uptime-delta from system uptime: - -.. code-block:: none - - $ each 10 uptime | mlr -p step -a delta -f 11 - ... - 20:08 up 36 days, 10:38, 5 users, load averages: 1.42 1.62 1.73 0.000000 - 20:08 up 36 days, 10:38, 5 users, load averages: 1.55 1.64 1.74 0.020000 - 20:08 up 36 days, 10:38, 7 users, load averages: 1.58 1.65 1.74 0.010000 - 20:08 up 36 days, 10:38, 9 users, load averages: 1.78 1.69 1.76 0.040000 - 20:08 up 36 days, 10:39, 9 users, load averages: 2.12 1.76 1.78 0.070000 - 20:08 up 36 days, 10:39, 9 users, load averages: 2.51 1.85 1.81 0.090000 - 20:08 up 36 days, 10:39, 8 users, load averages: 2.79 1.92 1.83 0.070000 - 20:08 up 36 days, 10:39, 4 users, load averages: 2.64 1.90 1.83 -0.020000 - - -.. _reference-verbs-tac: - -tac ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr tac --help - Usage: mlr tac [options] - Prints records in reverse order from the order in which they were encountered. - Options: - -h|--help Show this message. - -Prints the records in the input stream in reverse order. Note: this requires Miller to retain all input records in memory before any output records are produced. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --opprint cat data/a.csv - a b c - 1 2 3 - 4 5 6 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --opprint cat data/b.csv - a b c - 7 8 9 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --opprint tac data/a.csv data/b.csv - a b c - 7 8 9 - 4 5 6 - 1 2 3 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --opprint put '$filename=FILENAME' then tac data/a.csv data/b.csv - a b c filename - 7 8 9 data/b.csv - 4 5 6 data/a.csv - 1 2 3 data/a.csv - -.. _reference-verbs-tail: - -tail ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr tail --help - Usage: mlr tail [options] - Passes through the last n records, optionally by category. - Options: - -g {a,b,c} Optional group-by-field names for head counts, e.g. a,b,c. - -n {n} Head-count to print. Default 10. - -h|--help Show this message. - -Prints the last *n* records in the input stream, optionally by category. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint tail -n 4 data/colored-shapes.dkvp - color shape flag i u v w x - blue square 1 99974 0.6189062525431605 0.2637962404841453 0.5311465405784674 6.210738209085753 - blue triangle 0 99976 0.008110504040268474 0.8267274952432482 0.4732962944898885 6.146956761817328 - yellow triangle 0 99990 0.3839424618160777 0.55952913620132 0.5113763011485609 4.307973891915119 - yellow circle 1 99994 0.764950884927175 0.25284227383991364 0.49969878539567425 5.013809741826425 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint tail -n 1 -g shape data/colored-shapes.dkvp - color shape flag i u v w x - yellow triangle 0 99990 0.3839424618160777 0.55952913620132 0.5113763011485609 4.307973891915119 - blue square 1 99974 0.6189062525431605 0.2637962404841453 0.5311465405784674 6.210738209085753 - yellow circle 1 99994 0.764950884927175 0.25284227383991364 0.49969878539567425 5.013809741826425 - -.. _reference-verbs-tee: - -tee ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr tee --help - Usage: mlr tee [options] {filename} - Options: - -a Append to existing file, if any, rather than overwriting. - -p Treat filename as a pipe-to command. - Any of the output-format command-line flags (see mlr -h). Example: using - mlr --icsv --opprint put '...' then tee --ojson ./mytap.dat then stats1 ... - the input is CSV, the output is pretty-print tabular, but the tee-file output - is written in JSON format. - - -h|--help Show this message. - -.. _reference-verbs-template: - -template ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr template --help - Usage: mlr template [options] - Places input-record fields in the order specified by list of column names. - If the input record is missing a specified field, it will be filled with the fill-with. - If the input record possesses an unspecified field, it will be discarded. - Options: - -f {a,b,c} Comma-separated field names for template, e.g. a,b,c. - -t {filename} CSV file whose header line will be used for template. - --fill-with {filler string} What to fill absent fields with. Defaults to the empty string. - -h|--help Show this message. - Example: - * Specified fields are a,b,c. - * Input record is c=3,a=1,f=6. - * Output record is a=1,b=,c=3. - -.. _reference-verbs-top: - -top ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr top --help - Usage: mlr top [options] - -f {a,b,c} Value-field names for top counts. - -g {d,e,f} Optional group-by-field names for top counts. - -n {count} How many records to print per category; default 1. - -a Print all fields for top-value records; default is - to print only value and group-by fields. Requires a single - value-field name only. - --min Print top smallest values; default is top largest values. - -F Keep top values as floats even if they look like integers. - -o {name} Field name for output indices. Default "top_idx". - Prints the n records with smallest/largest values at specified fields, - optionally by category. - -Note that ``top`` is distinct from :ref:`reference-verbs-head` -- ``head`` shows fields which appear first in the data stream; ``top`` shows fields which are numerically largest (or smallest). - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint top -n 4 -f x data/medium - top_idx x_top - 1 0.999952670371898 - 2 0.9998228522652893 - 3 0.99973332327313 - 4 0.9995625801977208 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint top -n 4 -f x -o someothername data/medium - someothername x_top - 1 0.999952670371898 - 2 0.9998228522652893 - 3 0.99973332327313 - 4 0.9995625801977208 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint top -n 2 -f x -g a then sort -f a data/medium - a top_idx x_top - eks 1 0.9988110946859143 - eks 2 0.9985342548358704 - hat 1 0.999952670371898 - hat 2 0.99973332327313 - pan 1 0.9994029107062516 - pan 2 0.9990440068491747 - wye 1 0.9998228522652893 - wye 2 0.9992635865771493 - zee 1 0.9994904324789629 - zee 2 0.9994378171787394 - -.. _reference-verbs-uniq: - -uniq ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr uniq --help - Usage: mlr uniq [options] - Prints distinct values for specified field names. With -c, same as - count-distinct. For uniq, -f is a synonym for -g. - - Options: - -g {d,e,f} Group-by-field names for uniq counts. - -c Show repeat counts in addition to unique values. - -n Show only the number of distinct values. - -o {name} Field name for output count. Default "count". - -a Output each unique record only once. Incompatible with -g. - With -c, produces unique records, with repeat counts for each. - With -n, produces only one record which is the unique-record count. - With neither -c nor -n, produces unique records. - -There are two main ways to use ``mlr uniq``: the first way is with ``-g`` to specify group-by columns. - -.. code-block:: none - :emphasize-lines: 1-1 - - wc -l data/colored-shapes.dkvp - 10078 data/colored-shapes.dkvp - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr uniq -g color,shape data/colored-shapes.dkvp - color=yellow,shape=triangle - color=red,shape=square - color=red,shape=circle - color=purple,shape=triangle - color=yellow,shape=circle - color=purple,shape=square - color=yellow,shape=square - color=red,shape=triangle - color=green,shape=triangle - color=green,shape=square - color=blue,shape=circle - color=blue,shape=triangle - color=purple,shape=circle - color=blue,shape=square - color=green,shape=circle - color=orange,shape=triangle - color=orange,shape=square - color=orange,shape=circle - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint uniq -g color,shape -c then sort -f color,shape data/colored-shapes.dkvp - color shape count - blue circle 384 - blue square 589 - blue triangle 497 - green circle 287 - green square 454 - green triangle 368 - orange circle 68 - orange square 128 - orange triangle 107 - purple circle 289 - purple square 481 - purple triangle 372 - red circle 1207 - red square 1874 - red triangle 1560 - yellow circle 356 - yellow square 589 - yellow triangle 468 - -.. code-block:: none - :emphasize-lines: 1-3 - - mlr --opprint uniq -g color,shape -c -o someothername \ - then sort -nr someothername \ - data/colored-shapes.dkvp - color shape someothername - red square 1874 - red triangle 1560 - red circle 1207 - yellow square 589 - blue square 589 - blue triangle 497 - purple square 481 - yellow triangle 468 - green square 454 - blue circle 384 - purple triangle 372 - green triangle 368 - yellow circle 356 - purple circle 289 - green circle 287 - orange square 128 - orange triangle 107 - orange circle 68 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint uniq -n -g color,shape data/colored-shapes.dkvp - count - 18 - -The second main way to use ``mlr uniq`` is without group-by columns, using ``-a`` instead: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/repeats.dkvp - color=red,shape=square,flag=0 - color=purple,shape=triangle,flag=0 - color=yellow,shape=circle,flag=1 - color=red,shape=circle,flag=1 - color=red,shape=square,flag=0 - color=yellow,shape=circle,flag=1 - color=red,shape=square,flag=0 - color=red,shape=square,flag=0 - color=yellow,shape=circle,flag=1 - color=red,shape=circle,flag=1 - color=yellow,shape=circle,flag=1 - color=yellow,shape=circle,flag=1 - color=purple,shape=triangle,flag=0 - color=yellow,shape=circle,flag=1 - color=yellow,shape=circle,flag=1 - color=red,shape=circle,flag=1 - color=red,shape=square,flag=0 - color=purple,shape=triangle,flag=0 - color=yellow,shape=circle,flag=1 - color=red,shape=square,flag=0 - color=purple,shape=square,flag=0 - color=red,shape=square,flag=0 - color=red,shape=square,flag=1 - color=red,shape=square,flag=0 - color=red,shape=square,flag=0 - color=purple,shape=triangle,flag=0 - color=red,shape=square,flag=0 - color=purple,shape=triangle,flag=0 - color=red,shape=square,flag=0 - color=red,shape=square,flag=0 - color=purple,shape=square,flag=0 - color=red,shape=square,flag=0 - color=red,shape=square,flag=0 - color=purple,shape=triangle,flag=0 - color=yellow,shape=triangle,flag=1 - color=purple,shape=square,flag=0 - color=yellow,shape=circle,flag=1 - color=purple,shape=triangle,flag=0 - color=red,shape=circle,flag=1 - color=purple,shape=triangle,flag=0 - color=purple,shape=triangle,flag=0 - color=red,shape=square,flag=0 - color=red,shape=circle,flag=1 - color=red,shape=square,flag=1 - color=red,shape=square,flag=0 - color=red,shape=circle,flag=1 - color=purple,shape=square,flag=0 - color=purple,shape=square,flag=0 - color=red,shape=square,flag=1 - color=purple,shape=triangle,flag=0 - color=purple,shape=triangle,flag=0 - color=purple,shape=square,flag=0 - color=yellow,shape=circle,flag=1 - color=red,shape=square,flag=0 - color=yellow,shape=triangle,flag=1 - color=yellow,shape=circle,flag=1 - color=purple,shape=square,flag=0 - -.. code-block:: none - :emphasize-lines: 1-1 - - wc -l data/repeats.dkvp - 57 data/repeats.dkvp - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint uniq -a data/repeats.dkvp - color shape flag - red square 0 - purple triangle 0 - yellow circle 1 - red circle 1 - purple square 0 - red square 1 - yellow triangle 1 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint uniq -a -n data/repeats.dkvp - count - 7 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint uniq -a -c data/repeats.dkvp - count color shape flag - 17 red square 0 - 11 purple triangle 0 - 11 yellow circle 1 - 6 red circle 1 - 7 purple square 0 - 3 red square 1 - 2 yellow triangle 1 - -.. _reference-verbs-unsparsify: - -unsparsify ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr unsparsify --help - Usage: mlr unsparsify [options] - Prints records with the union of field names over all input records. - For field names absent in a given record but present in others, fills in - a value. This verb retains all input before producing any output. - Options: - --fill-with {filler string} What to fill absent fields with. Defaults to - the empty string. - -f {a,b,c} Specify field names to be operated on. Any other fields won't be - modified, and operation will be streaming. - -h|--help Show this message. - Example: if the input is two records, one being 'a=1,b=2' and the other - being 'b=3,c=4', then the output is the two records 'a=1,b=2,c=' and - 'a=,b=3,c=4'. - -Examples: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/sparse.json - {"a":1,"b":2,"v":3} - {"u":1,"b":2} - {"a":1,"v":2,"x":3} - {"v":1,"w":2} - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --json unsparsify data/sparse.json - { - "a": 1, - "b": 2, - "v": 3, - "u": "", - "x": "", - "w": "" - } - { - "a": "", - "b": 2, - "v": "", - "u": 1, - "x": "", - "w": "" - } - { - "a": 1, - "b": "", - "v": 2, - "u": "", - "x": 3, - "w": "" - } - { - "a": "", - "b": "", - "v": 1, - "u": "", - "x": "", - "w": 2 - } - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --ijson --opprint unsparsify data/sparse.json - a b v u x w - 1 2 3 - - - - - 2 - 1 - - - 1 - 2 - 3 - - - - 1 - - 2 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --ijson --opprint unsparsify --fill-with missing data/sparse.json - a b v u x w - 1 2 3 missing missing missing - missing 2 missing 1 missing missing - 1 missing 2 missing 3 missing - missing missing 1 missing missing 2 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --ijson --opprint unsparsify -f a,b,u data/sparse.json - a b v u - 1 2 3 - - - u b a - 1 2 - - - a v x b u - 1 2 3 - - - - v w a b u - 1 2 - - - - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --ijson --opprint unsparsify -f a,b,u,v,w,x then regularize data/sparse.json - a b v u w x - 1 2 3 - - - - - 2 - 1 - - - 1 - 2 - - 3 - - - 1 - 2 - - diff --git a/docs6/reference-verbs.rst.in b/docs6/reference-verbs.rst.in deleted file mode 100644 index d778fd6c6..000000000 --- a/docs6/reference-verbs.rst.in +++ /dev/null @@ -1,1312 +0,0 @@ -Reference: list of verbs -================================================================ - -Overview ----------------------------------------------------------------- - -Whereas the Unix toolkit is made of the separate executables ``cat``, ``tail``, ``cut``, -``sort``, etc., Miller has subcommands, or **verbs**, invoked as follows: - -GENRST_INCLUDE_ESCAPED(data/subcommand-example.txt) - -These fall into categories as follows: - -* Analogs of their Unix-toolkit namesakes, discussed below as well as in :doc:`feature-comparison`: :ref:`reference-verbs-cat`, :ref:`reference-verbs-cut`, :ref:`reference-verbs-grep`, :ref:`reference-verbs-head`, :ref:`reference-verbs-join`, :ref:`reference-verbs-sort`, :ref:`reference-verbs-tac`, :ref:`reference-verbs-tail`, :ref:`reference-verbs-top`, :ref:`reference-verbs-uniq`. - -* ``awk``-like functionality: :ref:`reference-verbs-filter`, :ref:`reference-verbs-put`, :ref:`reference-verbs-sec2gmt`, :ref:`reference-verbs-sec2gmtdate`, :ref:`reference-verbs-step`, :ref:`reference-verbs-tee`. - -* Statistically oriented: :ref:`reference-verbs-bar`, :ref:`reference-verbs-bootstrap`, :ref:`reference-verbs-decimate`, :ref:`reference-verbs-histogram`, :ref:`reference-verbs-least-frequent`, :ref:`reference-verbs-most-frequent`, :ref:`reference-verbs-sample`, :ref:`reference-verbs-shuffle`, :ref:`reference-verbs-stats1`, :ref:`reference-verbs-stats2`. - -* Particularly oriented toward :doc:`record-heterogeneity`, although all Miller commands can handle heterogeneous records: :ref:`reference-verbs-group-by`, :ref:`reference-verbs-group-like`, :ref:`reference-verbs-having-fields`. - -* These draw from other sources (see also :doc:`originality`): :ref:`reference-verbs-count-distinct` is SQL-ish, and :ref:`reference-verbs-rename` can be done by ``sed`` (which does it faster: see :doc:`performance`. Verbs: :ref:`reference-verbs-check`, :ref:`reference-verbs-count-distinct`, :ref:`reference-verbs-label`, :ref:`reference-verbs-merge-fields`, :ref:`reference-verbs-nest`, :ref:`reference-verbs-nothing`, :ref:`reference-verbs-regularize`, :ref:`reference-verbs-rename`, :ref:`reference-verbs-reorder`, :ref:`reference-verbs-reshape`, :ref:`reference-verbs-seqgen`. - -.. _reference-verbs-altkv: - -altkv ----------------------------------------------------------------- - -Map list of values to alternating key/value pairs. - -GENRST_RUN_COMMAND -mlr altkv -h -GENRST_EOF - -GENRST_RUN_COMMAND -echo 'a,b,c,d,e,f' | mlr altkv -GENRST_EOF - -GENRST_RUN_COMMAND -echo 'a,b,c,d,e,f,g' | mlr altkv -GENRST_EOF - -.. _reference-verbs-bar: - -bar ----------------------------------------------------------------- - -Cheesy bar-charting. - -GENRST_RUN_COMMAND -mlr bar -h -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint cat data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint bar --lo 0 --hi 1 -f x,y data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint bar --lo 0.4 --hi 0.6 -f x,y data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint bar --auto -f x,y data/small -GENRST_EOF - -.. _reference-verbs-bootstrap: - -bootstrap ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr bootstrap --help -GENRST_EOF - -The canonical use for bootstrap sampling is to put error bars on statistical quantities, such as mean. For example: - -.. - hard-coded, not live-code, since random sampling would generate different data on each doc run - which would needlessly complicate git diff - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr --opprint stats1 -a mean,count -f u -g color data/colored-shapes.dkvp -color u_mean u_count -yellow 0.497129 1413 -red 0.492560 4641 -purple 0.494005 1142 -green 0.504861 1109 -blue 0.517717 1470 -orange 0.490532 303 -GENRST_EOF - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr --opprint bootstrap then stats1 -a mean,count -f u -g color data/colored-shapes.dkvp -color u_mean u_count -yellow 0.500651 1380 -purple 0.501556 1111 -green 0.503272 1068 -red 0.493895 4702 -blue 0.512529 1496 -orange 0.521030 321 -GENRST_EOF - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr --opprint bootstrap then stats1 -a mean,count -f u -g color data/colored-shapes.dkvp -color u_mean u_count -yellow 0.498046 1485 -blue 0.513576 1417 -red 0.492870 4595 -orange 0.507697 307 -green 0.496803 1075 -purple 0.486337 1199 -GENRST_EOF - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr --opprint bootstrap then stats1 -a mean,count -f u -g color data/colored-shapes.dkvp -color u_mean u_count -blue 0.522921 1447 -red 0.490717 4617 -yellow 0.496450 1419 -purple 0.496523 1192 -green 0.507569 1111 -orange 0.468014 292 -GENRST_EOF - -.. _reference-verbs-cat: - -cat ----------------------------------------------------------------- - -Most useful for format conversions (see :doc:`file-formats`, and concatenating multiple same-schema CSV files to have the same header: - -GENRST_RUN_COMMAND -mlr cat -h -GENRST_EOF - -GENRST_RUN_COMMAND -cat data/a.csv -GENRST_EOF - -GENRST_RUN_COMMAND -cat data/b.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --csv cat data/a.csv data/b.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --icsv --oxtab cat data/a.csv data/b.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --csv cat -n data/a.csv data/b.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint cat data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint cat -n -g a data/small -GENRST_EOF - -.. _reference-verbs-check: - -check ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr check --help -GENRST_EOF - -.. _reference-verbs-clean-whitespace: - -clean-whitespace ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr clean-whitespace --help -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --icsv --ojson cat data/clean-whitespace.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --icsv --ojson clean-whitespace -k data/clean-whitespace.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --icsv --ojson clean-whitespace -v data/clean-whitespace.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --icsv --ojson clean-whitespace data/clean-whitespace.csv -GENRST_EOF - -Function links: - -* :ref:`reference-dsl-lstrip` -* :ref:`reference-dsl-rstrip` -* :ref:`reference-dsl-strip` -* :ref:`reference-dsl-collapse_whitespace` -* :ref:`reference-dsl-clean_whitespace` - -.. _reference-verbs-count: - -count ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr count --help -GENRST_EOF - -GENRST_RUN_COMMAND -mlr count data/medium -GENRST_EOF - -GENRST_RUN_COMMAND -mlr count -g a data/medium -GENRST_EOF - -GENRST_RUN_COMMAND -mlr count -n -g a data/medium -GENRST_EOF - -GENRST_RUN_COMMAND -mlr count -g b data/medium -GENRST_EOF - -GENRST_RUN_COMMAND -mlr count -n -g b data/medium -GENRST_EOF - -GENRST_RUN_COMMAND -mlr count -g a,b data/medium -GENRST_EOF - -.. _reference-verbs-count-distinct: - -count-distinct ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr count-distinct --help -GENRST_EOF - -GENRST_RUN_COMMAND -mlr count-distinct -f a,b then sort -nr count data/medium -GENRST_EOF - -GENRST_RUN_COMMAND -mlr count-distinct -u -f a,b data/medium -GENRST_EOF - -GENRST_RUN_COMMAND -mlr count-distinct -f a,b -o someothername then sort -nr someothername data/medium -GENRST_EOF - -GENRST_RUN_COMMAND -mlr count-distinct -n -f a,b data/medium -GENRST_EOF - -.. _reference-verbs-count-similar: - -count-similar ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr count-similar --help -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint head -n 20 data/medium -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint head -n 20 then count-similar -g a data/medium -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint head -n 20 then count-similar -g a then sort -f a data/medium -GENRST_EOF - -.. _reference-verbs-cut: - -cut ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr cut --help -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint cat data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint cut -f y,x,i data/small -GENRST_EOF - -GENRST_RUN_COMMAND -echo 'a=1,b=2,c=3' | mlr cut -f b,c,a -GENRST_EOF - -GENRST_RUN_COMMAND -echo 'a=1,b=2,c=3' | mlr cut -o -f b,c,a -GENRST_EOF - -.. _reference-verbs-decimate: - -decimate ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr decimate --help -GENRST_EOF - -.. _reference-verbs-fill-down: - -fill-down ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr fill-down --help -GENRST_EOF - -GENRST_RUN_COMMAND -cat data/fill-down.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --csv fill-down -f b data/fill-down.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --csv fill-down -a -f b data/fill-down.csv -GENRST_EOF - -.. _reference-verbs-filter: - -filter ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr filter --help -GENRST_EOF - -Features which filter shares with put -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Please see :doc:`reference-dsl` for more information about the expression language for ``mlr filter``. - -.. _reference-verbs-format-values: - -format-values ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr format-values --help -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint format-values data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint format-values -n data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint format-values -i %08llx -f %.6le -s X%sX data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint format-values -i %08llx -f %.6le -s X%sX -n data/small -GENRST_EOF - -.. _reference-verbs-fraction: - -fraction ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr fraction --help -GENRST_EOF - -For example, suppose you have the following CSV file: - -GENRST_INCLUDE_ESCAPED(data/fraction-example.csv) - -Then we can see what each record's ``n`` contributes to the total ``n``: - -GENRST_RUN_COMMAND -mlr --opprint fraction -f n data/fraction-example.csv -GENRST_EOF - -Using ``-g`` we can split those out by gender, or by color: - -GENRST_RUN_COMMAND -mlr --opprint fraction -f n -g u data/fraction-example.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint fraction -f n -g v data/fraction-example.csv -GENRST_EOF - -We can see, for example, that 70.9% of females have red (on the left) while 94.5% of reds are for females. - -To convert fractions to percents, you may use ``-p``: - -GENRST_RUN_COMMAND -mlr --opprint fraction -f n -p data/fraction-example.csv -GENRST_EOF - -Another often-used idiom is to convert from a point distribution to a cumulative distribution, also known as "running sums". Here, you can use ``-c``: - -GENRST_RUN_COMMAND -mlr --opprint fraction -f n -p -c data/fraction-example.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint fraction -f n -g u -p -c data/fraction-example.csv -GENRST_EOF - -.. _reference-verbs-grep: - -grep ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr grep -h -GENRST_EOF - -.. _reference-verbs-group-by: - -group-by ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr group-by --help -GENRST_EOF - -This is similar to ``sort`` but with less work. Namely, Miller's sort has three steps: read through the data and append linked lists of records, one for each unique combination of the key-field values; after all records are read, sort the key-field values; then print each record-list. The group-by operation simply omits the middle sort. An example should make this more clear. - -GENRST_RUN_COMMAND -mlr --opprint group-by a data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint sort -f a data/small -GENRST_EOF - -In this example, since the sort is on field ``a``, the first step is to group together all records having the same value for field ``a``; the second step is to sort the distinct ``a``-field values ``pan``, ``eks``, and ``wye`` into ``eks``, ``pan``, and ``wye``; the third step is to print out the record-list for ``a=eks``, then the record-list for ``a=pan``, then the record-list for ``a=wye``. The group-by operation omits the middle sort and just puts like records together, for those times when a sort isn't desired. In particular, the ordering of group-by fields for group-by is the order in which they were encountered in the data stream, which in some cases may be more interesting to you. - -.. _reference-verbs-group-like: - -group-like ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr group-like --help -GENRST_EOF - -This groups together records having the same schema (i.e. same ordered list of field names) which is useful for making sense of time-ordered output as described in :doc:`record-heterogeneity` -- in particular, in preparation for CSV or pretty-print output. - -GENRST_RUN_COMMAND -mlr cat data/het.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint group-like data/het.dkvp -GENRST_EOF - -.. _reference-verbs-having-fields: - -having-fields ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr having-fields --help -GENRST_EOF - -Similar to :ref:`reference-verbs-group-like`, this retains records with specified schema. - -GENRST_RUN_COMMAND -mlr cat data/het.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr having-fields --at-least resource data/het.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr having-fields --which-are resource,ok,loadsec data/het.dkvp -GENRST_EOF - -.. _reference-verbs-head: - -head ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr head --help -GENRST_EOF - -Note that ``head`` is distinct from :ref:`reference-verbs-top` -- ``head`` shows fields which appear first in the data stream; ``top`` shows fields which are numerically largest (or smallest). - -GENRST_RUN_COMMAND -mlr --opprint head -n 4 data/medium -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint head -n 1 -g b data/medium -GENRST_EOF - -.. _reference-verbs-histogram: - -histogram ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr histogram --help -GENRST_EOF - -This is just a histogram; there's not too much to say here. A note about binning, by example: Suppose you use ``--lo 0.0 --hi 1.0 --nbins 10 -f x``. The input numbers less than 0 or greater than 1 aren't counted in any bin. Input numbers equal to 1 are counted in the last bin. That is, bin 0 has ``0.0 ≤ x < 0.1``, bin 1 has ``0.1 ≤ x < 0.2``, etc., but bin 9 has ``0.9 ≤ x ≤ 1.0``. - -GENRST_RUN_COMMAND -mlr --opprint put '$x2=$x**2;$x3=$x2*$x' \ - then histogram -f x,x2,x3 --lo 0 --hi 1 --nbins 10 \ - data/medium -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint put '$x2=$x**2;$x3=$x2*$x' \ - then histogram -f x,x2,x3 --lo 0 --hi 1 --nbins 10 -o my_ \ - data/medium -GENRST_EOF - -.. _reference-verbs-join: - -join ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr join --help -GENRST_EOF - -Examples: - -Join larger table with IDs with smaller ID-to-name lookup table, showing only paired records: - -GENRST_RUN_COMMAND -mlr --icsvlite --opprint cat data/join-left-example.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --icsvlite --opprint cat data/join-right-example.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --icsvlite --opprint \ - join -u -j id -r idcode -f data/join-left-example.csv \ - data/join-right-example.csv -GENRST_EOF - -Same, but with sorting the input first: - -GENRST_RUN_COMMAND -mlr --icsvlite --opprint sort -f idcode \ - then join -j id -r idcode -f data/join-left-example.csv \ - data/join-right-example.csv -GENRST_EOF - -Same, but showing only unpaired records: - -GENRST_RUN_COMMAND -mlr --icsvlite --opprint \ - join --np --ul --ur -u -j id -r idcode -f data/join-left-example.csv \ - data/join-right-example.csv -GENRST_EOF - -Use prefixing options to disambiguate between otherwise identical non-join field names: - -GENRST_RUN_COMMAND -mlr --csvlite --opprint cat data/self-join.csv data/self-join.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --csvlite --opprint join -j a --lp left_ --rp right_ -f data/self-join.csv data/self-join.csv -GENRST_EOF - -Use zero join columns: - -GENRST_RUN_COMMAND -mlr --csvlite --opprint join -j "" --lp left_ --rp right_ -f data/self-join.csv data/self-join.csv -GENRST_EOF - -.. _reference-verbs-label: - -label ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr label --help -GENRST_EOF - -See also :ref:`reference-verbs-rename`. - -Example: Files such as ``/etc/passwd``, ``/etc/group``, and so on have implicit field names which are found in section-5 manpages. These field names may be made explicit as follows: - -GENRST_INCLUDE_ESCAPED(data/label-example.txt) - -Likewise, if you have CSV/CSV-lite input data which has somehow been bereft of its header line, you can re-add a header line using ``--implicit-csv-header`` and ``label``: - -GENRST_RUN_COMMAND -cat data/headerless.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --csv --implicit-csv-header cat data/headerless.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --csv --implicit-csv-header label name,age,status data/headerless.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --icsv --implicit-csv-header --opprint label name,age,status data/headerless.csv -GENRST_EOF - -.. _reference-verbs-least-frequent: - -least-frequent ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr least-frequent -h -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint --from data/colored-shapes.dkvp least-frequent -f shape -n 5 -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint --from data/colored-shapes.dkvp least-frequent -f shape,color -n 5 -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint --from data/colored-shapes.dkvp least-frequent -f shape,color -n 5 -o someothername -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint --from data/colored-shapes.dkvp least-frequent -f shape,color -n 5 -b -GENRST_EOF - -See also :ref:`reference-verbs-most-frequent`. - -.. _reference-verbs-merge-fields: - -merge-fields ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr merge-fields --help -GENRST_EOF - -This is like ``mlr stats1`` but all accumulation is done across fields within each given record: horizontal rather than vertical statistics, if you will. - -Examples: - -GENRST_RUN_COMMAND -mlr --csvlite --opprint cat data/inout.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --csvlite --opprint merge-fields -a min,max,sum -c _in,_out data/inout.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --csvlite --opprint merge-fields -k -a sum -c _in,_out data/inout.csv -GENRST_EOF - -.. _reference-verbs-most-frequent: - -most-frequent ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr most-frequent -h -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint --from data/colored-shapes.dkvp most-frequent -f shape -n 5 -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint --from data/colored-shapes.dkvp most-frequent -f shape,color -n 5 -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint --from data/colored-shapes.dkvp most-frequent -f shape,color -n 5 -o someothername -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint --from data/colored-shapes.dkvp most-frequent -f shape,color -n 5 -b -GENRST_EOF - -See also :ref:`reference-verbs-least-frequent`. - -.. _reference-verbs-nest: - -nest ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr nest -h -GENRST_EOF - -.. _reference-verbs-nothing: - -nothing ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr nothing -h -GENRST_EOF - -.. _reference-verbs-put: - -put ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr put --help -GENRST_EOF - -Features which put shares with filter -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Please see the :doc:`reference-dsl` for more information about the expression language for ``mlr put``. - -.. _reference-verbs-regularize: - -regularize ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr regularize --help -GENRST_EOF - -This exists since hash-map software in various languages and tools encountered in the wild does not always print similar rows with fields in the same order: ``mlr regularize`` helps clean that up. - -See also :ref:`reference-verbs-reorder`. - -.. _reference-verbs-remove-empty-columns: - -remove-empty-columns ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr remove-empty-columns --help -GENRST_EOF - -GENRST_RUN_COMMAND -cat data/remove-empty-columns.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --csv remove-empty-columns data/remove-empty-columns.csv -GENRST_EOF - -Since this verb needs to read all records to see if any of them has a non-empty value for a given field name, it is non-streaming: it will ingest all records before writing any. - -.. _reference-verbs-rename: - -rename ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr rename --help -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint cat data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint rename i,INDEX,b,COLUMN2 data/small -GENRST_EOF - -As discussed in :doc:`performance`, ``sed`` is significantly faster than Miller at doing this. However, Miller is format-aware, so it knows to do renames only within specified field keys and not any others, nor in field values which may happen to contain the same pattern. Example: - -GENRST_RUN_COMMAND -sed 's/y/COLUMN5/g' data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr rename y,COLUMN5 data/small -GENRST_EOF - -See also :ref:`reference-verbs-label`. - -.. _reference-verbs-reorder: - -reorder ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr reorder --help -GENRST_EOF - -This pivots specified field names to the start or end of the record -- for -example when you have highly multi-column data and you want to bring a field or -two to the front of line where you can give a quick visual scan. - -GENRST_RUN_COMMAND -mlr --opprint cat data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint reorder -f i,b data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint reorder -e -f i,b data/small -GENRST_EOF - -.. _reference-verbs-repeat: - -repeat ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr repeat --help -GENRST_EOF - -This is useful in at least two ways: one, as a data-generator as in the -above example using ``urand()``; two, for reconstructing individual -samples from data which has been count-aggregated: - -GENRST_RUN_COMMAND -cat data/repeat-example.dat -GENRST_EOF - -GENRST_RUN_COMMAND -mlr repeat -f count then cut -x -f count data/repeat-example.dat -GENRST_EOF - -After expansion with ``repeat``, such data can then be sent on to -``stats1 -a mode``, or (if the data are numeric) to ``stats1 -a -p10,p50,p90``, etc. - -.. _reference-verbs-reshape: - -reshape ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr reshape --help -GENRST_EOF - -.. _reference-verbs-sample: - -sample ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr sample --help -GENRST_EOF - -This is reservoir-sampling: select *k* items from *n* with -uniform probability and no repeats in the sample. (If *n* is less than -*k*, then of course only *n* samples are produced.) With ``-g -{field names}``, produce a *k*-sample for each distinct value of the -specified field names. - -GENRST_INCLUDE_ESCAPED(data/sample-example.txt) - -Note that no output is produced until all inputs are in. Another way to do -sampling, which works in the streaming case, is ``mlr filter 'urand() & -0.001'`` where you tune the 0.001 to meet your needs. - -.. _reference-verbs-sec2gmt: - -sec2gmt ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr sec2gmt -h -GENRST_EOF - -.. _reference-verbs-sec2gmtdate: - -sec2gmtdate ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr sec2gmtdate -h -GENRST_EOF - -.. _reference-verbs-seqgen: - -seqgen ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr seqgen -h -GENRST_EOF - -GENRST_RUN_COMMAND -mlr seqgen --stop 10 -GENRST_EOF - -GENRST_RUN_COMMAND -mlr seqgen --start 20 --stop 40 --step 4 -GENRST_EOF - -GENRST_RUN_COMMAND -mlr seqgen --start 40 --stop 20 --step -4 -GENRST_EOF - -.. _reference-verbs-shuffle: - -shuffle ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr shuffle -h -GENRST_EOF - -.. _reference-verbs-skip-trivial-records: - -skip-trivial-records ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr skip-trivial-records -h -GENRST_EOF - -GENRST_RUN_COMMAND -cat data/trivial-records.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --csv skip-trivial-records data/trivial-records.csv -GENRST_EOF - -.. _reference-verbs-sort: - -sort ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr sort --help -GENRST_EOF - -Example: - -GENRST_RUN_COMMAND -mlr --opprint sort -f a -nr x data/small -GENRST_EOF - -Here's an example filtering log data: suppose multiple threads (labeled here by color) are all logging progress counts to a single log file. The log file is (by nature) chronological, so the progress of various threads is interleaved: - -GENRST_RUN_COMMAND -head -n 10 data/multicountdown.dat -GENRST_EOF - -We can group these by thread by sorting on the thread ID (here, -``color``). Since Miller's sort is stable, this means that -timestamps within each thread's log data are still chronological: - -GENRST_RUN_COMMAND -head -n 20 data/multicountdown.dat | mlr --opprint sort -f color -GENRST_EOF - -Any records not having all specified sort keys will appear at the end of the output, in the order they -were encountered, regardless of the specified sort order: - -GENRST_RUN_COMMAND -mlr sort -n x data/sort-missing.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr sort -nr x data/sort-missing.dkvp -GENRST_EOF - -.. _reference-verbs-sort-within-records: - -sort-within-records ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr sort-within-records -h -GENRST_EOF - -GENRST_RUN_COMMAND -cat data/sort-within-records.json -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --ijson --opprint cat data/sort-within-records.json -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --json sort-within-records data/sort-within-records.json -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --ijson --opprint sort-within-records data/sort-within-records.json -GENRST_EOF - -.. _reference-verbs-stats1: - -stats1 ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr stats1 --help -GENRST_EOF - -These are simple univariate statistics on one or more number-valued fields -(``count`` and ``mode`` apply to non-numeric fields as well), -optionally categorized by one or more other fields. - -GENRST_RUN_COMMAND -mlr --oxtab stats1 -a count,sum,min,p10,p50,mean,p90,max -f x,y data/medium -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint stats1 -a mean -f x,y -g b then sort -f b data/medium -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint stats1 -a p50,p99 -f u,v -g color \ - then put '$ur=$u_p99/$u_p50;$vr=$v_p99/$v_p50' \ - data/colored-shapes.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint count-distinct -f shape then sort -nr count data/colored-shapes.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint stats1 -a mode -f color -g shape data/colored-shapes.dkvp -GENRST_EOF - -.. _reference-verbs-stats2: - -stats2 ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr stats2 --help -GENRST_EOF - -These are simple bivariate statistics on one or more pairs of number-valued -fields, optionally categorized by one or more fields. - -GENRST_RUN_COMMAND -mlr --oxtab put '$x2=$x*$x; $xy=$x*$y; $y2=$y**2' \ - then stats2 -a cov,corr -f x,y,y,y,x2,xy,x2,y2 \ - data/medium -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint put '$x2=$x*$x; $xy=$x*$y; $y2=$y**2' \ - then stats2 -a linreg-ols,r2 -f x,y,y,y,xy,y2 -g a \ - data/medium -GENRST_EOF - -Here's an example simple line-fit. The ``x`` and ``y`` -fields of the ``data/medium`` dataset are just independent uniformly -distributed on the unit interval. Here we remove half the data and fit a line to it. - -GENRST_INCLUDE_ESCAPED(data/linreg-example.txt) - -I use `pgr `_ for plotting; here's a screenshot. - -.. image:: data/linreg-example.jpg - - -(Thanks Drew Kunas for a good conversation about PCA!) - -Here's an example estimating time-to-completion for a set of jobs. Input data comes from a log file, with number of work units left to do in the ``count`` field and accumulated seconds in the ``upsec`` field, labeled by the ``color`` field: - -GENRST_RUN_COMMAND -head -n 10 data/multicountdown.dat -GENRST_EOF - -We can do a linear regression on count remaining as a function of time: with ``c = m*u+b`` we want to find the time when the count goes to zero, i.e. ``u=-b/m``. - -GENRST_RUN_COMMAND -mlr --oxtab stats2 -a linreg-pca -f upsec,count -g color \ - then put '$donesec = -$upsec_count_pca_b/$upsec_count_pca_m' \ - data/multicountdown.dat -GENRST_EOF - -.. _reference-verbs-step: - -step ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr step --help -GENRST_EOF - -Most Miller commands are record-at-a-time, with the exception of ``stats1``, ``stats2``, and ``histogram`` which compute aggregate output. The ``step`` command is intermediate: it allows the option of adding fields which are functions of fields from previous records. Rsum is short for *running sum*. - -GENRST_RUN_COMMAND -mlr --opprint step -a shift,delta,rsum,counter -f x data/medium | head -15 -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint step -a shift,delta,rsum,counter -f x -g a data/medium | head -15 -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint step -a ewma -f x -d 0.1,0.9 data/medium | head -15 -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint step -a ewma -f x -d 0.1,0.9 -o smooth,rough data/medium | head -15 -GENRST_EOF - - -Example deriving uptime-delta from system uptime: - -GENRST_INCLUDE_ESCAPED(data/ping-delta-example.txt) - -.. _reference-verbs-tac: - -tac ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr tac --help -GENRST_EOF - -Prints the records in the input stream in reverse order. Note: this requires Miller to retain all input records in memory before any output records are produced. - -GENRST_RUN_COMMAND -mlr --icsv --opprint cat data/a.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --icsv --opprint cat data/b.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --icsv --opprint tac data/a.csv data/b.csv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --icsv --opprint put '$filename=FILENAME' then tac data/a.csv data/b.csv -GENRST_EOF - -.. _reference-verbs-tail: - -tail ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr tail --help -GENRST_EOF - -Prints the last *n* records in the input stream, optionally by category. - -GENRST_RUN_COMMAND -mlr --opprint tail -n 4 data/colored-shapes.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint tail -n 1 -g shape data/colored-shapes.dkvp -GENRST_EOF - -.. _reference-verbs-tee: - -tee ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr tee --help -GENRST_EOF - -.. _reference-verbs-template: - -template ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr template --help -GENRST_EOF - -.. _reference-verbs-top: - -top ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr top --help -GENRST_EOF - -Note that ``top`` is distinct from :ref:`reference-verbs-head` -- ``head`` shows fields which appear first in the data stream; ``top`` shows fields which are numerically largest (or smallest). - -GENRST_RUN_COMMAND -mlr --opprint top -n 4 -f x data/medium -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint top -n 4 -f x -o someothername data/medium -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint top -n 2 -f x -g a then sort -f a data/medium -GENRST_EOF - -.. _reference-verbs-uniq: - -uniq ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr uniq --help -GENRST_EOF - -There are two main ways to use ``mlr uniq``: the first way is with ``-g`` to specify group-by columns. - -GENRST_RUN_COMMAND -wc -l data/colored-shapes.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr uniq -g color,shape data/colored-shapes.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint uniq -g color,shape -c then sort -f color,shape data/colored-shapes.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint uniq -g color,shape -c -o someothername \ - then sort -nr someothername \ - data/colored-shapes.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint uniq -n -g color,shape data/colored-shapes.dkvp -GENRST_EOF - -The second main way to use ``mlr uniq`` is without group-by columns, using ``-a`` instead: - -GENRST_RUN_COMMAND -cat data/repeats.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -wc -l data/repeats.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint uniq -a data/repeats.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint uniq -a -n data/repeats.dkvp -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint uniq -a -c data/repeats.dkvp -GENRST_EOF - -.. _reference-verbs-unsparsify: - -unsparsify ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr unsparsify --help -GENRST_EOF - -Examples: - -GENRST_RUN_COMMAND -cat data/sparse.json -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --json unsparsify data/sparse.json -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --ijson --opprint unsparsify data/sparse.json -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --ijson --opprint unsparsify --fill-with missing data/sparse.json -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --ijson --opprint unsparsify -f a,b,u data/sparse.json -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --ijson --opprint unsparsify -f a,b,u,v,w,x then regularize data/sparse.json -GENRST_EOF - diff --git a/docs6/release-docs.rst b/docs6/release-docs.rst deleted file mode 100644 index eda04cbc8..000000000 --- a/docs6/release-docs.rst +++ /dev/null @@ -1,21 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Documents by release -================================================================ - -As of September 2020, for 5.9.1 onward, release-specific docs will be handled automatically by https://miller.readthedocs.io whenever a new release is tagged at https://github.com/johnkerl/miller/releases. - -Information here is for documents from before the readthedocs port: - -* `Head `_ -* `Miller 5.9.1 `_ -* `Miller 5.9.0 `_ -* `Miller 5.8.0 `_ -* `Miller 5.7.0 `_ -* `Miller 5.6.2 `_ -* `Miller 5.6.1 `_ -* `Miller 5.6.0 `_ -* `Miller 5.5.0 `_ -* `Miller 5.4.0 `_ -* `Miller 5.3.0 `_ diff --git a/docs6/release-docs.rst.in b/docs6/release-docs.rst.in deleted file mode 100644 index 5a3bf8151..000000000 --- a/docs6/release-docs.rst.in +++ /dev/null @@ -1,18 +0,0 @@ -Documents by release -================================================================ - -As of September 2020, for 5.9.1 onward, release-specific docs will be handled automatically by https://miller.readthedocs.io whenever a new release is tagged at https://github.com/johnkerl/miller/releases. - -Information here is for documents from before the readthedocs port: - -* `Head `_ -* `Miller 5.9.1 `_ -* `Miller 5.9.0 `_ -* `Miller 5.8.0 `_ -* `Miller 5.7.0 `_ -* `Miller 5.6.2 `_ -* `Miller 5.6.1 `_ -* `Miller 5.6.0 `_ -* `Miller 5.5.0 `_ -* `Miller 5.4.0 `_ -* `Miller 5.3.0 `_ diff --git a/docs6/repl.rst b/docs6/repl.rst deleted file mode 100644 index 2c3964d9b..000000000 --- a/docs6/repl.rst +++ /dev/null @@ -1,184 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -The REPL -================================================================ - -The Miller REPL (read-evaluate-print loop) is an interactive counterpart to record-processing using the ``put``/``filter`` language. (A REPL is anything that evaluates what you type into it -- like ``python`` with no arguments, or Ruby's ``irb``, or ``node`` with no arguments, etc.) - -Miller's REPL isn't a source-level debugger which lets you execute one source-code *statement* at a time -- however, it does let you operate on one *record* at a time. Further, it lets you use "immediate expressions", namely, you can interact with the language without having to provide data from an input file. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr repl - - [mlr] 1 + 2 - 3 - -Using Miller without the REPL ----------------------------------------------------------------- - -Using ``put`` and ``filter``, you can do the following as we've seen above: - -* Specify input format (e.g. ``--icsv``), output format (e.g. ``--ojson``), etc. using command-line flags. -* Specify filenames on the command line. -* Define ``begin {...}`` blocks which are executed before the first record is read. -* Define ``end {...}`` blocks which are executed after the last record is read. -* Define user-defined functions/subroutines using ``func`` and ``subr``. -* Specify statements to be executed on each record -- which are anything outside of ``begin``/``end``/``func``/``subr``. -* Example: - -.. code-block:: none - :emphasize-lines: 1-2 - - mlr --icsv --ojson --from example.csv head -n 2 \ - then put 'begin {print "HELLO"} $z = $x + $y; end {print "GOODBYE"}' - HELLO - { - "color": "yellow", - "shape": "triangle", - "flag": true, - "index": 11, - "quantity": 43.6498, - "rate": 9.8870 - } - { - "color": "red", - "shape": "square", - "flag": true, - "index": 15, - "quantity": 79.2778, - "rate": 0.0130 - } - GOODBYE - -Using Miller with the REPL ----------------------------------------------------------------- - -Using the REPL, by contrast, you get interactive control over those same steps: - -* Specify input format (e.g. ``--icsv``), output format (e.g. ``--ojson``), etc. using command-line flags. -* REPL-only statements (non-DSL statements) start with ``:``, such as ``:help`` or ``:quit`` - or ``:open``. -* Specify filenames either on the command line or via ``:open`` at the Miller REPL. -* Read records one at a time using ``:read``. -* Write the current record (maybe after you've modified it with things like ``$z = $x + $y``) - using ``:write``. This goes to the terminal; you can use ``:> {filename}`` to make writes - go to a file, or ``:>> {filename}`` to append. -* You can type ``:reopen`` to go back to the start of the same file(s) you specified - with ``:open``. -* Skip ahead using statements ``:skip 10`` or ``:skip until NR == 100`` or - ``:skip until $status_code != 200``. -* Similarly, but processing records rather than skipping past them, using - ``:process`` rather than ``:skip``. Like ``:write``, these go to the screen; - use ``:> {filename}`` or ``:>> {filename}`` to log to a file instead. -* Define ``begin {...}`` blocks; invoke them at will using ``:begin``. -* Define ``end {...}`` blocks; invoke them at will using ``:end``. -* Define user-defined functions/subroutines using ``func``/``subr``; call them from other statements. -* Interactively specify statements to be executed immediately on the current record. -* Load any of the above from Miller-script files using ``:load``. - -The input "record" by default is the empty map but you can do things like -``$x=3``, or ``unset $y``, or ``$* = {"x": 3, "y": 4}`` to populate it. Or, ``:open -foo.dat`` followed by ``:read`` to populate it from a data file. - -Non-assignment expressions, such as ``7`` or ``true``, operate as filter conditions -in the ``put`` DSL: they can be used to specify whether a record will or won't be -included in the output-record stream. But here in the REPL, they are simply -printed to the terminal, e.g. if you type ``1+2``, you will see ``3``. - -Entering multi-line statements ----------------------------------------------------------------- - -* To enter multi-line statements, enter ``<`` on a line by itself, then the code (taking care - for semicolons), then ">" on a line by itself. These will be executed immediately. -* If you enter ``<<`` on a line by itself, then the code, then ``>>`` on a line by - itself, the statements will be remembered for executing on records with - ``:main``, as if you had done ``:load`` to load statements from a file. - -Examples ----------------------------------------------------------------- - -Use the REPL to look at arithmetic: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr repl - - [mlr] 6/3 - 2 - - [mlr] 6/5 - 1.2 - - [mlr] typeof(6/3) - int - - [mlr] typeof(6/5) - float - -Read the first record from a small file: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr repl - - [mlr] :open foo.dat - - [mlr] :read - - [mlr] :context - FILENAME="foo.dat",FILENUM=1,NR=1,FNR=1 - - [mlr] $* - { - "a": "eks", - "b": "wye", - "i": 4, - "x": 0.38139939387114097, - "y": 0.13418874328430463 - } - - [mlr] $z = $x + $i - - [mlr] :write - a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463,z=4.381399393871141 - -Skip until deep into a larger file, then inspect a record: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr repl --csv - - [mlr] :open data/colored-shapes.csv - [mlr] :skip until NR == 10000 - [mlr] :r - [mlr] $* - { - "color": "yellow", - "shape": "circle", - "flag": 1, - "i": 99284, - "u": 0.6530503199545348, - "v": 0.23908588907834516, - "w": 0.4799125551304738, - "x": 6.379888206335166 - } - -History-editing ----------------------------------------------------------------- - -No command-line-history-editing feature is built in but **rlwrap mlr repl** is a -delight. You may need ``brew install rlwrap``, ``sudo apt-get install rlwrap``, -etc. depending on your platform. - -Suggestion: ``alias mrpl='rlwrap mlr repl'`` in your shell's startup file. - -On-line help ----------------------------------------------------------------- - -After ``mlr repl``, type ``:help`` to see more about your options. In particular, ``:help examples``. diff --git a/docs6/repl.rst.in b/docs6/repl.rst.in deleted file mode 100644 index 53df52804..000000000 --- a/docs6/repl.rst.in +++ /dev/null @@ -1,158 +0,0 @@ -The REPL -================================================================ - -The Miller REPL (read-evaluate-print loop) is an interactive counterpart to record-processing using the ``put``/``filter`` language. (A REPL is anything that evaluates what you type into it -- like ``python`` with no arguments, or Ruby's ``irb``, or ``node`` with no arguments, etc.) - -Miller's REPL isn't a source-level debugger which lets you execute one source-code *statement* at a time -- however, it does let you operate on one *record* at a time. Further, it lets you use "immediate expressions", namely, you can interact with the language without having to provide data from an input file. - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr repl - -[mlr] 1 + 2 -3 -GENRST_EOF - -Using Miller without the REPL ----------------------------------------------------------------- - -Using ``put`` and ``filter``, you can do the following as we've seen above: - -* Specify input format (e.g. ``--icsv``), output format (e.g. ``--ojson``), etc. using command-line flags. -* Specify filenames on the command line. -* Define ``begin {...}`` blocks which are executed before the first record is read. -* Define ``end {...}`` blocks which are executed after the last record is read. -* Define user-defined functions/subroutines using ``func`` and ``subr``. -* Specify statements to be executed on each record -- which are anything outside of ``begin``/``end``/``func``/``subr``. -* Example: - -GENRST_RUN_COMMAND -mlr --icsv --ojson --from example.csv head -n 2 \ - then put 'begin {print "HELLO"} $z = $x + $y; end {print "GOODBYE"}' -GENRST_EOF - -Using Miller with the REPL ----------------------------------------------------------------- - -Using the REPL, by contrast, you get interactive control over those same steps: - -* Specify input format (e.g. ``--icsv``), output format (e.g. ``--ojson``), etc. using command-line flags. -* REPL-only statements (non-DSL statements) start with ``:``, such as ``:help`` or ``:quit`` - or ``:open``. -* Specify filenames either on the command line or via ``:open`` at the Miller REPL. -* Read records one at a time using ``:read``. -* Write the current record (maybe after you've modified it with things like ``$z = $x + $y``) - using ``:write``. This goes to the terminal; you can use ``:> {filename}`` to make writes - go to a file, or ``:>> {filename}`` to append. -* You can type ``:reopen`` to go back to the start of the same file(s) you specified - with ``:open``. -* Skip ahead using statements ``:skip 10`` or ``:skip until NR == 100`` or - ``:skip until $status_code != 200``. -* Similarly, but processing records rather than skipping past them, using - ``:process`` rather than ``:skip``. Like ``:write``, these go to the screen; - use ``:> {filename}`` or ``:>> {filename}`` to log to a file instead. -* Define ``begin {...}`` blocks; invoke them at will using ``:begin``. -* Define ``end {...}`` blocks; invoke them at will using ``:end``. -* Define user-defined functions/subroutines using ``func``/``subr``; call them from other statements. -* Interactively specify statements to be executed immediately on the current record. -* Load any of the above from Miller-script files using ``:load``. - -The input "record" by default is the empty map but you can do things like -``$x=3``, or ``unset $y``, or ``$* = {"x": 3, "y": 4}`` to populate it. Or, ``:open -foo.dat`` followed by ``:read`` to populate it from a data file. - -Non-assignment expressions, such as ``7`` or ``true``, operate as filter conditions -in the ``put`` DSL: they can be used to specify whether a record will or won't be -included in the output-record stream. But here in the REPL, they are simply -printed to the terminal, e.g. if you type ``1+2``, you will see ``3``. - -Entering multi-line statements ----------------------------------------------------------------- - -* To enter multi-line statements, enter ``<`` on a line by itself, then the code (taking care - for semicolons), then ">" on a line by itself. These will be executed immediately. -* If you enter ``<<`` on a line by itself, then the code, then ``>>`` on a line by - itself, the statements will be remembered for executing on records with - ``:main``, as if you had done ``:load`` to load statements from a file. - -Examples ----------------------------------------------------------------- - -Use the REPL to look at arithmetic: - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr repl - -[mlr] 6/3 -2 - -[mlr] 6/5 -1.2 - -[mlr] typeof(6/3) -int - -[mlr] typeof(6/5) -float -GENRST_EOF - -Read the first record from a small file: - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr repl - -[mlr] :open foo.dat - -[mlr] :read - -[mlr] :context -FILENAME="foo.dat",FILENUM=1,NR=1,FNR=1 - -[mlr] $* -{ - "a": "eks", - "b": "wye", - "i": 4, - "x": 0.38139939387114097, - "y": 0.13418874328430463 -} - -[mlr] $z = $x + $i - -[mlr] :write -a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463,z=4.381399393871141 -GENRST_EOF - -Skip until deep into a larger file, then inspect a record: - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr repl --csv - -[mlr] :open data/colored-shapes.csv -[mlr] :skip until NR == 10000 -[mlr] :r -[mlr] $* -{ - "color": "yellow", - "shape": "circle", - "flag": 1, - "i": 99284, - "u": 0.6530503199545348, - "v": 0.23908588907834516, - "w": 0.4799125551304738, - "x": 6.379888206335166 -} -GENRST_EOF - -History-editing ----------------------------------------------------------------- - -No command-line-history-editing feature is built in but **rlwrap mlr repl** is a -delight. You may need ``brew install rlwrap``, ``sudo apt-get install rlwrap``, -etc. depending on your platform. - -Suggestion: ``alias mrpl='rlwrap mlr repl'`` in your shell's startup file. - -On-line help ----------------------------------------------------------------- - -After ``mlr repl``, type ``:help`` to see more about your options. In particular, ``:help examples``. diff --git a/docs6/rework.txt b/docs6/rework.txt deleted file mode 100644 index 5159c7a5d..000000000 --- a/docs6/rework.txt +++ /dev/null @@ -1,40 +0,0 @@ - ----------------------------------------------------------------- -INTEGRATIONS -cookbook.rst.in-Parsing log-file output - ----------------------------------------------------------------- -DATA-CLEANING EXAMMPLES -cookbook.rst.in-Data-cleaning examples - ----------------------------------------------------------------- -TBF - -cookbook.rst.in-Showing differences between successive queries -cookbook.rst.in-Feature-counting -cookbook.rst.in-Unsparsing - ----------------------------------------------------------------- -ESOTERICA - -cookbook.rst.in-Memoization with out-of-stream variables -cookbook.rst.in-Two-pass algorithms - -cookbook2.rst.in-Randomly selecting words from a list -cookbook2.rst.in-Randomly generating jabberwocky words -cookbook2.rst.in-Program timing -cookbook2.rst.in-Computing interquartile ranges -cookbook2.rst.in-Computing weighted means -cookbook2.rst.in-Generating random numbers from various distributions -cookbook2.rst.in-Sieve of Eratosthenes -cookbook2.rst.in-Mandelbrot-set generator - -cookbook3.rst.in-Overview -cookbook3.rst.in-Mean without/with oosvars -cookbook3.rst.in-Keyed mean without/with oosvars -cookbook3.rst.in-Variance and standard deviation without/with oosvars -cookbook3.rst.in-Min/max without/with oosvars -cookbook3.rst.in-Keyed min/max without/with oosvars -cookbook3.rst.in-Delta without/with oosvars -cookbook3.rst.in-Keyed delta without/with oosvars -cookbook3.rst.in-Exponentially weighted moving averages without/with oosvars diff --git a/docs6/shapes-of-data.rst b/docs6/shapes-of-data.rst deleted file mode 100644 index fe4fe60a1..000000000 --- a/docs6/shapes-of-data.rst +++ /dev/null @@ -1,422 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Shapes of data -============== - -No output at all ----------------------------------------------------------------- - -Try ``od -xcv`` and/or ``cat -e`` on your file to check for non-printable characters. - -If you're using Miller version less than 5.0.0 (try ``mlr --version`` on your system to find out), when the line-ending-autodetect feature was introduced, please see http://johnkerl.org/miller-releases/miller-4.5.0/doc/index.html. - -Fields not selected ----------------------------------------------------------------- - -Check the field-separators of the data, e.g. with the command-line ``head`` program. Example: for CSV, Miller's default record separator is comma; if your data is tab-delimited, e.g. ``aTABbTABc``, then Miller won't find three fields named ``a``, ``b``, and ``c`` but rather just one named ``aTABbTABc``. Solution in this case: ``mlr --fs tab {remaining arguments ...}``. - -Also try ``od -xcv`` and/or ``cat -e`` on your file to check for non-printable characters. - -Diagnosing delimiter specifications ----------------------------------------------------------------- - -Use the ``file`` command to see if there are CR/LF terminators (in this case, # there are not): - -.. code-block:: none - :emphasize-lines: 1-1 - - file data/colours.csv - data/colours.csv: UTF-8 Unicode text - -Look at the file to find names of fields - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/colours.csv - KEY;DE;EN;ES;FI;FR;IT;NL;PL;RO;TR - masterdata_colourcode_1;Weiß;White;Blanco;Valkoinen;Blanc;Bianco;Wit;BiaÅ‚y;Alb;Beyaz - masterdata_colourcode_2;Schwarz;Black;Negro;Musta;Noir;Nero;Zwart;Czarny;Negru;Siyah - -Extract a few fields: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv cut -f KEY,PL,RO data/colours.csv - (only blank lines appear) - -Use XTAB output format to get a sharper picture of where records/fields are being split: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --oxtab cat data/colours.csv - KEY;DE;EN;ES;FI;FR;IT;NL;PL;RO;TR masterdata_colourcode_1;Weiß;White;Blanco;Valkoinen;Blanc;Bianco;Wit;BiaÅ‚y;Alb;Beyaz - - KEY;DE;EN;ES;FI;FR;IT;NL;PL;RO;TR masterdata_colourcode_2;Schwarz;Black;Negro;Musta;Noir;Nero;Zwart;Czarny;Negru;Siyah - -Using XTAB output format makes it clearer that ``KEY;DE;...;RO;TR`` is being treated as a single field name in the CSV header, and likewise each subsequent line is being treated as a single field value. This is because the default field separator is a comma but we have semicolons here. Use XTAB again with different field separator (``--fs semicolon``): - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --ifs semicolon --oxtab cat data/colours.csv - KEY masterdata_colourcode_1 - DE Weiß - EN White - ES Blanco - FI Valkoinen - FR Blanc - IT Bianco - NL Wit - PL BiaÅ‚y - RO Alb - TR Beyaz - - KEY masterdata_colourcode_2 - DE Schwarz - EN Black - ES Negro - FI Musta - FR Noir - IT Nero - NL Zwart - PL Czarny - RO Negru - TR Siyah - -Using the new field-separator, retry the cut: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --csv --fs semicolon cut -f KEY,PL,RO data/colours.csv - KEY;PL;RO - masterdata_colourcode_1;BiaÅ‚y;Alb - masterdata_colourcode_2;Czarny;Negru - -I assigned $9 and it's not 9th ----------------------------------------------------------------- - -Miller records are ordered lists of key-value pairs. For NIDX format, DKVP format when keys are missing, or CSV/CSV-lite format with ``--implicit-csv-header``, Miller will sequentially assign keys of the form ``1``, ``2``, etc. But these are not integer array indices: they're just field names taken from the initial field ordering in the input data, when it is originally read from the input file(s). - -.. code-block:: none - :emphasize-lines: 1-1 - - echo x,y,z | mlr --dkvp cat - 1=x,2=y,3=z - -.. code-block:: none - :emphasize-lines: 1-1 - - echo x,y,z | mlr --dkvp put '$6="a";$4="b";$55="cde"' - 1=x,2=y,3=z,6=a,4=b,55=cde - -.. code-block:: none - :emphasize-lines: 1-1 - - echo x,y,z | mlr --nidx cat - x,y,z - -.. code-block:: none - :emphasize-lines: 1-1 - - echo x,y,z | mlr --csv --implicit-csv-header cat - 1,2,3 - x,y,z - -.. code-block:: none - :emphasize-lines: 1-1 - - echo x,y,z | mlr --dkvp rename 2,999 - 1=x,999=y,3=z - -.. code-block:: none - :emphasize-lines: 1-1 - - echo x,y,z | mlr --dkvp rename 2,newname - 1=x,newname=y,3=z - -.. code-block:: none - :emphasize-lines: 1-1 - - echo x,y,z | mlr --csv --implicit-csv-header reorder -f 3,1,2 - 3,1,2 - z,x,y - -Why doesn't mlr cut put fields in the order I want? ----------------------------------------------------------------- - -Example: columns ``x,i,a`` were requested but they appear here in the order ``a,i,x``: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/small - a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533 - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797 - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776 - a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr cut -f x,i,a data/small - a=pan,i=1,x=0.3467901443380824 - a=eks,i=2,x=0.7586799647899636 - a=wye,i=3,x=0.20460330576630303 - a=eks,i=4,x=0.38139939387114097 - a=wye,i=5,x=0.5732889198020006 - -The issue is that Miller's ``cut``, by default, outputs cut fields in the order they appear in the input data. This design decision was made intentionally to parallel the Unix/Linux system ``cut`` command, which has the same semantics. - -The solution is to use the ``-o`` option: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr cut -o -f x,i,a data/small - x=0.3467901443380824,i=1,a=pan - x=0.7586799647899636,i=2,a=eks - x=0.20460330576630303,i=3,a=wye - x=0.38139939387114097,i=4,a=eks - x=0.5732889198020006,i=5,a=wye - -Numbering and renumbering records ----------------------------------------------------------------- - -The ``awk``-like built-in variable ``NR`` is incremented for each input record: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/small - a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533 - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797 - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776 - a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr put '$nr = NR' data/small - a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533,nr=1 - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797,nr=2 - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776,nr=3 - a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463,nr=4 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729,nr=5 - -However, this is the record number within the original input stream -- not after any filtering you may have done: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr filter '$a == "wye"' then put '$nr = NR' data/small - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776,nr=3 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729,nr=5 - -There are two good options here. One is to use the ``cat`` verb with ``-n``: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr filter '$a == "wye"' then cat -n data/small - n=1,a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776 - n=2,a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729 - -The other is to keep your own counter within the ``put`` DSL: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr filter '$a == "wye"' then put 'begin {@n = 1} $n = @n; @n += 1' data/small - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776,n=1 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729,n=2 - -The difference is a matter of taste (although ``mlr cat -n`` puts the counter first). - -Splitting nested fields ----------------------------------------------------------------- - -Suppose you have a TSV file like this: - -.. code-block:: none - - a b - x z - s u:v:w - -The simplest option is to use :ref:`mlr nest `: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --tsv nest --explode --values --across-records -f b --nested-fs : data/nested.tsv - a b - x z - s u - s v - s w - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --tsv nest --explode --values --across-fields -f b --nested-fs : data/nested.tsv - a b_1 - x z - - a b_1 b_2 b_3 - s u v w - -While ``mlr nest`` is simplest, let's also take a look at a few ways to do this using the ``put`` DSL. - -One option to split out the colon-delimited values in the ``b`` column is to use ``splitnv`` to create an integer-indexed map and loop over it, adding new fields to the current record: - -.. code-block:: none - :emphasize-lines: 1-6 - - mlr --from data/nested.tsv --itsv --oxtab put ' - o = splitnv($b, ":"); - for (k,v in o) { - $["p".k]=v - } - ' - a x - b z - p1 z - - a s - b u:v:w - p1 u - p2 v - p3 w - -while another is to loop over the same map from ``splitnv`` and use it (with ``put -q`` to suppress printing the original record) to produce multiple records: - -.. code-block:: none - :emphasize-lines: 1-7 - - mlr --from data/nested.tsv --itsv --oxtab put -q ' - o = splitnv($b, ":"); - for (k,v in o) { - x = mapsum($*, {"b":v}); - emit x - } - ' - a x - b z - - a s - b u - - a s - b v - - a s - b w - -.. code-block:: none - :emphasize-lines: 1-6 - - mlr --from data/nested.tsv --tsv put -q ' - o = splitnv($b, ":"); - for (k,v in o) { - x = mapsum($*, {"b":v}); emit x - } - ' - a b - x z - s u - s v - s w - -Options for dealing with duplicate rows ----------------------------------------------------------------- - -If your data has records appearing multiple times, you can use :ref:`mlr uniq ` to show and/or count the unique records. - -If you want to look at partial uniqueness -- for example, show only the first record for each unique combination of the ``account_id`` and ``account_status`` fields -- you might use ``mlr head -n 1 -g account_id,account_status``. Please also see :ref:`mlr head `. - -Rectangularizing data ----------------------------------------------------------------- - -Suppose you have a method (in whatever language) which is printing things of the form - -.. code-block:: none - - outer=1 - outer=2 - outer=3 - -and then calls another method which prints things of the form - -.. code-block:: none - - middle=10 - middle=11 - middle=12 - middle=20 - middle=21 - middle=30 - middle=31 - -and then, perhaps, that second method calls a third method which prints things of the form - -.. code-block:: none - - inner1=100,inner2=101 - inner1=120,inner2=121 - inner1=200,inner2=201 - inner1=210,inner2=211 - inner1=300,inner2=301 - inner1=312 - inner1=313,inner2=314 - -with the result that your program's output is - -.. code-block:: none - - outer=1 - middle=10 - inner1=100,inner2=101 - middle=11 - middle=12 - inner1=120,inner2=121 - outer=2 - middle=20 - inner1=200,inner2=201 - middle=21 - inner1=210,inner2=211 - outer=3 - middle=30 - inner1=300,inner2=301 - middle=31 - inner1=312 - inner1=313,inner2=314 - -The idea here is that middles starting with a 1 belong to the outer value of 1, and so on. (For example, the outer values might be account IDs, the middle values might be invoice IDs, and the inner values might be invoice line-items.) If you want all the middle and inner lines to have the context of which outers they belong to, you can modify your software to pass all those through your methods. Alternatively, don't refactor your code just to handle some ad-hoc log-data formatting -- instead, use the following to rectangularize the data. The idea is to use an out-of-stream variable to accumulate fields across records. Clear that variable when you see an outer ID; accumulate fields; emit output when you see the inner IDs. - -.. code-block:: none - :emphasize-lines: 1-10 - - mlr --from data/rect.txt put -q ' - is_present($outer) { - unset @r - } - for (k, v in $*) { - @r[k] = v - } - is_present($inner1) { - emit @r - }' - outer=1,middle=10,inner1=100,inner2=101 - outer=1,middle=12,inner1=120,inner2=121 - outer=2,middle=20,inner1=200,inner2=201 - outer=2,middle=21,inner1=210,inner2=211 - outer=3,middle=30,inner1=300,inner2=301 - outer=3,middle=31,inner1=312,inner2=301 - outer=3,middle=31,inner1=313,inner2=314 diff --git a/docs6/shapes-of-data.rst.in b/docs6/shapes-of-data.rst.in deleted file mode 100644 index 9ff56607e..000000000 --- a/docs6/shapes-of-data.rst.in +++ /dev/null @@ -1,257 +0,0 @@ -Shapes of data -============== - -No output at all ----------------------------------------------------------------- - -Try ``od -xcv`` and/or ``cat -e`` on your file to check for non-printable characters. - -If you're using Miller version less than 5.0.0 (try ``mlr --version`` on your system to find out), when the line-ending-autodetect feature was introduced, please see http://johnkerl.org/miller-releases/miller-4.5.0/doc/index.html. - -Fields not selected ----------------------------------------------------------------- - -Check the field-separators of the data, e.g. with the command-line ``head`` program. Example: for CSV, Miller's default record separator is comma; if your data is tab-delimited, e.g. ``aTABbTABc``, then Miller won't find three fields named ``a``, ``b``, and ``c`` but rather just one named ``aTABbTABc``. Solution in this case: ``mlr --fs tab {remaining arguments ...}``. - -Also try ``od -xcv`` and/or ``cat -e`` on your file to check for non-printable characters. - -Diagnosing delimiter specifications ----------------------------------------------------------------- - -Use the ``file`` command to see if there are CR/LF terminators (in this case, # there are not): - -GENRST_CARDIFY_HIGHLIGHT_ONE -file data/colours.csv -data/colours.csv: UTF-8 Unicode text -GENRST_EOF - -Look at the file to find names of fields - -GENRST_CARDIFY_HIGHLIGHT_ONE -cat data/colours.csv -KEY;DE;EN;ES;FI;FR;IT;NL;PL;RO;TR -masterdata_colourcode_1;Weiß;White;Blanco;Valkoinen;Blanc;Bianco;Wit;BiaÅ‚y;Alb;Beyaz -masterdata_colourcode_2;Schwarz;Black;Negro;Musta;Noir;Nero;Zwart;Czarny;Negru;Siyah -GENRST_EOF - -Extract a few fields: - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr --csv cut -f KEY,PL,RO data/colours.csv -(only blank lines appear) -GENRST_EOF - -Use XTAB output format to get a sharper picture of where records/fields are being split: - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr --icsv --oxtab cat data/colours.csv -KEY;DE;EN;ES;FI;FR;IT;NL;PL;RO;TR masterdata_colourcode_1;Weiß;White;Blanco;Valkoinen;Blanc;Bianco;Wit;BiaÅ‚y;Alb;Beyaz - -KEY;DE;EN;ES;FI;FR;IT;NL;PL;RO;TR masterdata_colourcode_2;Schwarz;Black;Negro;Musta;Noir;Nero;Zwart;Czarny;Negru;Siyah -GENRST_EOF - -Using XTAB output format makes it clearer that ``KEY;DE;...;RO;TR`` is being treated as a single field name in the CSV header, and likewise each subsequent line is being treated as a single field value. This is because the default field separator is a comma but we have semicolons here. Use XTAB again with different field separator (``--fs semicolon``): - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr --icsv --ifs semicolon --oxtab cat data/colours.csv -KEY masterdata_colourcode_1 -DE Weiß -EN White -ES Blanco -FI Valkoinen -FR Blanc -IT Bianco -NL Wit -PL BiaÅ‚y -RO Alb -TR Beyaz - -KEY masterdata_colourcode_2 -DE Schwarz -EN Black -ES Negro -FI Musta -FR Noir -IT Nero -NL Zwart -PL Czarny -RO Negru -TR Siyah -GENRST_EOF - -Using the new field-separator, retry the cut: - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr --csv --fs semicolon cut -f KEY,PL,RO data/colours.csv -KEY;PL;RO -masterdata_colourcode_1;BiaÅ‚y;Alb -masterdata_colourcode_2;Czarny;Negru -GENRST_EOF - -I assigned $9 and it's not 9th ----------------------------------------------------------------- - -Miller records are ordered lists of key-value pairs. For NIDX format, DKVP format when keys are missing, or CSV/CSV-lite format with ``--implicit-csv-header``, Miller will sequentially assign keys of the form ``1``, ``2``, etc. But these are not integer array indices: they're just field names taken from the initial field ordering in the input data, when it is originally read from the input file(s). - -GENRST_RUN_COMMAND -echo x,y,z | mlr --dkvp cat -GENRST_EOF - -GENRST_RUN_COMMAND -echo x,y,z | mlr --dkvp put '$6="a";$4="b";$55="cde"' -GENRST_EOF - -GENRST_RUN_COMMAND -echo x,y,z | mlr --nidx cat -GENRST_EOF - -GENRST_RUN_COMMAND -echo x,y,z | mlr --csv --implicit-csv-header cat -GENRST_EOF - -GENRST_RUN_COMMAND -echo x,y,z | mlr --dkvp rename 2,999 -GENRST_EOF - -GENRST_RUN_COMMAND -echo x,y,z | mlr --dkvp rename 2,newname -GENRST_EOF - -GENRST_RUN_COMMAND -echo x,y,z | mlr --csv --implicit-csv-header reorder -f 3,1,2 -GENRST_EOF - -Why doesn't mlr cut put fields in the order I want? ----------------------------------------------------------------- - -Example: columns ``x,i,a`` were requested but they appear here in the order ``a,i,x``: - -GENRST_RUN_COMMAND -cat data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr cut -f x,i,a data/small -GENRST_EOF - -The issue is that Miller's ``cut``, by default, outputs cut fields in the order they appear in the input data. This design decision was made intentionally to parallel the Unix/Linux system ``cut`` command, which has the same semantics. - -The solution is to use the ``-o`` option: - -GENRST_RUN_COMMAND -mlr cut -o -f x,i,a data/small -GENRST_EOF - -Numbering and renumbering records ----------------------------------------------------------------- - -The ``awk``-like built-in variable ``NR`` is incremented for each input record: - -GENRST_RUN_COMMAND -cat data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr put '$nr = NR' data/small -GENRST_EOF - -However, this is the record number within the original input stream -- not after any filtering you may have done: - -GENRST_RUN_COMMAND -mlr filter '$a == "wye"' then put '$nr = NR' data/small -GENRST_EOF - -There are two good options here. One is to use the ``cat`` verb with ``-n``: - -GENRST_RUN_COMMAND -mlr filter '$a == "wye"' then cat -n data/small -GENRST_EOF - -The other is to keep your own counter within the ``put`` DSL: - -GENRST_RUN_COMMAND -mlr filter '$a == "wye"' then put 'begin {@n = 1} $n = @n; @n += 1' data/small -GENRST_EOF - -The difference is a matter of taste (although ``mlr cat -n`` puts the counter first). - -Splitting nested fields ----------------------------------------------------------------- - -Suppose you have a TSV file like this: - -GENRST_INCLUDE_ESCAPED(data/nested.tsv) - -The simplest option is to use :ref:`mlr nest `: - -GENRST_RUN_COMMAND -mlr --tsv nest --explode --values --across-records -f b --nested-fs : data/nested.tsv -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --tsv nest --explode --values --across-fields -f b --nested-fs : data/nested.tsv -GENRST_EOF - -While ``mlr nest`` is simplest, let's also take a look at a few ways to do this using the ``put`` DSL. - -One option to split out the colon-delimited values in the ``b`` column is to use ``splitnv`` to create an integer-indexed map and loop over it, adding new fields to the current record: - -GENRST_RUN_COMMAND -mlr --from data/nested.tsv --itsv --oxtab put ' - o = splitnv($b, ":"); - for (k,v in o) { - $["p".k]=v - } -' -GENRST_EOF - -while another is to loop over the same map from ``splitnv`` and use it (with ``put -q`` to suppress printing the original record) to produce multiple records: - -GENRST_RUN_COMMAND -mlr --from data/nested.tsv --itsv --oxtab put -q ' - o = splitnv($b, ":"); - for (k,v in o) { - x = mapsum($*, {"b":v}); - emit x - } -' -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --from data/nested.tsv --tsv put -q ' - o = splitnv($b, ":"); - for (k,v in o) { - x = mapsum($*, {"b":v}); emit x - } -' -GENRST_EOF - -Options for dealing with duplicate rows ----------------------------------------------------------------- - -If your data has records appearing multiple times, you can use :ref:`mlr uniq ` to show and/or count the unique records. - -If you want to look at partial uniqueness -- for example, show only the first record for each unique combination of the ``account_id`` and ``account_status`` fields -- you might use ``mlr head -n 1 -g account_id,account_status``. Please also see :ref:`mlr head `. - -Rectangularizing data ----------------------------------------------------------------- - -Suppose you have a method (in whatever language) which is printing things of the form - -GENRST_INCLUDE_ESCAPED(data/rect-outer.txt) - -and then calls another method which prints things of the form - -GENRST_INCLUDE_ESCAPED(data/rect-middle.txt) - -and then, perhaps, that second method calls a third method which prints things of the form - -GENRST_INCLUDE_ESCAPED(data/rect-inner.txt) - -with the result that your program's output is - -GENRST_INCLUDE_ESCAPED(data/rect.txt) - -The idea here is that middles starting with a 1 belong to the outer value of 1, and so on. (For example, the outer values might be account IDs, the middle values might be invoice IDs, and the inner values might be invoice line-items.) If you want all the middle and inner lines to have the context of which outers they belong to, you can modify your software to pass all those through your methods. Alternatively, don't refactor your code just to handle some ad-hoc log-data formatting -- instead, use the following to rectangularize the data. The idea is to use an out-of-stream variable to accumulate fields across records. Clear that variable when you see an outer ID; accumulate fields; emit output when you see the inner IDs. - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/rect.sh) diff --git a/docs6/shell-commands.rst b/docs6/shell-commands.rst deleted file mode 100644 index b90225928..000000000 --- a/docs6/shell-commands.rst +++ /dev/null @@ -1,69 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Running shell commands -====================== - -TODO: while-read example from issues - -The :ref:`reference-dsl-system` DSL function allows you to run a specific shell command and put its output -- minus the final newline -- into a record field. The command itself is any string, either a literal string, or a concatenation of strings, perhaps including other field values or what have you. - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint put '$o = system("echo hello world")' data/small - a b i x y o - pan pan 1 0.3467901443380824 0.7268028627434533 hello world - eks pan 2 0.7586799647899636 0.5221511083334797 hello world - wye wye 3 0.20460330576630303 0.33831852551664776 hello world - eks wye 4 0.38139939387114097 0.13418874328430463 hello world - wye pan 5 0.5732889198020006 0.8636244699032729 hello world - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint put '$o = system("echo {" . NR . "}")' data/small - a b i x y o - pan pan 1 0.3467901443380824 0.7268028627434533 {1} - eks pan 2 0.7586799647899636 0.5221511083334797 {2} - wye wye 3 0.20460330576630303 0.33831852551664776 {3} - eks wye 4 0.38139939387114097 0.13418874328430463 {4} - wye pan 5 0.5732889198020006 0.8636244699032729 {5} - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint put '$o = system("echo -n ".$a."| sha1sum")' data/small - a b i x y o - pan pan 1 0.3467901443380824 0.7268028627434533 f29c748220331c273ef16d5115f6ecd799947f13 - - eks pan 2 0.7586799647899636 0.5221511083334797 456d988ecb3bf1b75f057fc6e9fe70db464e9388 - - wye wye 3 0.20460330576630303 0.33831852551664776 eab0de043d67f441c7fd1e335f0ca38708e6ebf7 - - eks wye 4 0.38139939387114097 0.13418874328430463 456d988ecb3bf1b75f057fc6e9fe70db464e9388 - - wye pan 5 0.5732889198020006 0.8636244699032729 eab0de043d67f441c7fd1e335f0ca38708e6ebf7 - - -Note that running a subprocess on every record takes a non-trivial amount of time. Comparing asking the system ``date`` command for the current time in nanoseconds versus computing it in process: - -.. - hard-coded, not live-code, since %N doesn't exist on all platforms - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint put '$t=system("date +%s.%N")' then step -a delta -f t data/small - a b i x y t t_delta - pan pan 1 0.3467901443380824 0.7268028627434533 1568774318.513903817 0 - eks pan 2 0.7586799647899636 0.5221511083334797 1568774318.514722876 0.000819 - wye wye 3 0.20460330576630303 0.33831852551664776 1568774318.515618046 0.000895 - eks wye 4 0.38139939387114097 0.13418874328430463 1568774318.516547441 0.000929 - wye pan 5 0.5732889198020006 0.8636244699032729 1568774318.517518828 0.000971 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint put '$t=systime()' then step -a delta -f t data/small - a b i x y t t_delta - pan pan 1 0.3467901443380824 0.7268028627434533 1568774318.518699 0 - eks pan 2 0.7586799647899636 0.5221511083334797 1568774318.518717 0.000018 - wye wye 3 0.20460330576630303 0.33831852551664776 1568774318.518723 0.000006 - eks wye 4 0.38139939387114097 0.13418874328430463 1568774318.518727 0.000004 - wye pan 5 0.5732889198020006 0.8636244699032729 1568774318.518730 0.000003 diff --git a/docs6/shell-commands.rst.in b/docs6/shell-commands.rst.in deleted file mode 100644 index a739252a3..000000000 --- a/docs6/shell-commands.rst.in +++ /dev/null @@ -1,43 +0,0 @@ -Running shell commands -====================== - -TODO: while-read example from issues - -The :ref:`reference-dsl-system` DSL function allows you to run a specific shell command and put its output -- minus the final newline -- into a record field. The command itself is any string, either a literal string, or a concatenation of strings, perhaps including other field values or what have you. - -GENRST_RUN_COMMAND -mlr --opprint put '$o = system("echo hello world")' data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint put '$o = system("echo {" . NR . "}")' data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint put '$o = system("echo -n ".$a."| sha1sum")' data/small -GENRST_EOF - -Note that running a subprocess on every record takes a non-trivial amount of time. Comparing asking the system ``date`` command for the current time in nanoseconds versus computing it in process: - -.. - hard-coded, not live-code, since %N doesn't exist on all platforms - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr --opprint put '$t=system("date +%s.%N")' then step -a delta -f t data/small -a b i x y t t_delta -pan pan 1 0.3467901443380824 0.7268028627434533 1568774318.513903817 0 -eks pan 2 0.7586799647899636 0.5221511083334797 1568774318.514722876 0.000819 -wye wye 3 0.20460330576630303 0.33831852551664776 1568774318.515618046 0.000895 -eks wye 4 0.38139939387114097 0.13418874328430463 1568774318.516547441 0.000929 -wye pan 5 0.5732889198020006 0.8636244699032729 1568774318.517518828 0.000971 -GENRST_EOF - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr --opprint put '$t=systime()' then step -a delta -f t data/small -a b i x y t t_delta -pan pan 1 0.3467901443380824 0.7268028627434533 1568774318.518699 0 -eks pan 2 0.7586799647899636 0.5221511083334797 1568774318.518717 0.000018 -wye wye 3 0.20460330576630303 0.33831852551664776 1568774318.518723 0.000006 -eks wye 4 0.38139939387114097 0.13418874328430463 1568774318.518727 0.000004 -wye pan 5 0.5732889198020006 0.8636244699032729 1568774318.518730 0.000003 -GENRST_EOF diff --git a/docs6/special-symbols-and-formatting.rst b/docs6/special-symbols-and-formatting.rst deleted file mode 100644 index 0bddbd3b5..000000000 --- a/docs6/special-symbols-and-formatting.rst +++ /dev/null @@ -1,146 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Special symbols and formatting -============================== - -How can I handle commas-as-data in various formats? ----------------------------------------------------------------- - -:doc:`CSV ` handles this well and by design: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat commas.csv - Name,Role - "Xiao, Lin",administrator - "Khavari, Darius",tester - -Likewise :ref:`file-formats-json`: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --ojson cat commas.csv - { - "Name": "Xiao, Lin", - "Role": "administrator" - } - { - "Name": "Khavari, Darius", - "Role": "tester" - } - -For Miller's :ref:`vertical-tabular format ` there is no escaping for carriage returns, but commas work fine: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --oxtab cat commas.csv - Name Xiao, Lin - Role administrator - - Name Khavari, Darius - Role tester - -But for :ref:`Key-value_pairs ` and :ref:`index-numbered `, commas are the default field separator. And -- as of Miller 5.4.0 anyway -- there is no CSV-style double-quote-handling like there is for CSV. So commas within the data look like delimiters: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --odkvp cat commas.csv - Name=Xiao, Lin,Role=administrator - Name=Khavari, Darius,Role=tester - -One solution is to use a different delimiter, such as a pipe character: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --odkvp --ofs pipe cat commas.csv - Name=Xiao, Lin|Role=administrator - Name=Khavari, Darius|Role=tester - -To be extra-sure to avoid data/delimiter clashes, you can also use control -characters as delimiters -- here, control-A: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --odkvp --ofs '\001' cat commas.csv | cat -v - Name=Xiao, Lin\001Role=administrator - Name=Khavari, Darius\001Role=tester - -How can I handle field names with special symbols in them? ----------------------------------------------------------------- - -Simply surround the field names with curly braces: - -.. code-block:: none - :emphasize-lines: 1-1 - - echo 'x.a=3,y:b=4,z/c=5' | mlr put '${product.all} = ${x.a} * ${y:b} * ${z/c}' - x.a=3,y:b=4,z/c=5,product.all=60 - -How can I put single-quotes into strings? ----------------------------------------------------------------- - -This is a little tricky due to the shell's handling of quotes. For simplicity, let's first put an update script into a file: - -.. code-block:: none - - $a = "It's OK, I said, then 'for now'." - -.. code-block:: none - :emphasize-lines: 1-1 - - echo a=bcd | mlr put -f data/single-quote-example.mlr - a=It's OK, I said, then 'for now'. - -So, it's simple: Miller's DSL uses double quotes for strings, and you can put single quotes (or backslash-escaped double-quotes) inside strings, no problem. - -Without putting the update expression in a file, it's messier: - -.. code-block:: none - :emphasize-lines: 1-1 - - echo a=bcd | mlr put '$a="It'\''s OK, I said, '\''for now'\''."' - a=It's OK, I said, 'for now'. - -The idea is that the outermost single-quotes are to protect the ``put`` expression from the shell, and the double quotes within them are for Miller. To get a single quote in the middle there, you need to actually put it *outside* the single-quoting for the shell. The pieces are the following, all concatenated together: - -* ``$a="It`` -* ``\'`` -* ``s OK, I said,`` -* ``\'`` -* ``for now`` -* ``\'`` -* ``.`` - -How to escape '?' in regexes? ----------------------------------------------------------------- - -One way is to use square brackets; an alternative is to use simple string-substitution rather than a regular expression. - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/question.dat - a=is it?,b=it is! -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --oxtab put '$c = gsub($a, "[?]"," ...")' data/question.dat - a is it? - b it is! - c is it ... -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --oxtab put '$c = ssub($a, "?"," ...")' data/question.dat - a is it? - b it is! - c is it ... - -The ``ssub`` function exists precisely for this reason: so you don't have to escape anything. diff --git a/docs6/special-symbols-and-formatting.rst.in b/docs6/special-symbols-and-formatting.rst.in deleted file mode 100644 index f18a2fe16..000000000 --- a/docs6/special-symbols-and-formatting.rst.in +++ /dev/null @@ -1,97 +0,0 @@ -Special symbols and formatting -============================== - -How can I handle commas-as-data in various formats? ----------------------------------------------------------------- - -:doc:`CSV ` handles this well and by design: - -GENRST_RUN_COMMAND -cat commas.csv -GENRST_EOF - -Likewise :ref:`file-formats-json`: - -GENRST_RUN_COMMAND -mlr --icsv --ojson cat commas.csv -GENRST_EOF - -For Miller's :ref:`vertical-tabular format ` there is no escaping for carriage returns, but commas work fine: - -GENRST_RUN_COMMAND -mlr --icsv --oxtab cat commas.csv -GENRST_EOF - -But for :ref:`Key-value_pairs ` and :ref:`index-numbered `, commas are the default field separator. And -- as of Miller 5.4.0 anyway -- there is no CSV-style double-quote-handling like there is for CSV. So commas within the data look like delimiters: - -GENRST_RUN_COMMAND -mlr --icsv --odkvp cat commas.csv -GENRST_EOF - -One solution is to use a different delimiter, such as a pipe character: - -GENRST_RUN_COMMAND -mlr --icsv --odkvp --ofs pipe cat commas.csv -GENRST_EOF - -To be extra-sure to avoid data/delimiter clashes, you can also use control -characters as delimiters -- here, control-A: - -GENRST_RUN_COMMAND -mlr --icsv --odkvp --ofs '\001' cat commas.csv | cat -v -GENRST_EOF - -How can I handle field names with special symbols in them? ----------------------------------------------------------------- - -Simply surround the field names with curly braces: - -GENRST_RUN_COMMAND -echo 'x.a=3,y:b=4,z/c=5' | mlr put '${product.all} = ${x.a} * ${y:b} * ${z/c}' -GENRST_EOF - -How can I put single-quotes into strings? ----------------------------------------------------------------- - -This is a little tricky due to the shell's handling of quotes. For simplicity, let's first put an update script into a file: - -GENRST_INCLUDE_ESCAPED(data/single-quote-example.mlr) - -GENRST_RUN_COMMAND -echo a=bcd | mlr put -f data/single-quote-example.mlr -GENRST_EOF - -So, it's simple: Miller's DSL uses double quotes for strings, and you can put single quotes (or backslash-escaped double-quotes) inside strings, no problem. - -Without putting the update expression in a file, it's messier: - -GENRST_RUN_COMMAND -echo a=bcd | mlr put '$a="It'\''s OK, I said, '\''for now'\''."' -GENRST_EOF - -The idea is that the outermost single-quotes are to protect the ``put`` expression from the shell, and the double quotes within them are for Miller. To get a single quote in the middle there, you need to actually put it *outside* the single-quoting for the shell. The pieces are the following, all concatenated together: - -* ``$a="It`` -* ``\'`` -* ``s OK, I said,`` -* ``\'`` -* ``for now`` -* ``\'`` -* ``.`` - -How to escape '?' in regexes? ----------------------------------------------------------------- - -One way is to use square brackets; an alternative is to use simple string-substitution rather than a regular expression. - -GENRST_RUN_COMMAND -cat data/question.dat -GENRST_EOF -GENRST_RUN_COMMAND -mlr --oxtab put '$c = gsub($a, "[?]"," ...")' data/question.dat -GENRST_EOF -GENRST_RUN_COMMAND -mlr --oxtab put '$c = ssub($a, "?"," ...")' data/question.dat -GENRST_EOF - -The ``ssub`` function exists precisely for this reason: so you don't have to escape anything. diff --git a/docs6/sphinx-hack/data b/docs6/sphinx-hack/data deleted file mode 120000 index 4909e06ef..000000000 --- a/docs6/sphinx-hack/data +++ /dev/null @@ -1 +0,0 @@ -../data \ No newline at end of file diff --git a/docs6/sphinx-hack/programs b/docs6/sphinx-hack/programs deleted file mode 120000 index fbc03e6c4..000000000 --- a/docs6/sphinx-hack/programs +++ /dev/null @@ -1 +0,0 @@ -../programs/ \ No newline at end of file diff --git a/docs6/sql-examples.rst b/docs6/sql-examples.rst deleted file mode 100644 index 4d3996081..000000000 --- a/docs6/sql-examples.rst +++ /dev/null @@ -1,252 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -SQL examples -==================== - -.. _sql-output-examples: - -SQL-output examples -^^^^^^^^^^^^^^^^^^^ - -I like to produce SQL-query output with header-column and tab delimiter: this is CSV but with a tab instead of a comma, also known as TSV. Then I post-process with ``mlr --tsv`` or ``mlr --tsvlite``. This means I can do some (or all, or none) of my data processing within SQL queries, and some (or none, or all) of my data processing using Miller -- whichever is most convenient for my needs at the moment. - -For example, using default output formatting in ``mysql`` we get formatting like Miller's ``--opprint --barred``: - -.. code-block:: none - :emphasize-lines: 1-1 - - mysql --database=mydb -e 'show columns in mytable' - +------------------+--------------+------+-----+---------+-------+ - | Field | Type | Null | Key | Default | Extra | - +------------------+--------------+------+-----+---------+-------+ - | id | bigint(20) | NO | MUL | NULL | | - | category | varchar(256) | NO | | NULL | | - | is_permanent | tinyint(1) | NO | | NULL | | - | assigned_to | bigint(20) | YES | | NULL | | - | last_update_time | int(11) | YES | | NULL | | - +------------------+--------------+------+-----+---------+-------+ - -Using ``mysql``'s ``-B`` we get TSV output: - -.. code-block:: none - :emphasize-lines: 1-1 - - mysql --database=mydb -B -e 'show columns in mytable' | mlr --itsvlite --opprint cat - Field Type Null Key Default Extra - id bigint(20) NO MUL NULL - - category varchar(256) NO - NULL - - is_permanent tinyint(1) NO - NULL - - assigned_to bigint(20) YES - NULL - - last_update_time int(11) YES - NULL - - -Since Miller handles TSV output, we can do as much or as little processing as we want in the SQL query, then send the rest on to Miller. This includes outputting as JSON, doing further selects/joins in Miller, doing stats, etc. etc.: - -.. code-block:: none - :emphasize-lines: 1-1 - - mysql --database=mydb -B -e 'show columns in mytable' | mlr --itsvlite --ojson --jlistwrap --jvstack cat - [ - { - "Field": "id", - "Type": "bigint(20)", - "Null": "NO", - "Key": "MUL", - "Default": "NULL", - "Extra": "" - }, - { - "Field": "category", - "Type": "varchar(256)", - "Null": "NO", - "Key": "", - "Default": "NULL", - "Extra": "" - }, - { - "Field": "is_permanent", - "Type": "tinyint(1)", - "Null": "NO", - "Key": "", - "Default": "NULL", - "Extra": "" - }, - { - "Field": "assigned_to", - "Type": "bigint(20)", - "Null": "YES", - "Key": "", - "Default": "NULL", - "Extra": "" - }, - { - "Field": "last_update_time", - "Type": "int(11)", - "Null": "YES", - "Key": "", - "Default": "NULL", - "Extra": "" - } - ] - -.. code-block:: none - :emphasize-lines: 1-1 - - mysql --database=mydb -B -e 'select * from mytable' > query.tsv - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --from query.tsv --t2p stats1 -a count -f id -g category,assigned_to - category assigned_to id_count - special 10000978 207 - special 10003924 385 - special 10009872 168 - standard 10000978 524 - standard 10003924 392 - standard 10009872 108 - ... - -Again, all the examples in the CSV section apply here -- just change the input-format flags. - -.. _sql-input-examples: - -SQL-input examples -^^^^^^^^^^^^^^^^^^ - -One use of NIDX (value-only, no keys) format is for loading up SQL tables. - -Create and load SQL table: - -.. code-block:: none - - mysql> CREATE TABLE abixy( - a VARCHAR(32), - b VARCHAR(32), - i BIGINT(10), - x DOUBLE, - y DOUBLE - ); - Query OK, 0 rows affected (0.01 sec) - - bash$ mlr --onidx --fs comma cat data/medium > medium.nidx - - mysql> LOAD DATA LOCAL INFILE 'medium.nidx' REPLACE INTO TABLE abixy FIELDS TERMINATED BY ',' ; - Query OK, 10000 rows affected (0.07 sec) - Records: 10000 Deleted: 0 Skipped: 0 Warnings: 0 - - mysql> SELECT COUNT(*) AS count FROM abixy; - +-------+ - | count | - +-------+ - | 10000 | - +-------+ - 1 row in set (0.00 sec) - - mysql> SELECT * FROM abixy LIMIT 10; - +------+------+------+---------------------+---------------------+ - | a | b | i | x | y | - +------+------+------+---------------------+---------------------+ - | pan | pan | 1 | 0.3467901443380824 | 0.7268028627434533 | - | eks | pan | 2 | 0.7586799647899636 | 0.5221511083334797 | - | wye | wye | 3 | 0.20460330576630303 | 0.33831852551664776 | - | eks | wye | 4 | 0.38139939387114097 | 0.13418874328430463 | - | wye | pan | 5 | 0.5732889198020006 | 0.8636244699032729 | - | zee | pan | 6 | 0.5271261600918548 | 0.49322128674835697 | - | eks | zee | 7 | 0.6117840605678454 | 0.1878849191181694 | - | zee | wye | 8 | 0.5985540091064224 | 0.976181385699006 | - | hat | wye | 9 | 0.03144187646093577 | 0.7495507603507059 | - | pan | wye | 10 | 0.5026260055412137 | 0.9526183602969864 | - +------+------+------+---------------------+---------------------+ - -Aggregate counts within SQL: - -.. code-block:: none - - mysql> SELECT a, b, COUNT(*) AS count FROM abixy GROUP BY a, b ORDER BY COUNT DESC; - +------+------+-------+ - | a | b | count | - +------+------+-------+ - | zee | wye | 455 | - | pan | eks | 429 | - | pan | pan | 427 | - | wye | hat | 426 | - | hat | wye | 423 | - | pan | hat | 417 | - | eks | hat | 417 | - | pan | zee | 413 | - | eks | eks | 413 | - | zee | hat | 409 | - | eks | wye | 407 | - | zee | zee | 403 | - | pan | wye | 395 | - | wye | pan | 392 | - | zee | eks | 391 | - | zee | pan | 389 | - | hat | eks | 389 | - | wye | eks | 386 | - | wye | zee | 385 | - | hat | zee | 385 | - | hat | hat | 381 | - | wye | wye | 377 | - | eks | pan | 371 | - | hat | pan | 363 | - | eks | zee | 357 | - +------+------+-------+ - 25 rows in set (0.01 sec) - -Aggregate counts within Miller: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint uniq -c -g a,b then sort -nr count data/medium - a b count - zee wye 455 - pan eks 429 - pan pan 427 - wye hat 426 - hat wye 423 - pan hat 417 - eks hat 417 - eks eks 413 - pan zee 413 - zee hat 409 - eks wye 407 - zee zee 403 - pan wye 395 - hat pan 363 - eks zee 357 - -Pipe SQL output to aggregate counts within Miller: - -.. code-block:: none - :emphasize-lines: 1-1 - - mysql -D miller -B -e 'select * from abixy' | mlr --itsv --opprint uniq -c -g a,b then sort -nr count - a b count - zee wye 455 - pan eks 429 - pan pan 427 - wye hat 426 - hat wye 423 - pan hat 417 - eks hat 417 - eks eks 413 - pan zee 413 - zee hat 409 - eks wye 407 - zee zee 403 - pan wye 395 - wye pan 392 - zee eks 391 - zee pan 389 - hat eks 389 - wye eks 386 - hat zee 385 - wye zee 385 - hat hat 381 - wye wye 377 - eks pan 371 - hat pan 363 - eks zee 357 diff --git a/docs6/sql-examples.rst.in b/docs6/sql-examples.rst.in deleted file mode 100644 index 711ac9ea4..000000000 --- a/docs6/sql-examples.rst.in +++ /dev/null @@ -1,242 +0,0 @@ -SQL examples -==================== - -.. _sql-output-examples: - -SQL-output examples -^^^^^^^^^^^^^^^^^^^ - -I like to produce SQL-query output with header-column and tab delimiter: this is CSV but with a tab instead of a comma, also known as TSV. Then I post-process with ``mlr --tsv`` or ``mlr --tsvlite``. This means I can do some (or all, or none) of my data processing within SQL queries, and some (or none, or all) of my data processing using Miller -- whichever is most convenient for my needs at the moment. - -For example, using default output formatting in ``mysql`` we get formatting like Miller's ``--opprint --barred``: - -GENRST_CARDIFY_HIGHLIGHT_ONE -mysql --database=mydb -e 'show columns in mytable' -+------------------+--------------+------+-----+---------+-------+ -| Field | Type | Null | Key | Default | Extra | -+------------------+--------------+------+-----+---------+-------+ -| id | bigint(20) | NO | MUL | NULL | | -| category | varchar(256) | NO | | NULL | | -| is_permanent | tinyint(1) | NO | | NULL | | -| assigned_to | bigint(20) | YES | | NULL | | -| last_update_time | int(11) | YES | | NULL | | -+------------------+--------------+------+-----+---------+-------+ -GENRST_EOF - -Using ``mysql``'s ``-B`` we get TSV output: - -GENRST_CARDIFY_HIGHLIGHT_ONE -mysql --database=mydb -B -e 'show columns in mytable' | mlr --itsvlite --opprint cat -Field Type Null Key Default Extra -id bigint(20) NO MUL NULL - -category varchar(256) NO - NULL - -is_permanent tinyint(1) NO - NULL - -assigned_to bigint(20) YES - NULL - -last_update_time int(11) YES - NULL - -GENRST_EOF - -Since Miller handles TSV output, we can do as much or as little processing as we want in the SQL query, then send the rest on to Miller. This includes outputting as JSON, doing further selects/joins in Miller, doing stats, etc. etc.: - -GENRST_CARDIFY_HIGHLIGHT_ONE -mysql --database=mydb -B -e 'show columns in mytable' | mlr --itsvlite --ojson --jlistwrap --jvstack cat -[ - { - "Field": "id", - "Type": "bigint(20)", - "Null": "NO", - "Key": "MUL", - "Default": "NULL", - "Extra": "" - }, - { - "Field": "category", - "Type": "varchar(256)", - "Null": "NO", - "Key": "", - "Default": "NULL", - "Extra": "" - }, - { - "Field": "is_permanent", - "Type": "tinyint(1)", - "Null": "NO", - "Key": "", - "Default": "NULL", - "Extra": "" - }, - { - "Field": "assigned_to", - "Type": "bigint(20)", - "Null": "YES", - "Key": "", - "Default": "NULL", - "Extra": "" - }, - { - "Field": "last_update_time", - "Type": "int(11)", - "Null": "YES", - "Key": "", - "Default": "NULL", - "Extra": "" - } -] -GENRST_EOF - -GENRST_CARDIFY_HIGHLIGHT_ONE -mysql --database=mydb -B -e 'select * from mytable' > query.tsv -GENRST_EOF - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr --from query.tsv --t2p stats1 -a count -f id -g category,assigned_to -category assigned_to id_count -special 10000978 207 -special 10003924 385 -special 10009872 168 -standard 10000978 524 -standard 10003924 392 -standard 10009872 108 -... -GENRST_EOF - -Again, all the examples in the CSV section apply here -- just change the input-format flags. - -.. _sql-input-examples: - -SQL-input examples -^^^^^^^^^^^^^^^^^^ - -One use of NIDX (value-only, no keys) format is for loading up SQL tables. - -Create and load SQL table: - -GENRST_CARDIFY -mysql> CREATE TABLE abixy( - a VARCHAR(32), - b VARCHAR(32), - i BIGINT(10), - x DOUBLE, - y DOUBLE -); -Query OK, 0 rows affected (0.01 sec) - -bash$ mlr --onidx --fs comma cat data/medium > medium.nidx - -mysql> LOAD DATA LOCAL INFILE 'medium.nidx' REPLACE INTO TABLE abixy FIELDS TERMINATED BY ',' ; -Query OK, 10000 rows affected (0.07 sec) -Records: 10000 Deleted: 0 Skipped: 0 Warnings: 0 - -mysql> SELECT COUNT(*) AS count FROM abixy; -+-------+ -| count | -+-------+ -| 10000 | -+-------+ -1 row in set (0.00 sec) - -mysql> SELECT * FROM abixy LIMIT 10; -+------+------+------+---------------------+---------------------+ -| a | b | i | x | y | -+------+------+------+---------------------+---------------------+ -| pan | pan | 1 | 0.3467901443380824 | 0.7268028627434533 | -| eks | pan | 2 | 0.7586799647899636 | 0.5221511083334797 | -| wye | wye | 3 | 0.20460330576630303 | 0.33831852551664776 | -| eks | wye | 4 | 0.38139939387114097 | 0.13418874328430463 | -| wye | pan | 5 | 0.5732889198020006 | 0.8636244699032729 | -| zee | pan | 6 | 0.5271261600918548 | 0.49322128674835697 | -| eks | zee | 7 | 0.6117840605678454 | 0.1878849191181694 | -| zee | wye | 8 | 0.5985540091064224 | 0.976181385699006 | -| hat | wye | 9 | 0.03144187646093577 | 0.7495507603507059 | -| pan | wye | 10 | 0.5026260055412137 | 0.9526183602969864 | -+------+------+------+---------------------+---------------------+ -GENRST_EOF - -Aggregate counts within SQL: - -GENRST_CARDIFY -mysql> SELECT a, b, COUNT(*) AS count FROM abixy GROUP BY a, b ORDER BY COUNT DESC; -+------+------+-------+ -| a | b | count | -+------+------+-------+ -| zee | wye | 455 | -| pan | eks | 429 | -| pan | pan | 427 | -| wye | hat | 426 | -| hat | wye | 423 | -| pan | hat | 417 | -| eks | hat | 417 | -| pan | zee | 413 | -| eks | eks | 413 | -| zee | hat | 409 | -| eks | wye | 407 | -| zee | zee | 403 | -| pan | wye | 395 | -| wye | pan | 392 | -| zee | eks | 391 | -| zee | pan | 389 | -| hat | eks | 389 | -| wye | eks | 386 | -| wye | zee | 385 | -| hat | zee | 385 | -| hat | hat | 381 | -| wye | wye | 377 | -| eks | pan | 371 | -| hat | pan | 363 | -| eks | zee | 357 | -+------+------+-------+ -25 rows in set (0.01 sec) -GENRST_EOF - -Aggregate counts within Miller: - -GENRST_CARDIFY_HIGHLIGHT_ONE -mlr --opprint uniq -c -g a,b then sort -nr count data/medium -a b count -zee wye 455 -pan eks 429 -pan pan 427 -wye hat 426 -hat wye 423 -pan hat 417 -eks hat 417 -eks eks 413 -pan zee 413 -zee hat 409 -eks wye 407 -zee zee 403 -pan wye 395 -hat pan 363 -eks zee 357 -GENRST_EOF - -Pipe SQL output to aggregate counts within Miller: - -GENRST_CARDIFY_HIGHLIGHT_ONE -mysql -D miller -B -e 'select * from abixy' | mlr --itsv --opprint uniq -c -g a,b then sort -nr count -a b count -zee wye 455 -pan eks 429 -pan pan 427 -wye hat 426 -hat wye 423 -pan hat 417 -eks hat 417 -eks eks 413 -pan zee 413 -zee hat 409 -eks wye 407 -zee zee 403 -pan wye 395 -wye pan 392 -zee eks 391 -zee pan 389 -hat eks 389 -wye eks 386 -hat zee 385 -wye zee 385 -hat hat 381 -wye wye 377 -eks pan 371 -hat pan 363 -eks zee 357 -GENRST_EOF diff --git a/docs6/statistics-examples.rst b/docs6/statistics-examples.rst deleted file mode 100644 index eab281d39..000000000 --- a/docs6/statistics-examples.rst +++ /dev/null @@ -1,71 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Statistics examples -==================== - -Computing interquartile ranges ----------------------------------------------------------------- - -For one or more specified field names, simply compute p25 and p75, then write the IQR as the difference of p75 and p25: - -.. code-block:: none - :emphasize-lines: 1-3 - - mlr --oxtab stats1 -f x -a p25,p75 \ - then put '$x_iqr = $x_p75 - $x_p25' \ - data/medium - x_p25 0.24667037823231752 - x_p75 0.7481860062358446 - x_iqr 0.5015156280035271 - -For wildcarded field names, first compute p25 and p75, then loop over field names with ``p25`` in them: - -.. code-block:: none - :emphasize-lines: 1-7 - - mlr --oxtab stats1 --fr '[i-z]' -a p25,p75 \ - then put 'for (k,v in $*) { - if (k =~ "(.*)_p25") { - $["\1_iqr"] = $["\1_p75"] - $["\1_p25"] - } - }' \ - data/medium - -Computing weighted means ----------------------------------------------------------------- - -This might be more elegantly implemented as an option within the ``stats1`` verb. Meanwhile, it's expressible within the DSL: - -.. code-block:: none - :emphasize-lines: 1-24 - - mlr --from data/medium put -q ' - # Using the y field for weighting in this example - weight = $y; - - # Using the a field for weighted aggregation in this example - @sumwx[$a] += weight * $i; - @sumw[$a] += weight; - - @sumx[$a] += $i; - @sumn[$a] += 1; - - end { - map wmean = {}; - map mean = {}; - for (a in @sumwx) { - wmean[a] = @sumwx[a] / @sumw[a] - } - for (a in @sumx) { - mean[a] = @sumx[a] / @sumn[a] - } - #emit wmean, "a"; - #emit mean, "a"; - emit (wmean, mean), "a"; - }' - a=pan,wmean=4979.563722208067,mean=5028.259010091302 - a=eks,wmean=4890.3815931472145,mean=4956.2900763358775 - a=wye,wmean=4946.987746229947,mean=4920.001017293998 - a=zee,wmean=5164.719684856538,mean=5123.092330239375 - a=hat,wmean=4925.533162478552,mean=4967.743946419371 diff --git a/docs6/statistics-examples.rst.in b/docs6/statistics-examples.rst.in deleted file mode 100644 index 877e01b14..000000000 --- a/docs6/statistics-examples.rst.in +++ /dev/null @@ -1,20 +0,0 @@ -Statistics examples -==================== - -Computing interquartile ranges ----------------------------------------------------------------- - -For one or more specified field names, simply compute p25 and p75, then write the IQR as the difference of p75 and p25: - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/iqr1.sh) - -For wildcarded field names, first compute p25 and p75, then loop over field names with ``p25`` in them: - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/iqrn.sh) - -Computing weighted means ----------------------------------------------------------------- - -This might be more elegantly implemented as an option within the ``stats1`` verb. Meanwhile, it's expressible within the DSL: - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/weighted-mean.sh) diff --git a/docs6/then-chaining.rst b/docs6/then-chaining.rst deleted file mode 100644 index 7bbbc28a1..000000000 --- a/docs6/then-chaining.rst +++ /dev/null @@ -1,125 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Then-chaining -============= - -How do I examine then-chaining? ----------------------------------------------------------------- - -Then-chaining found in Miller is intended to function the same as Unix pipes, but with less keystroking. You can print your data one pipeline step at a time, to see what intermediate output at one step becomes the input to the next step. - -First, look at the input data: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/then-example.csv - Status,Payment_Type,Amount - paid,cash,10.00 - pending,debit,20.00 - paid,cash,50.00 - pending,credit,40.00 - paid,debit,30.00 - -Next, run the first step of your command, omitting anything from the first ``then`` onward: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --icsv --opprint count-distinct -f Status,Payment_Type data/then-example.csv - Status Payment_Type count - paid cash 2 - pending debit 1 - pending credit 1 - paid debit 1 - -After that, run it with the next ``then`` step included: - -.. code-block:: none - :emphasize-lines: 1-3 - - mlr --icsv --opprint count-distinct -f Status,Payment_Type \ - then sort -nr count \ - data/then-example.csv - Status Payment_Type count - paid cash 2 - pending debit 1 - pending credit 1 - paid debit 1 - -Now if you use ``then`` to include another verb after that, the columns ``Status``, ``Payment_Type``, and ``count`` will be the input to that verb. - -Note, by the way, that you'll get the same results using pipes: - -.. code-block:: none - :emphasize-lines: 1-2 - - mlr --csv count-distinct -f Status,Payment_Type data/then-example.csv \ - | mlr --icsv --opprint sort -nr count - Status Payment_Type count - paid cash 2 - pending debit 1 - pending credit 1 - paid debit 1 - -NR is not consecutive after then-chaining ----------------------------------------------------------------- - -Given this input data: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/small - a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533 - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797 - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776 - a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729 - -why don't I see ``NR=1`` and ``NR=2`` here?? - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr filter '$x > 0.5' then put '$NR = NR' data/small - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797,NR=2 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729,NR=5 - -The reason is that ``NR`` is computed for the original input records and isn't dynamically updated. By contrast, ``NF`` is dynamically updated: it's the number of fields in the current record, and if you add/remove a field, the value of ``NF`` will change: - -.. code-block:: none - :emphasize-lines: 1-1 - - echo x=1,y=2,z=3 | mlr put '$nf1 = NF; $u = 4; $nf2 = NF; unset $x,$y,$z; $nf3 = NF' - nf1=3,u=4,nf2=5,nf3=3 - -``NR``, by contrast (and ``FNR`` as well), retains the value from the original input stream, and records may be dropped by a ``filter`` within a ``then``-chain. To recover consecutive record numbers, you can use out-of-stream variables as follows: - -.. code-block:: none - :emphasize-lines: 1-11 - - mlr --opprint --from data/small put ' - begin{ @nr1 = 0 } - @nr1 += 1; - $nr1 = @nr1 - ' \ - then filter '$x>0.5' \ - then put ' - begin{ @nr2 = 0 } - @nr2 += 1; - $nr2 = @nr2 - ' - a b i x y nr1 nr2 - eks pan 2 0.7586799647899636 0.5221511083334797 2 1 - wye pan 5 0.5732889198020006 0.8636244699032729 5 2 - -Or, simply use ``mlr cat -n``: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr filter '$x > 0.5' then cat -n data/small - n=1,a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797 - n=2,a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729 diff --git a/docs6/then-chaining.rst.in b/docs6/then-chaining.rst.in deleted file mode 100644 index 09ee98b2f..000000000 --- a/docs6/then-chaining.rst.in +++ /dev/null @@ -1,67 +0,0 @@ -Then-chaining -============= - -How do I examine then-chaining? ----------------------------------------------------------------- - -Then-chaining found in Miller is intended to function the same as Unix pipes, but with less keystroking. You can print your data one pipeline step at a time, to see what intermediate output at one step becomes the input to the next step. - -First, look at the input data: - -GENRST_RUN_COMMAND -cat data/then-example.csv -GENRST_EOF - -Next, run the first step of your command, omitting anything from the first ``then`` onward: - -GENRST_RUN_COMMAND -mlr --icsv --opprint count-distinct -f Status,Payment_Type data/then-example.csv -GENRST_EOF - -After that, run it with the next ``then`` step included: - -GENRST_RUN_COMMAND -mlr --icsv --opprint count-distinct -f Status,Payment_Type \ - then sort -nr count \ - data/then-example.csv -GENRST_EOF - -Now if you use ``then`` to include another verb after that, the columns ``Status``, ``Payment_Type``, and ``count`` will be the input to that verb. - -Note, by the way, that you'll get the same results using pipes: - -GENRST_RUN_COMMAND -mlr --csv count-distinct -f Status,Payment_Type data/then-example.csv \ -| mlr --icsv --opprint sort -nr count -GENRST_EOF - -NR is not consecutive after then-chaining ----------------------------------------------------------------- - -Given this input data: - -GENRST_RUN_COMMAND -cat data/small -GENRST_EOF - -why don't I see ``NR=1`` and ``NR=2`` here?? - -GENRST_RUN_COMMAND -mlr filter '$x > 0.5' then put '$NR = NR' data/small -GENRST_EOF - -The reason is that ``NR`` is computed for the original input records and isn't dynamically updated. By contrast, ``NF`` is dynamically updated: it's the number of fields in the current record, and if you add/remove a field, the value of ``NF`` will change: - -GENRST_RUN_COMMAND -echo x=1,y=2,z=3 | mlr put '$nf1 = NF; $u = 4; $nf2 = NF; unset $x,$y,$z; $nf3 = NF' -GENRST_EOF - -``NR``, by contrast (and ``FNR`` as well), retains the value from the original input stream, and records may be dropped by a ``filter`` within a ``then``-chain. To recover consecutive record numbers, you can use out-of-stream variables as follows: - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/dynamic-nr.sh) - -Or, simply use ``mlr cat -n``: - -GENRST_RUN_COMMAND -mlr filter '$x > 0.5' then cat -n data/small -GENRST_EOF diff --git a/docs6/two-pass-algorithms.rst b/docs6/two-pass-algorithms.rst deleted file mode 100644 index ea9e441d4..000000000 --- a/docs6/two-pass-algorithms.rst +++ /dev/null @@ -1,718 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Two-pass algorithms -================================================================ - -Overview ----------------------------------------------------------------- - -Miller is a streaming record processor; commands are performed once per record. This makes Miller particularly suitable for single-pass algorithms, allowing many of its verbs to process files that are (much) larger than the amount of RAM present in your system. (Of course, Miller verbs such as ``sort``, ``tac``, etc. all must ingest and retain all input records before emitting any output records.) You can also use out-of-stream variables to perform multi-pass computations, at the price of retaining all input records in memory. - -One of Miller's strengths is its compact notation: for example, given input of the form - -.. code-block:: none - :emphasize-lines: 1-1 - - head -n 5 ../data/medium - a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533 - a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797 - a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776 - a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463 - a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729 - -you can simply do - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --oxtab stats1 -a sum -f x ../data/medium - x_sum 4986.019681679581 - -or - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint stats1 -a sum -f x -g b ../data/medium - b x_sum - pan 965.7636699425815 - wye 1023.5484702619565 - zee 979.7420161495838 - eks 1016.7728571314786 - hat 1000.192668193983 - -rather than the more tedious - -.. code-block:: none - :emphasize-lines: 1-6 - - mlr --oxtab put -q ' - @x_sum += $x; - end { - emit @x_sum - } - ' data/medium - x_sum 4986.019681679581 - -or - -.. code-block:: none - :emphasize-lines: 1-6 - - mlr --opprint put -q ' - @x_sum[$b] += $x; - end { - emit @x_sum, "b" - } - ' data/medium - b x_sum - pan 965.7636699425815 - wye 1023.5484702619565 - zee 979.7420161495838 - eks 1016.7728571314786 - hat 1000.192668193983 - -The former (``mlr stats1`` et al.) has the advantages of being easier to type, being less error-prone to type, and running faster. - -Nonetheless, out-of-stream variables (which I whimsically call *oosvars*), begin/end blocks, and emit statements give you the ability to implement logic -- if you wish to do so -- which isn't present in other Miller verbs. (If you find yourself often using the same out-of-stream-variable logic over and over, please file a request at https://github.com/johnkerl/miller/issues to get it implemented directly in Go as a Miller verb of its own.) - -The following examples compute some things using oosvars which are already computable using Miller verbs, by way of providing food for thought. - -Computation of percentages ----------------------------------------------------------------- - -For example, mapping numeric values down a column to the percentage between their min and max values is two-pass: on the first pass you find the min and max values, then on the second, map each record's value to a percentage. - -.. code-block:: none - :emphasize-lines: 1-16 - - mlr --from data/small --opprint put -q ' - # These are executed once per record, which is the first pass. - # The key is to use NR to index an out-of-stream variable to - # retain all the x-field values. - @x_min = min($x, @x_min); - @x_max = max($x, @x_max); - @x[NR] = $x; - - # The second pass is in a for-loop in an end-block. - end { - for (nr, x in @x) { - @x_pct[nr] = 100 * (x - @x_min) / (@x_max - @x_min); - } - emit (@x, @x_pct), "NR" - } - ' - NR x x_pct - 1 0.3467901443380824 25.66194338926441 - 2 0.7586799647899636 100 - 3 0.20460330576630303 0 - 4 0.38139939387114097 31.90823602213647 - 5 0.5732889198020006 66.54054236562845 - -Line-number ratios ----------------------------------------------------------------- - -Similarly, finding the total record count requires first reading through all the data: - -.. code-block:: none - :emphasize-lines: 1-11 - - mlr --opprint --from data/small put -q ' - @records[NR] = $*; - end { - for((I,k),v in @records) { - @records[I]["I"] = I; - @records[I]["N"] = NR; - @records[I]["PCT"] = 100*I/NR - } - emit @records,"I" - } - ' then reorder -f I,N,PCT - I N PCT a b i x y - 1 5 (error) pan pan 1 0.3467901443380824 0.7268028627434533 - 2 5 (error) eks pan 2 0.7586799647899636 0.5221511083334797 - 3 5 (error) wye wye 3 0.20460330576630303 0.33831852551664776 - 4 5 (error) eks wye 4 0.38139939387114097 0.13418874328430463 - 5 5 (error) wye pan 5 0.5732889198020006 0.8636244699032729 - -Records having max value ----------------------------------------------------------------- - -The idea is to retain records having the largest value of ``n`` in the following data: - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --itsv --opprint cat data/maxrows.tsv - a b n score - purple red 5 0.743231 - blue purple 2 0.093710 - red purple 2 0.802103 - purple red 5 0.389055 - red purple 2 0.880457 - orange red 2 0.540349 - purple purple 1 0.634451 - orange purple 5 0.257223 - orange purple 5 0.693499 - red red 4 0.981355 - blue purple 5 0.157052 - purple purple 1 0.441784 - red purple 1 0.124912 - orange blue 1 0.921944 - blue purple 4 0.490909 - purple red 5 0.454779 - green purple 4 0.198278 - orange blue 5 0.705700 - red red 3 0.940705 - purple red 5 0.072936 - orange blue 3 0.389463 - orange purple 2 0.664985 - blue purple 1 0.371813 - red purple 4 0.984571 - green purple 5 0.203577 - green purple 3 0.900873 - purple purple 0 0.965677 - blue purple 2 0.208785 - purple purple 1 0.455077 - red purple 4 0.477187 - blue red 4 0.007487 - -Of course, the largest value of ``n`` isn't known until after all data have been read. Using an out-of-stream variable we can retain all records as they are read, then filter them at the end: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/maxrows.mlr - # Retain all records - @records[NR] = $*; - # Track max value of n - @maxn = max(@maxn, $n); - - # After all records have been read, loop through retained records - # and print those with the max n value. - end { - for (nr in @records) { - map record = @records[nr]; - if (record["n"] == @maxn) { - emit record; - } - } - } - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --itsv --opprint put -q -f data/maxrows.mlr data/maxrows.tsv - a b n score - purple red 5 0.743231 - purple red 5 0.389055 - orange purple 5 0.257223 - orange purple 5 0.693499 - blue purple 5 0.157052 - purple red 5 0.454779 - orange blue 5 0.705700 - purple red 5 0.072936 - green purple 5 0.203577 - -Feature-counting ----------------------------------------------------------------- - -Suppose you have some heterogeneous data like this: - -.. code-block:: none - - { "qoh": 29874, "rate": 1.68, "latency": 0.02 } - { "name": "alice", "uid": 572 } - { "qoh": 1227, "rate": 1.01, "latency": 0.07 } - { "qoh": 13458, "rate": 1.72, "latency": 0.04 } - { "qoh": 56782, "rate": 1.64 } - { "qoh": 23512, "rate": 1.71, "latency": 0.03 } - { "qoh": 9876, "rate": 1.89, "latency": 0.08 } - { "name": "bill", "uid": 684 } - { "name": "chuck", "uid2": 908 } - { "name": "dottie", "uid": 440 } - { "qoh": 0, "rate": 0.40, "latency": 0.01 } - { "qoh": 5438, "rate": 1.56, "latency": 0.17 } - -A reasonable question to ask is, how many occurrences of each field are there? And, what percentage of total row count has each of them? Since the denominator of the percentage is not known until the end, this is a two-pass algorithm: - -.. code-block:: none - - for (key in $*) { - @key_counts[key] += 1; - } - @record_count += 1; - - end { - for (key in @key_counts) { - @key_fraction[key] = @key_counts[key] / @record_count - } - emit @record_count; - emit @key_counts, "key"; - emit @key_fraction,"key" - } - -Then - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --json put -q -f data/feature-count.mlr data/features.json - { - "record_count": 12 - } - { - "key": "qoh", - "key_counts": 8 - } - { - "key": "rate", - "key_counts": 8 - } - { - "key": "latency", - "key_counts": 7 - } - { - "key": "name", - "key_counts": 4 - } - { - "key": "uid", - "key_counts": 3 - } - { - "key": "uid2", - "key_counts": 1 - } - { - "key": "qoh", - "key_fraction": 0.6666666666666666 - } - { - "key": "rate", - "key_fraction": 0.6666666666666666 - } - { - "key": "latency", - "key_fraction": 0.5833333333333334 - } - { - "key": "name", - "key_fraction": 0.3333333333333333 - } - { - "key": "uid", - "key_fraction": 0.25 - } - { - "key": "uid2", - "key_fraction": 0.08333333333333333 - } - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --ijson --opprint put -q -f data/feature-count.mlr data/features.json - record_count - 12 - - key key_counts - qoh 8 - rate 8 - latency 7 - name 4 - uid 3 - uid2 1 - - key key_fraction - qoh 0.6666666666666666 - rate 0.6666666666666666 - latency 0.5833333333333334 - name 0.3333333333333333 - uid 0.25 - uid2 0.08333333333333333 - -Unsparsing ----------------------------------------------------------------- - -The previous section discussed how to fill out missing data fields within CSV with full header line -- so the list of all field names is present within the header line. Next, let's look at a related problem: we have data where each record has various key names but we want to produce rectangular output having the union of all key names. - -For example, suppose you have JSON input like this: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/sparse.json - {"a":1,"b":2,"v":3} - {"u":1,"b":2} - {"a":1,"v":2,"x":3} - {"v":1,"w":2} - -There are field names ``a``, ``b``, ``v``, ``u``, ``x``, ``w`` in the data -- but not all in every record. Since we don't know the names of all the keys until we've read them all, this needs to be a two-pass algorithm. On the first pass, remember all the unique key names and all the records; on the second pass, loop through the records filling in absent values, then producing output. Use ``put -q`` since we don't want to produce per-record output, only emitting output in the ``end`` block: - -.. code-block:: none - :emphasize-lines: 1-1 - - cat data/unsparsify.mlr - # First pass: - # Remember all unique key names: - for (k in $*) { - @all_keys[k] = 1; - } - # Remember all input records: - @records[NR] = $*; - - # Second pass: - end { - for (nr in @records) { - # Get the sparsely keyed input record: - irecord = @records[nr]; - # Fill in missing keys with empty string: - map orecord = {}; - for (k in @all_keys) { - if (haskey(irecord, k)) { - orecord[k] = irecord[k]; - } else { - orecord[k] = ""; - } - } - # Produce the output: - emit orecord; - } - } - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --json put -q -f data/unsparsify.mlr data/sparse.json - { - "a": 1, - "b": 2, - "v": 3, - "u": "", - "x": "", - "w": "" - } - { - "a": "", - "b": 2, - "v": "", - "u": 1, - "x": "", - "w": "" - } - { - "a": 1, - "b": "", - "v": 2, - "u": "", - "x": 3, - "w": "" - } - { - "a": "", - "b": "", - "v": 1, - "u": "", - "x": "", - "w": 2 - } - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --ijson --ocsv put -q -f data/unsparsify.mlr data/sparse.json - a,b,v,u,x,w - 1,2,3,,, - ,2,,1,, - 1,,2,,3, - ,,1,,,2 - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --ijson --opprint put -q -f data/unsparsify.mlr data/sparse.json - a b v u x w - 1 2 3 - - - - - 2 - 1 - - - 1 - 2 - 3 - - - - 1 - - 2 - -There is a keystroke-saving verb for this: :ref:`mlr unsparsify `. - -Mean without/with oosvars ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint stats1 -a mean -f x data/medium - x_mean - 0.49860196816795804 - -.. code-block:: none - :emphasize-lines: 1-8 - - mlr --opprint put -q ' - @x_sum += $x; - @x_count += 1; - end { - @x_mean = @x_sum / @x_count; - emit @x_mean - } - ' data/medium - x_mean - 0.49860196816795804 - -Keyed mean without/with oosvars ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint stats1 -a mean -f x -g a,b data/medium - a b x_mean - pan pan 0.5133141190437597 - eks pan 0.48507555383425127 - wye wye 0.49150092785839306 - eks wye 0.4838950517724162 - wye pan 0.4996119901034838 - zee pan 0.5198298297816007 - eks zee 0.49546320772681596 - zee wye 0.5142667998230479 - hat wye 0.49381326184632596 - pan wye 0.5023618498923658 - zee eks 0.4883932942792647 - hat zee 0.5099985721987774 - hat eks 0.48587864619953547 - wye hat 0.4977304763723314 - pan eks 0.5036718595143479 - eks eks 0.5227992666570941 - hat hat 0.47993053101017374 - hat pan 0.4643355557376876 - zee zee 0.5127559183726382 - pan hat 0.492140950155604 - pan zee 0.4966041598627583 - zee hat 0.46772617655014515 - wye zee 0.5059066170573692 - eks hat 0.5006790659966355 - wye eks 0.5306035254809106 - -.. code-block:: none - :emphasize-lines: 1-10 - - mlr --opprint put -q ' - @x_sum[$a][$b] += $x; - @x_count[$a][$b] += 1; - end{ - for ((a, b), v in @x_sum) { - @x_mean[a][b] = @x_sum[a][b] / @x_count[a][b]; - } - emit @x_mean, "a", "b" - } - ' data/medium - a b x_mean - pan pan 0.5133141190437597 - pan wye 0.5023618498923658 - pan eks 0.5036718595143479 - pan hat 0.492140950155604 - pan zee 0.4966041598627583 - eks pan 0.48507555383425127 - eks wye 0.4838950517724162 - eks zee 0.49546320772681596 - eks eks 0.5227992666570941 - eks hat 0.5006790659966355 - wye wye 0.49150092785839306 - wye pan 0.4996119901034838 - wye hat 0.4977304763723314 - wye zee 0.5059066170573692 - wye eks 0.5306035254809106 - zee pan 0.5198298297816007 - zee wye 0.5142667998230479 - zee eks 0.4883932942792647 - zee zee 0.5127559183726382 - zee hat 0.46772617655014515 - hat wye 0.49381326184632596 - hat zee 0.5099985721987774 - hat eks 0.48587864619953547 - hat hat 0.47993053101017374 - hat pan 0.4643355557376876 - -Variance and standard deviation without/with oosvars ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --oxtab stats1 -a count,sum,mean,var,stddev -f x data/medium - x_count 10000 - x_sum 4986.019681679581 - x_mean 0.49860196816795804 - x_var 0.08426974433144456 - x_stddev 0.2902925151144007 - -.. code-block:: none - :emphasize-lines: 1-1 - - cat variance.mlr - @n += 1; - @sumx += $x; - @sumx2 += $x**2; - end { - @mean = @sumx / @n; - @var = (@sumx2 - @mean * (2 * @sumx - @n * @mean)) / (@n - 1); - @stddev = sqrt(@var); - emitf @n, @sumx, @sumx2, @mean, @var, @stddev - } - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --oxtab put -q -f variance.mlr data/medium - n 10000 - sumx 4986.019681679581 - sumx2 3328.652400179729 - mean 0.49860196816795804 - var 0.08426974433144456 - stddev 0.2902925151144007 - -You can also do this keyed, of course, imitating the keyed-mean example above. - -Min/max without/with oosvars ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --oxtab stats1 -a min,max -f x data/medium - x_min 0.00004509679127584487 - x_max 0.999952670371898 - -.. code-block:: none - :emphasize-lines: 1-5 - - mlr --oxtab put -q ' - @x_min = min(@x_min, $x); - @x_max = max(@x_max, $x); - end{emitf @x_min, @x_max} - ' data/medium - x_min 0.00004509679127584487 - x_max 0.999952670371898 - -Keyed min/max without/with oosvars ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint stats1 -a min,max -f x -g a data/medium - a x_min x_max - pan 0.00020390740306253097 0.9994029107062516 - eks 0.0006917972627396018 0.9988110946859143 - wye 0.0001874794831505655 0.9998228522652893 - zee 0.0005486114815762555 0.9994904324789629 - hat 0.00004509679127584487 0.999952670371898 - -.. code-block:: none - :emphasize-lines: 1-7 - - mlr --opprint --from data/medium put -q ' - @min[$a] = min(@min[$a], $x); - @max[$a] = max(@max[$a], $x); - end{ - emit (@min, @max), "a"; - } - ' - a min max - pan 0.00020390740306253097 0.9994029107062516 - eks 0.0006917972627396018 0.9988110946859143 - wye 0.0001874794831505655 0.9998228522652893 - zee 0.0005486114815762555 0.9994904324789629 - hat 0.00004509679127584487 0.999952670371898 - -Delta without/with oosvars ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint step -a delta -f x data/small - a b i x y x_delta - pan pan 1 0.3467901443380824 0.7268028627434533 0 - eks pan 2 0.7586799647899636 0.5221511083334797 0.41188982045188116 - wye wye 3 0.20460330576630303 0.33831852551664776 -0.5540766590236605 - eks wye 4 0.38139939387114097 0.13418874328430463 0.17679608810483793 - wye pan 5 0.5732889198020006 0.8636244699032729 0.19188952593085962 - -.. code-block:: none - :emphasize-lines: 1-4 - - mlr --opprint put ' - $x_delta = is_present(@last) ? $x - @last : 0; - @last = $x - ' data/small - a b i x y x_delta - pan pan 1 0.3467901443380824 0.7268028627434533 0 - eks pan 2 0.7586799647899636 0.5221511083334797 0.41188982045188116 - wye wye 3 0.20460330576630303 0.33831852551664776 -0.5540766590236605 - eks wye 4 0.38139939387114097 0.13418874328430463 0.17679608810483793 - wye pan 5 0.5732889198020006 0.8636244699032729 0.19188952593085962 - -Keyed delta without/with oosvars ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint step -a delta -f x -g a data/small - a b i x y x_delta - pan pan 1 0.3467901443380824 0.7268028627434533 0 - eks pan 2 0.7586799647899636 0.5221511083334797 0 - wye wye 3 0.20460330576630303 0.33831852551664776 0 - eks wye 4 0.38139939387114097 0.13418874328430463 -0.3772805709188226 - wye pan 5 0.5732889198020006 0.8636244699032729 0.36868561403569755 - -.. code-block:: none - :emphasize-lines: 1-4 - - mlr --opprint put ' - $x_delta = is_present(@last[$a]) ? $x - @last[$a] : 0; - @last[$a]=$x - ' data/small - a b i x y x_delta - pan pan 1 0.3467901443380824 0.7268028627434533 0 - eks pan 2 0.7586799647899636 0.5221511083334797 0 - wye wye 3 0.20460330576630303 0.33831852551664776 0 - eks wye 4 0.38139939387114097 0.13418874328430463 -0.3772805709188226 - wye pan 5 0.5732889198020006 0.8636244699032729 0.36868561403569755 - -Exponentially weighted moving averages without/with oosvars ----------------------------------------------------------------- - -.. code-block:: none - :emphasize-lines: 1-1 - - mlr --opprint step -a ewma -d 0.1 -f x data/small - a b i x y x_ewma_0.1 - pan pan 1 0.3467901443380824 0.7268028627434533 0.3467901443380824 - eks pan 2 0.7586799647899636 0.5221511083334797 0.3879791263832706 - wye wye 3 0.20460330576630303 0.33831852551664776 0.36964154432157387 - eks wye 4 0.38139939387114097 0.13418874328430463 0.37081732927653055 - wye pan 5 0.5732889198020006 0.8636244699032729 0.3910644883290776 - -.. code-block:: none - :emphasize-lines: 1-5 - - mlr --opprint put ' - begin{ @a=0.1 }; - $e = NR==1 ? $x : @a * $x + (1 - @a) * @e; - @e=$e - ' data/small - a b i x y e - pan pan 1 0.3467901443380824 0.7268028627434533 0.3467901443380824 - eks pan 2 0.7586799647899636 0.5221511083334797 0.3879791263832706 - wye wye 3 0.20460330576630303 0.33831852551664776 0.36964154432157387 - eks wye 4 0.38139939387114097 0.13418874328430463 0.37081732927653055 - wye pan 5 0.5732889198020006 0.8636244699032729 0.3910644883290776 diff --git a/docs6/two-pass-algorithms.rst.in b/docs6/two-pass-algorithms.rst.in deleted file mode 100644 index 4f30361e7..000000000 --- a/docs6/two-pass-algorithms.rst.in +++ /dev/null @@ -1,218 +0,0 @@ -Two-pass algorithms -================================================================ - -Overview ----------------------------------------------------------------- - -Miller is a streaming record processor; commands are performed once per record. This makes Miller particularly suitable for single-pass algorithms, allowing many of its verbs to process files that are (much) larger than the amount of RAM present in your system. (Of course, Miller verbs such as ``sort``, ``tac``, etc. all must ingest and retain all input records before emitting any output records.) You can also use out-of-stream variables to perform multi-pass computations, at the price of retaining all input records in memory. - -One of Miller's strengths is its compact notation: for example, given input of the form - -GENRST_RUN_COMMAND -head -n 5 ../data/medium -GENRST_EOF - -you can simply do - -GENRST_RUN_COMMAND -mlr --oxtab stats1 -a sum -f x ../data/medium -GENRST_EOF - -or - -GENRST_RUN_COMMAND -mlr --opprint stats1 -a sum -f x -g b ../data/medium -GENRST_EOF - -rather than the more tedious - -GENRST_INCLUDE_AND_RUN_ESCAPED(oosvar-example-sum.sh) - -or - -GENRST_INCLUDE_AND_RUN_ESCAPED(oosvar-example-sum-grouped.sh) - -The former (``mlr stats1`` et al.) has the advantages of being easier to type, being less error-prone to type, and running faster. - -Nonetheless, out-of-stream variables (which I whimsically call *oosvars*), begin/end blocks, and emit statements give you the ability to implement logic -- if you wish to do so -- which isn't present in other Miller verbs. (If you find yourself often using the same out-of-stream-variable logic over and over, please file a request at https://github.com/johnkerl/miller/issues to get it implemented directly in Go as a Miller verb of its own.) - -The following examples compute some things using oosvars which are already computable using Miller verbs, by way of providing food for thought. - -Computation of percentages ----------------------------------------------------------------- - -For example, mapping numeric values down a column to the percentage between their min and max values is two-pass: on the first pass you find the min and max values, then on the second, map each record's value to a percentage. - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/two-pass-percentage.sh) - -Line-number ratios ----------------------------------------------------------------- - -Similarly, finding the total record count requires first reading through all the data: - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/two-pass-record-numbers.sh) - -Records having max value ----------------------------------------------------------------- - -The idea is to retain records having the largest value of ``n`` in the following data: - -GENRST_RUN_COMMAND -mlr --itsv --opprint cat data/maxrows.tsv -GENRST_EOF - -Of course, the largest value of ``n`` isn't known until after all data have been read. Using an out-of-stream variable we can retain all records as they are read, then filter them at the end: - -GENRST_RUN_COMMAND -cat data/maxrows.mlr -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --itsv --opprint put -q -f data/maxrows.mlr data/maxrows.tsv -GENRST_EOF - -Feature-counting ----------------------------------------------------------------- - -Suppose you have some heterogeneous data like this: - -GENRST_INCLUDE_ESCAPED(data/features.json) - -A reasonable question to ask is, how many occurrences of each field are there? And, what percentage of total row count has each of them? Since the denominator of the percentage is not known until the end, this is a two-pass algorithm: - -GENRST_INCLUDE_ESCAPED(data/feature-count.mlr) - -Then - -GENRST_RUN_COMMAND -mlr --json put -q -f data/feature-count.mlr data/features.json -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --ijson --opprint put -q -f data/feature-count.mlr data/features.json -GENRST_EOF - -Unsparsing ----------------------------------------------------------------- - -The previous section discussed how to fill out missing data fields within CSV with full header line -- so the list of all field names is present within the header line. Next, let's look at a related problem: we have data where each record has various key names but we want to produce rectangular output having the union of all key names. - -For example, suppose you have JSON input like this: - -GENRST_RUN_COMMAND -cat data/sparse.json -GENRST_EOF - -There are field names ``a``, ``b``, ``v``, ``u``, ``x``, ``w`` in the data -- but not all in every record. Since we don't know the names of all the keys until we've read them all, this needs to be a two-pass algorithm. On the first pass, remember all the unique key names and all the records; on the second pass, loop through the records filling in absent values, then producing output. Use ``put -q`` since we don't want to produce per-record output, only emitting output in the ``end`` block: - -GENRST_RUN_COMMAND -cat data/unsparsify.mlr -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --json put -q -f data/unsparsify.mlr data/sparse.json -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --ijson --ocsv put -q -f data/unsparsify.mlr data/sparse.json -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --ijson --opprint put -q -f data/unsparsify.mlr data/sparse.json -GENRST_EOF - -There is a keystroke-saving verb for this: :ref:`mlr unsparsify `. - -Mean without/with oosvars ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr --opprint stats1 -a mean -f x data/medium -GENRST_EOF - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/mean-with-oosvars.sh) - -Keyed mean without/with oosvars ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr --opprint stats1 -a mean -f x -g a,b data/medium -GENRST_EOF - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/keyed-mean-with-oosvars.sh) - -Variance and standard deviation without/with oosvars ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr --oxtab stats1 -a count,sum,mean,var,stddev -f x data/medium -GENRST_EOF - -GENRST_RUN_COMMAND -cat variance.mlr -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --oxtab put -q -f variance.mlr data/medium -GENRST_EOF - -You can also do this keyed, of course, imitating the keyed-mean example above. - -Min/max without/with oosvars ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr --oxtab stats1 -a min,max -f x data/medium -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --oxtab put -q ' - @x_min = min(@x_min, $x); - @x_max = max(@x_max, $x); - end{emitf @x_min, @x_max} -' data/medium -GENRST_EOF - -Keyed min/max without/with oosvars ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr --opprint stats1 -a min,max -f x -g a data/medium -GENRST_EOF - -GENRST_INCLUDE_AND_RUN_ESCAPED(data/keyed-min-max-with-oosvars.sh) - -Delta without/with oosvars ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr --opprint step -a delta -f x data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint put ' - $x_delta = is_present(@last) ? $x - @last : 0; - @last = $x -' data/small -GENRST_EOF - -Keyed delta without/with oosvars ----------------------------------------------------------------- - -GENRST_RUN_COMMAND -mlr --opprint step -a delta -f x -g a data/small -GENRST_EOF - -GENRST_RUN_COMMAND -mlr --opprint put ' - $x_delta = is_present(@last[$a]) ? $x - @last[$a] : 0; - @last[$a]=$x -' data/small -GENRST_EOF - -Exponentially weighted moving averages without/with oosvars ----------------------------------------------------------------- - -GENRST_INCLUDE_AND_RUN_ESCAPED(verb-example-ewma.sh) - -GENRST_INCLUDE_AND_RUN_ESCAPED(oosvar-example-ewma.sh) diff --git a/docs6/why.rst b/docs6/why.rst deleted file mode 100644 index cedeefd28..000000000 --- a/docs6/why.rst +++ /dev/null @@ -1,56 +0,0 @@ -.. - PLEASE DO NOT EDIT DIRECTLY. EDIT THE .rst.in FILE PLEASE. - -Why? -================================================================ - -Someone asked me the other day about design, tradeoffs, thought process, why I felt it necessary to build Miller, etc. Here are some answers. - -Who is Miller for? ----------------------------------------------------------------- - -For background, I'm a software engineer, with a heavy devops bent and a non-trivial amount of data-engineering in my career. **Initially I wrote Miller mainly for myself:** I'm coder-friendly (being a coder); I'm Github-friendly; most of my data are well-structured or easily structurable (TSV-formatted SQL-query output, CSV files, log files, JSON data structures); I care about interoperability between all the various formats Miller supports (I've encountered them all); I do all my work on Linux or OSX. - -But now there's this neat little tool **which seems to be useful for people in various disciplines**. I don't even know entirely *who*. I can click through Github starrers and read a bit about what they seem to do, but not everyone that uses Miller is even *on* Github (or stars things). I've gotten a lot of feature requests through Github -- but only from people who are Github users. Not everyone's a coder (it seems like a lot of Miller's Github starrers are devops folks like myself, or data-science-ish people, or biology/genomics folks.) A lot of people care 100% about CSV. And so on. - -So I wonder (please drop a note at https://github.com/johnkerl/miller/issues) does Miller do what you need? Do you use it for all sorts of things, or just one or two nice things? Are there things you wish it did but it doesn't? Is it almost there, or just nowhere near what you want? Are there not enough features or way too many? Are the docs too complicated; do you have a hard time finding out how to do what you want? Should I think differently about what this tool even *is* in the first place? Should I think differently about who it's for? - -What was Miller created to do? ----------------------------------------------------------------- - -First: there are tools like ``xsv`` which handles CSV marvelously and ``jq`` which handles JSON marvelously, and so on -- but I over the years of my career in the software industry I've found myself, and others, doing a lot of ad-hoc things which really were fundamentally the same *except* for format. So the number one thing about Miller is doing common things while supporting **multiple formats**: (a) ingest a list of records where a record is a list of key-value pairs (however represented in the input files); (b) transform that stream of records; (c) emit the transformed stream -- either in the same format as input, or in a different format. - -Second thing, a lot like the first: just as I didn't want to build something only for a single file format, I didn't want to build something only for one problem domain. In my work doing software engineering, devops, data engineering, etc. I saw a lot of commonalities and I wanted to **solve as many problems simultaneously as possible**. - -Third: it had to be **streaming**. As time goes by and we (some of us, sometimes) have machines with tens or hundreds of GB of RAM, it's maybe less important, but I'm unhappy with tools which ingest all data, then do stuff, then emit all data. One reason is to be able to handle files bigger than available RAM. Another reason is to be able to handle input which trickles in, e.g. you have some process emitting data now and then and you can pipe it to Miller and it will emit transformed records one at a time. - -Fourth: it had to be **fast**. This precludes all sorts of very nice things written in Ruby, for example. I love Ruby as a very expressive language, and I have several very useful little utility scripts written in Ruby. But a few years ago I ported over some of my old tried-and-true C programs and the lines-of-code count was a *lot* lower -- it was great! Until I ran them on multi-GB files and realized they took 60x as long to complete. So I couldn't write Miller in Ruby, or in languages like it. I was going to have to do something in a low-level language in order to make it performant. - -Fifth thing: I wanted Miller to be **pipe-friendly and interoperate with other command-line tools**. Since the basic paradigm is ingest records, transform records, emit records -- where the input and output formats can be the same or different, and the transform can be complex, or just pass-through -- this means you can use it to transform data, or re-format it, or both. So if you just want to do data-cleaning/prep/formatting and do all the "real" work in R, you can. If you just want a little glue script between other tools you can get that. And if you want to do non-trivial data-reduction in Miller you can. - -Sixth thing: Must have **comprehensive documentation and unit-test**. Since Miller handles a lot of formats and solves a lot of problems, there's a lot to test and a lot to keep working correctly as I add features or optimize. And I wanted it to be able to explain itself -- not only through web docs like the one you're reading but also through ``man mlr`` and ``mlr --help``, ``mlr sort --help``, etc. - -Seventh thing: **Must have a domain-specific language** (DSL) **but also must let you do common things without it**. All those little verbs Miller has to help you *avoid* having to write for-loops are great. I use them for keystroke-saving: ``mlr stats1 -a mean,stddev,min,max -f quantity``, for example, without you having to write for-loops or define accumulator variables. But you also have to be able to break out of that and write arbitrary code when you want to: ``mlr put '$distance = $rate * $time'`` or anything else you can think up. In Perl/AWK/etc. it's all DSL. In xsv et al. it's all verbs. In Miller I like having the combination. - -Eighth thing: It's an **awful lot of fun to write**. In my experience I didn't find any tools which do multi-format, streaming, efficient, multi-purpose, with DSL and non-DSL, so I wrote one. But I don't guarantee it's unique in the world. It fills a niche in the world (people use it) but it also fills a niche in my life. - -Tradeoffs ----------------------------------------------------------------- - -Miller is command-line-only by design. People who want a graphical user interface won't find it here. This is in part (a) accommodating my personal preferences, and in part (b) guided by my experience/belief that the command line is very expressive. Steep learning curve, yes. I consider that price worth paying. - -Another tradeoff: supporting lists of records -- each with only one depth -- keeps me supporting only what can be expressed in *all* of those formats. E.g. in JSON you can have lists of lists of lists which Miller just doesn't handle. So Miller can't (and won't) handle arbitrary JSON because it only handles tabular data which can be expressed in a variety of formats. - -A third tradeoff is doing build-from-scratch in a low-level language. It'd be quicker to write (but slower to run) if written in a high-level language. If Miller were written in Python, it would be implemented in significantly fewer lines of code than its current Go implementation. The DSL would just be an ``eval`` of Python code. And it would run slower, but maybe not enough slower to be a problem for most folks. Later I found out about the `rows `_ tool -- if you find Miller useful, you should check out ``rows`` as well. - -A fourth tradeoff is in the DSL (more visibly so in 5.0.0 but already in pre-5.0.0): how much to make it dynamically typed -- so you can just say y=x+1 with a minimum number of keystrokes -- vs. having it do a good job of telling you when you've made a typo. This is a common paradigm across *all* languages. Some like Ruby you don't declare anything and they're quick to code little stuff in but programs of even a few thousand lines (which isn't large in the software world) become insanely unmanageable. Then Java at the other extreme which is very typesafe but you have to type in a lot of punctuation, angle brackets, datatypes, repetition, etc. just to be able to get anything done. And some in the middle like Go which are typesafe but with type inference which aim to do the best of both. In the Miller (5.0.0) DSL you get ``y=x+1`` by default but you can have things like ``int y = x+1`` etc. so the typesafety is opt-in. See also :ref:`reference-dsl-type-checking` for more information on type-checking. - -Related tools ----------------------------------------------------------------- - -Here's a comprehensive list: https://github.com/dbohdan/structured-text-tools. It doesn't mention `rows `_ so here's a plug for that as well. - -Moving forward ----------------------------------------------------------------- - -I originally aimed Miller at people who already know what ``sed``/``awk``/``cut``/``sort``/``join`` are and wanted some options. But as time goes by I realize that tools like this can be useful to folks who *don't* know what those things are; people who aren't primarily coders; people who are scientists, or data scientists. These days some journalists do data analysis. So moving forward in terms of docs, I am working on having more cookbook, follow-by-example stuff in addition to the existing language-reference kinds of stuff. And continuing to seek out input from people who use Miller on where to go next. diff --git a/docs6/why.rst.in b/docs6/why.rst.in deleted file mode 100644 index 5b69d357f..000000000 --- a/docs6/why.rst.in +++ /dev/null @@ -1,53 +0,0 @@ -Why? -================================================================ - -Someone asked me the other day about design, tradeoffs, thought process, why I felt it necessary to build Miller, etc. Here are some answers. - -Who is Miller for? ----------------------------------------------------------------- - -For background, I'm a software engineer, with a heavy devops bent and a non-trivial amount of data-engineering in my career. **Initially I wrote Miller mainly for myself:** I'm coder-friendly (being a coder); I'm Github-friendly; most of my data are well-structured or easily structurable (TSV-formatted SQL-query output, CSV files, log files, JSON data structures); I care about interoperability between all the various formats Miller supports (I've encountered them all); I do all my work on Linux or OSX. - -But now there's this neat little tool **which seems to be useful for people in various disciplines**. I don't even know entirely *who*. I can click through Github starrers and read a bit about what they seem to do, but not everyone that uses Miller is even *on* Github (or stars things). I've gotten a lot of feature requests through Github -- but only from people who are Github users. Not everyone's a coder (it seems like a lot of Miller's Github starrers are devops folks like myself, or data-science-ish people, or biology/genomics folks.) A lot of people care 100% about CSV. And so on. - -So I wonder (please drop a note at https://github.com/johnkerl/miller/issues) does Miller do what you need? Do you use it for all sorts of things, or just one or two nice things? Are there things you wish it did but it doesn't? Is it almost there, or just nowhere near what you want? Are there not enough features or way too many? Are the docs too complicated; do you have a hard time finding out how to do what you want? Should I think differently about what this tool even *is* in the first place? Should I think differently about who it's for? - -What was Miller created to do? ----------------------------------------------------------------- - -First: there are tools like ``xsv`` which handles CSV marvelously and ``jq`` which handles JSON marvelously, and so on -- but I over the years of my career in the software industry I've found myself, and others, doing a lot of ad-hoc things which really were fundamentally the same *except* for format. So the number one thing about Miller is doing common things while supporting **multiple formats**: (a) ingest a list of records where a record is a list of key-value pairs (however represented in the input files); (b) transform that stream of records; (c) emit the transformed stream -- either in the same format as input, or in a different format. - -Second thing, a lot like the first: just as I didn't want to build something only for a single file format, I didn't want to build something only for one problem domain. In my work doing software engineering, devops, data engineering, etc. I saw a lot of commonalities and I wanted to **solve as many problems simultaneously as possible**. - -Third: it had to be **streaming**. As time goes by and we (some of us, sometimes) have machines with tens or hundreds of GB of RAM, it's maybe less important, but I'm unhappy with tools which ingest all data, then do stuff, then emit all data. One reason is to be able to handle files bigger than available RAM. Another reason is to be able to handle input which trickles in, e.g. you have some process emitting data now and then and you can pipe it to Miller and it will emit transformed records one at a time. - -Fourth: it had to be **fast**. This precludes all sorts of very nice things written in Ruby, for example. I love Ruby as a very expressive language, and I have several very useful little utility scripts written in Ruby. But a few years ago I ported over some of my old tried-and-true C programs and the lines-of-code count was a *lot* lower -- it was great! Until I ran them on multi-GB files and realized they took 60x as long to complete. So I couldn't write Miller in Ruby, or in languages like it. I was going to have to do something in a low-level language in order to make it performant. - -Fifth thing: I wanted Miller to be **pipe-friendly and interoperate with other command-line tools**. Since the basic paradigm is ingest records, transform records, emit records -- where the input and output formats can be the same or different, and the transform can be complex, or just pass-through -- this means you can use it to transform data, or re-format it, or both. So if you just want to do data-cleaning/prep/formatting and do all the "real" work in R, you can. If you just want a little glue script between other tools you can get that. And if you want to do non-trivial data-reduction in Miller you can. - -Sixth thing: Must have **comprehensive documentation and unit-test**. Since Miller handles a lot of formats and solves a lot of problems, there's a lot to test and a lot to keep working correctly as I add features or optimize. And I wanted it to be able to explain itself -- not only through web docs like the one you're reading but also through ``man mlr`` and ``mlr --help``, ``mlr sort --help``, etc. - -Seventh thing: **Must have a domain-specific language** (DSL) **but also must let you do common things without it**. All those little verbs Miller has to help you *avoid* having to write for-loops are great. I use them for keystroke-saving: ``mlr stats1 -a mean,stddev,min,max -f quantity``, for example, without you having to write for-loops or define accumulator variables. But you also have to be able to break out of that and write arbitrary code when you want to: ``mlr put '$distance = $rate * $time'`` or anything else you can think up. In Perl/AWK/etc. it's all DSL. In xsv et al. it's all verbs. In Miller I like having the combination. - -Eighth thing: It's an **awful lot of fun to write**. In my experience I didn't find any tools which do multi-format, streaming, efficient, multi-purpose, with DSL and non-DSL, so I wrote one. But I don't guarantee it's unique in the world. It fills a niche in the world (people use it) but it also fills a niche in my life. - -Tradeoffs ----------------------------------------------------------------- - -Miller is command-line-only by design. People who want a graphical user interface won't find it here. This is in part (a) accommodating my personal preferences, and in part (b) guided by my experience/belief that the command line is very expressive. Steep learning curve, yes. I consider that price worth paying. - -Another tradeoff: supporting lists of records -- each with only one depth -- keeps me supporting only what can be expressed in *all* of those formats. E.g. in JSON you can have lists of lists of lists which Miller just doesn't handle. So Miller can't (and won't) handle arbitrary JSON because it only handles tabular data which can be expressed in a variety of formats. - -A third tradeoff is doing build-from-scratch in a low-level language. It'd be quicker to write (but slower to run) if written in a high-level language. If Miller were written in Python, it would be implemented in significantly fewer lines of code than its current Go implementation. The DSL would just be an ``eval`` of Python code. And it would run slower, but maybe not enough slower to be a problem for most folks. Later I found out about the `rows `_ tool -- if you find Miller useful, you should check out ``rows`` as well. - -A fourth tradeoff is in the DSL (more visibly so in 5.0.0 but already in pre-5.0.0): how much to make it dynamically typed -- so you can just say y=x+1 with a minimum number of keystrokes -- vs. having it do a good job of telling you when you've made a typo. This is a common paradigm across *all* languages. Some like Ruby you don't declare anything and they're quick to code little stuff in but programs of even a few thousand lines (which isn't large in the software world) become insanely unmanageable. Then Java at the other extreme which is very typesafe but you have to type in a lot of punctuation, angle brackets, datatypes, repetition, etc. just to be able to get anything done. And some in the middle like Go which are typesafe but with type inference which aim to do the best of both. In the Miller (5.0.0) DSL you get ``y=x+1`` by default but you can have things like ``int y = x+1`` etc. so the typesafety is opt-in. See also :ref:`reference-dsl-type-checking` for more information on type-checking. - -Related tools ----------------------------------------------------------------- - -Here's a comprehensive list: https://github.com/dbohdan/structured-text-tools. It doesn't mention `rows `_ so here's a plug for that as well. - -Moving forward ----------------------------------------------------------------- - -I originally aimed Miller at people who already know what ``sed``/``awk``/``cut``/``sort``/``join`` are and wanted some options. But as time goes by I realize that tools like this can be useful to folks who *don't* know what those things are; people who aren't primarily coders; people who are scientists, or data scientists. These days some journalists do data analysis. So moving forward in terms of docs, I am working on having more cookbook, follow-by-example stuff in addition to the existing language-reference kinds of stuff. And continuing to seek out input from people who use Miller on where to go next. diff --git a/docs6b/README.md b/docs6b/README.md deleted file mode 100644 index e7c748407..000000000 --- a/docs6b/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# Miller docs - -## Why use Mkdocs - -* Connects to https://miller.readthedocs.io so people can get their docmods onto the web instead of the self-hosted https://johnkerl.org/miller/doc. Thanks to @pabloab for the great advice! -* More standard look and feel -- lots of people use readthedocs for other things so this should feel familiar. -* We get a Search feature for free. -* Mkdocs vs Sphinx: these are similar tools, but I find that I more easily get better desktop+mobile formatting using Mkdocs. - -## Contributing - -* You need `pip install mkdocs` (or `pip3 install mkdocs`). -* The docs include lots of live code examples which will be invoked using `mlr` which must be somewhere in your `$PATH`. -* Clone https://github.com/johnkerl/miller and cd into `docs/` within your clone. -* Quick-editing loop: - * In one terminal, cd to this directory and leave `mkdocs serve` running. - * In another terminal, cd to the `docs` subdirectory and edit `*.md.in`. - * In your browser, visit http://127.0.0.1:8000 -* Alternate editing loop: - * Leave one terminal open as a place you will run `mkdocs build` - * In one terminal, cd to the `docs` subdirectory and edit `*.md.in`. - * In the first terminal, run `mkdocs build` which will populate the `site` directory. - * In your browser, visit `file:///your/path/to/miller/docs/site/index.html` - * Link-checking: - * `sudo pip3 install git+https://github.com/linkchecker/linkchecker.git` - * `cd site` and `linkchecker .` -* Submitting: - * `git add` your modified files, `git commit`, `git push`, and submit a PR at https://github.com/johnkerl/miller. - -## Notes - -* CSS: - * I used the Mkdocs Readthedocs theme which I like a lot. I customized `docs/extra.css` for Miller coloring/branding. -* Live code: - * I didn't find a way to include non-Python live-code examples within Mkdocs so I adapted the pre-Mkdocs Miller-doc strategy which is to have a generator script read a template file (here, `foo.md.in`), run the marked lines, and generate the output file (`foo.md`). This is `genmds`. - * Edit the `*.md.in` files, not `*.md` directly. - * Within the `*.md.in` files are lines like `GENMD_RUN_COMMAND`. These will be run, and their output included, by `genmds` which calls the `genmds` script for you. -* readthedocs: - * https://readthedocs.org/ - * https://readthedocs.org/projects/miller/ - * https://readthedocs.org/projects/miller/builds/ - * https://miller.readthedocs.io/en/latest/ diff --git a/docs6b/docs/_build/html/10-1.sh b/docs6b/docs/_build/html/10-1.sh deleted file mode 100644 index 749a161c7..000000000 --- a/docs6b/docs/_build/html/10-1.sh +++ /dev/null @@ -1,2 +0,0 @@ -grep op=cache log.txt \ - | mlr --idkvp --opprint stats1 -a mean -f hit -g type then sort -f type diff --git a/docs6b/docs/_build/html/10-2.sh b/docs6b/docs/_build/html/10-2.sh deleted file mode 100644 index b7f6cd779..000000000 --- a/docs6b/docs/_build/html/10-2.sh +++ /dev/null @@ -1,4 +0,0 @@ -mlr --from log.txt --opprint \ - filter 'is_present($batch_size)' \ - then step -a delta -f time,num_filtered \ - then sec2gmt time diff --git a/docs6b/docs/_build/html/data/begin-end-example-1.sh b/docs6b/docs/_build/html/data/begin-end-example-1.sh deleted file mode 100644 index f66beaa7e..000000000 --- a/docs6b/docs/_build/html/data/begin-end-example-1.sh +++ /dev/null @@ -1,5 +0,0 @@ -mlr put ' - begin { @sum = 0 }; - @x_sum += $x; - end { emit @x_sum } -' ../data/small diff --git a/docs6b/docs/_build/html/data/begin-end-example-2.sh b/docs6b/docs/_build/html/data/begin-end-example-2.sh deleted file mode 100644 index 55ad689f6..000000000 --- a/docs6b/docs/_build/html/data/begin-end-example-2.sh +++ /dev/null @@ -1,4 +0,0 @@ -mlr put ' - @x_sum += $x; - end { emit @x_sum } -' ../data/small diff --git a/docs6b/docs/_build/html/data/begin-end-example-3.sh b/docs6b/docs/_build/html/data/begin-end-example-3.sh deleted file mode 100644 index d88dbe3c7..000000000 --- a/docs6b/docs/_build/html/data/begin-end-example-3.sh +++ /dev/null @@ -1,4 +0,0 @@ -mlr put -q ' - @x_sum += $x; - end { emit @x_sum } -' ../data/small diff --git a/docs6b/docs/_build/html/data/begin-end-example-4.sh b/docs6b/docs/_build/html/data/begin-end-example-4.sh deleted file mode 100644 index 5ac1c112b..000000000 --- a/docs6b/docs/_build/html/data/begin-end-example-4.sh +++ /dev/null @@ -1,8 +0,0 @@ -mlr put -q ' - @x_count += 1; - @x_sum += $x; - end { - emit @x_count; - emit @x_sum; - } -' ../data/small diff --git a/docs6b/docs/_build/html/data/begin-end-example-5.sh b/docs6b/docs/_build/html/data/begin-end-example-5.sh deleted file mode 100644 index dbd2efed1..000000000 --- a/docs6b/docs/_build/html/data/begin-end-example-5.sh +++ /dev/null @@ -1 +0,0 @@ -mlr stats1 -a count,sum -f x ../data/small diff --git a/docs6b/docs/_build/html/data/begin-end-example-6.sh b/docs6b/docs/_build/html/data/begin-end-example-6.sh deleted file mode 100644 index 7f9bbb6d1..000000000 --- a/docs6b/docs/_build/html/data/begin-end-example-6.sh +++ /dev/null @@ -1,8 +0,0 @@ -mlr put -q ' - @x_count[$a] += 1; - @x_sum[$a] += $x; - end { - emit @x_count, "a"; - emit @x_sum, "a"; - } -' ../data/small diff --git a/docs6b/docs/_build/html/data/begin-end-example-7.sh b/docs6b/docs/_build/html/data/begin-end-example-7.sh deleted file mode 100644 index 5c0101659..000000000 --- a/docs6b/docs/_build/html/data/begin-end-example-7.sh +++ /dev/null @@ -1 +0,0 @@ -mlr stats1 -a count,sum -f x -g a ../data/small diff --git a/docs6b/docs/_build/html/data/sar.mlr b/docs6b/docs/_build/html/data/sar.mlr deleted file mode 100644 index 4b5d8ead3..000000000 --- a/docs6b/docs/_build/html/data/sar.mlr +++ /dev/null @@ -1,3 +0,0 @@ - for (k in $*) { - $[k] = gsub($[k], "e", "X"); - } diff --git a/docs6b/docs/_build/html/expo-sample.sh b/docs6b/docs/_build/html/expo-sample.sh deleted file mode 100644 index 1e9865fee..000000000 --- a/docs6b/docs/_build/html/expo-sample.sh +++ /dev/null @@ -1,27 +0,0 @@ -# Generate 100,000 pairs of independent and identically distributed -# exponentially distributed random variables with the same rate parameter -# (namely, 2.5). Then compute histograms of one of them, along with -# histograms for their sum and their product. -# -# See also https://en.wikipedia.org/wiki/Exponential_distribution -# -# Here I'm using a specified random-number seed so this example always -# produces the same output for this web document: in everyday practice we -# wouldn't do that. - -mlr -n \ - --seed 0 \ - --opprint \ - seqgen --stop 100000 \ - then put ' - # https://en.wikipedia.org/wiki/Inverse_transform_sampling - func expo_sample(lambda) { - return -log(1-urand())/lambda - } - $u = expo_sample(2.5); - $v = expo_sample(2.5); - $s = $u + $v; - $p = $u * $v; - ' \ - then histogram -f u,s,p --lo 0 --hi 2 --nbins 50 \ - then bar -f u_count,s_count,p_count --auto -w 20 diff --git a/docs6b/docs/_static/basic.css b/docs6b/docs/_static/basic.css deleted file mode 100644 index a19fd46c5..000000000 --- a/docs6b/docs/_static/basic.css +++ /dev/null @@ -1,861 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -div.section::after { - display: block; - content: ''; - clear: left; -} - -/* -- relbar ---------------------------------------------------------------- */ - -div.related { - width: 100%; - font-size: 90%; -} - -div.related h3 { - display: none; -} - -div.related ul { - margin: 0; - padding: 0 0 0 10px; - list-style: none; -} - -div.related li { - display: inline; -} - -/* CHANGE ME */ -div.body li { - margin:10px 0 0 0; -} - -div.related li.right { - float: right; - margin-right: 5px; -} - -/* -- sidebar --------------------------------------------------------------- */ - -div.sphinxsidebarwrapper { - padding: 10px 5px 0 10px; -} - -div.sphinxsidebar { - float: left; - width: 230px; - margin-left: -100%; - font-size: 90%; - word-wrap: break-word; - overflow-wrap : break-word; -} - -div.sphinxsidebar ul { - list-style: none; -} - -div.sphinxsidebar ul ul, -div.sphinxsidebar ul.want-points { - margin-left: 20px; - list-style: square; -} - -div.sphinxsidebar ul ul { - margin-top: 0; - margin-bottom: 0; -} - -div.sphinxsidebar form { - margin-top: 10px; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - -div.sphinxsidebar #searchbox form.search { - overflow: hidden; -} - -div.sphinxsidebar #searchbox input[type="text"] { - float: left; - width: 80%; - padding: 0.25em; - box-sizing: border-box; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - float: left; - width: 20%; - border-left: none; - padding: 0.25em; - box-sizing: border-box; -} - - -img { - border: 0; - max-width: 100%; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin: 10px 0 0 20px; - padding: 0; -} - -ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li div.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; - margin-left: auto; - margin-right: auto; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable { - width: 100%; -} - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable ul { - margin-top: 0; - margin-bottom: 0; - list-style-type: none; -} - -table.indextable > tbody > tr > td > ul { - padding-left: 0em; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -div.genindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -/* -- domain module index --------------------------------------------------- */ - -table.modindextable td { - padding: 2px; - border-collapse: collapse; -} - -/* -- general body styles --------------------------------------------------- */ - -div.body { - min-width: 450px; - max-width: 800px; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - -moz-hyphens: auto; - -ms-hyphens: auto; - -webkit-hyphens: auto; - hyphens: auto; -} - -a.headerlink { - visibility: hidden; -} - -a.brackets:before, -span.brackets > a:before{ - content: "["; -} - -a.brackets:after, -span.brackets > a:after { - content: "]"; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink, -caption:hover > a.headerlink, -p.caption:hover > a.headerlink, -div.code-block-caption:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -img.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -img.align-default, .figure.align-default { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-default { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px; - background-color: #ffe; - width: 40%; - float: right; - clear: right; - overflow-x: auto; -} - -p.sidebar-title { - font-weight: bold; -} - -div.admonition, div.topic, blockquote { - clear: left; -} - -/* -- topics ---------------------------------------------------------------- */ - -div.topic { - border: 1px solid #ccc; - padding: 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- content of sidebars/topics/admonitions -------------------------------- */ - -div.sidebar > :last-child, -div.topic > :last-child, -div.admonition > :last-child { - margin-bottom: 0; -} - -div.sidebar::after, -div.topic::after, -div.admonition::after, -blockquote::after { - display: block; - content: ''; - clear: both; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - margin-top: 10px; - margin-bottom: 10px; - border: 0; - border-collapse: collapse; -} - -table.align-center { - margin-left: auto; - margin-right: auto; -} - -table.align-default { - margin-left: auto; - margin-right: auto; -} - -table caption span.caption-number { - font-style: italic; -} - -table caption span.caption-text { -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -table.footnote td, table.footnote th { - border: 0 !important; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -th > :first-child, -td > :first-child { - margin-top: 0px; -} - -th > :last-child, -td > :last-child { - margin-bottom: 0px; -} - -/* -- figures --------------------------------------------------------------- */ - -div.figure { - margin: 0.5em; - padding: 0.5em; -} - -div.figure p.caption { - padding: 0.3em; -} - -div.figure p.caption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text { -} - -/* -- field list styles ----------------------------------------------------- */ - -table.field-list td, table.field-list th { - border: 0 !important; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -/* -- hlist styles ---------------------------------------------------------- */ - -table.hlist { - margin: 1em 0; -} - -table.hlist td { - vertical-align: top; -} - - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - list-style: decimal; -} - -ol.loweralpha { - list-style: lower-alpha; -} - -ol.upperalpha { - list-style: upper-alpha; -} - -ol.lowerroman { - list-style: lower-roman; -} - -ol.upperroman { - list-style: upper-roman; -} - -:not(li) > ol > li:first-child > :first-child, -:not(li) > ul > li:first-child > :first-child { - margin-top: 0px; -} - -:not(li) > ol > li:last-child > :last-child, -:not(li) > ul > li:last-child > :last-child { - margin-bottom: 0px; -} - -ol.simple ol p, -ol.simple ul p, -ul.simple ol p, -ul.simple ul p { - margin-top: 0; -} - -ol.simple > li:not(:first-child) > p, -ul.simple > li:not(:first-child) > p { - margin-top: 0; -} - -ol.simple p, -ul.simple p { - margin-bottom: 0; -} - -dl.footnote > dt, -dl.citation > dt { - float: left; - margin-right: 0.5em; -} - -dl.footnote > dd, -dl.citation > dd { - margin-bottom: 0em; -} - -dl.footnote > dd:after, -dl.citation > dd:after { - content: ""; - clear: both; -} - -dl.field-list { - display: grid; - grid-template-columns: fit-content(30%) auto; -} - -dl.field-list > dt { - font-weight: bold; - word-break: break-word; - padding-left: 0.5em; - padding-right: 5px; -} - -dl.field-list > dt:after { - content: ":"; -} - -dl.field-list > dd { - padding-left: 0.5em; - margin-top: 0em; - margin-left: 0em; - margin-bottom: 0em; -} - -dl { - margin-bottom: 15px; -} - -dd > :first-child { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -dl > dd:last-child, -dl > dd:last-child > :last-child { - margin-bottom: 0; -} - -dt:target, span.highlighted { - background-color: #0be54e; -} - -rect.highlighted { - fill: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.guilabel, .menuselection { - font-family: sans-serif; -} - -.accelerator { - text-decoration: underline; -} - -.classifier { - font-style: oblique; -} - -.classifier:before { - font-style: normal; - margin: 0.5em; - content: ":"; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -pre, div[class*="highlight-"] { - clear: both; -} - -span.pre { - -moz-hyphens: none; - -ms-hyphens: none; - -webkit-hyphens: none; - hyphens: none; -} - -div[class*="highlight-"] { - margin: 1em 0; -} - -td.linenos pre { - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - display: block; -} - -table.highlighttable tbody { - display: block; -} - -table.highlighttable tr { - display: flex; -} - -table.highlighttable td { - margin: 0; - padding: 0; -} - -table.highlighttable td.linenos { - padding-right: 0.5em; -} - -table.highlighttable td.code { - flex: 1; - overflow: hidden; -} - -.highlight .hll { - display: block; - font-style: bold; /* CHANGED */ -} - -div.highlight pre, -table.highlighttable pre { - margin: 0; -} - -div.code-block-caption + div { - margin-top: 0; -} - -div.code-block-caption { - margin-top: 1em; - padding: 2px 5px; - font-size: small; -} - -div.code-block-caption code { - background-color: transparent; -} - -table.highlighttable td.linenos, -div.doctest > div.highlight span.gp { /* gp: Generic.Prompt */ - user-select: none; -} - -div.code-block-caption span.caption-number { - padding: 0.1em 0.3em; - font-style: italic; -} - -div.code-block-caption span.caption-text { -} - -div.literal-block-wrapper { - margin: 1em 0; -} - -code.descname { - background-color: transparent; - font-weight: bold; - font-size: 1.2em; -} - -code.descclassname { - background-color: transparent; -} - -code.xref, a code { - background-color: transparent; - font-weight: bold; -} - -h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { - background-color: transparent; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: sans-serif; -} - -div.viewcode-block:target { - margin: -1px -10px; - padding: 0 10px; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -span.eqno a.headerlink { - position: absolute; - z-index: 1; -} - -div.math:hover a.headerlink { - visibility: visible; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} diff --git a/docs6b/docs/_static/classic.css b/docs6b/docs/_static/classic.css deleted file mode 100644 index c18792d87..000000000 --- a/docs6b/docs/_static/classic.css +++ /dev/null @@ -1,271 +0,0 @@ -/* - * classic.css_t - * ~~~~~~~~~~~~~ - * - * Sphinx stylesheet -- classic theme. - * - * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -@import url("basic.css"); - -/* -- page layout ----------------------------------------------------------- */ - -html { - /* CSS hack for macOS's scrollbar (see #1125) */ - background-color: #FFFFFF; -} - -body { - font-family: sans-serif; - font-size: 100%; - background-color: #808080; - color: #000; - margin: 0; - padding: 0; -} - -div.document { - /* CHANGE ME */ - background-color: #c0c0c0; -} - -div.documentwrapper { - float: left; - width: 100%; -} - -div.bodywrapper { - margin: 0 0 0 230px; -} - -div.body { - background-color: #ffffff; - color: #000000; - padding: 0 20px 30px 20px; -} - -div.footer { - color: #ffffff; - width: 100%; - padding: 9px 0 9px 0; - text-align: center; - font-size: 75%; -} - -div.footer a { - color: #ffffff; - text-decoration: underline; -} - -div.related { - /* CHANGE ME */ - background-color: #808080; - line-height: 30px; - color: #000000; -} - -div.related a { - /* CHANGE ME */ - color: #000000; -} - -div.sphinxsidebar { -} - -div.sphinxsidebar h3 { - font-family: 'Trebuchet MS', sans-serif; - color: #000000; - font-size: 1.4em; - font-weight: normal; - margin: 0; - padding: 0; -} - -div.sphinxsidebar h3 a { - color: #000000; -} - -div.sphinxsidebar h4 { - font-family: 'Trebuchet MS', sans-serif; - color: #000000; - font-size: 1.3em; - font-weight: normal; - margin: 5px 0 0 0; - padding: 0; -} - -div.sphinxsidebar p { - color: #000000; -} - -div.sphinxsidebar p.topless { - margin: 5px 10px 10px 10px; -} - -div.sphinxsidebar ul { - margin: 10px; - padding: 0; - color: #ffffff; -} - -div.sphinxsidebar a { - /* CHANGE ME */ - color: #404040; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - - - -/* -- hyperlink styles ------------------------------------------------------ */ - -a { - color: #800000; - text-decoration: none; -} - -a:visited { - color: #800000; - text-decoration: none; -} - -a:hover { - text-decoration: underline; -} - - - -/* -- body styles ----------------------------------------------------------- */ - -div.body h1, -div.body h2, -div.body h3, -div.body h4, -div.body h5, -div.body h6 { - font-family: 'Trebuchet MS', sans-serif; - background-color: #f2f2f2; - font-weight: normal; - /* CHANGE ME */ - color: #800000; - border-bottom: 1px solid #ccc; - margin: 20px -20px 10px -20px; - padding: 3px 0 3px 10px; -} - -div.body h1 { margin-top: 0; font-size: 200%; } -div.body h2 { font-size: 160%; } -div.body h3 { font-size: 140%; } -div.body h4 { font-size: 120%; } -div.body h5 { font-size: 110%; } -div.body h6 { font-size: 100%; } - -a.headerlink { - color: #c60f0f; - font-size: 0.8em; - padding: 0 4px 0 4px; - text-decoration: none; -} - -a.headerlink:hover { - background-color: #c60f0f; - color: white; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - text-align: justify; - line-height: 130%; -} - -div.admonition p.admonition-title + p { - display: inline; -} - -div.admonition p { - margin-bottom: 5px; -} - -div.admonition pre { - margin-bottom: 5px; -} - -div.admonition ul, div.admonition ol { - margin-bottom: 5px; -} - -div.note { - background-color: #eee; - border: 1px solid #ccc; -} - -div.seealso { - background-color: #ffc; - border: 1px solid #ff6; -} - -div.topic { - background-color: #eee; -} - -div.warning { - background-color: #ffe4e4; - border: 1px solid #f66; -} - -p.admonition-title { - display: inline; -} - -p.admonition-title:after { - content: ":"; -} - -pre { - padding: 5px; - background-color: unset; - color: unset; - line-height: 120%; - border: 1px solid #ac9; - border-left: none; - border-right: none; -} - -code { - background-color: #ecf0f3; - padding: 0 1px 0 1px; - font-size: 0.95em; -} - -th, dl.field-list > dt { - background-color: #ede; -} - -.warning code { - background: #efc2c2; -} - -.note code { - background: #d6d6d6; -} - -.viewcode-back { - font-family: sans-serif; -} - -div.viewcode-block:target { - background-color: #f4debf; - border-top: 1px solid #ac9; - border-bottom: 1px solid #ac9; -} - -div.code-block-caption { - color: #efefef; - background-color: #1c4e63; -} diff --git a/docs6b/docs/_static/mlr.jpg b/docs6b/docs/_static/mlr.jpg deleted file mode 100644 index f7b6f97563866f80cf4589a1dfaafa70c4ef7b0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12800 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 diff --git a/docs6b/docs/_static/pygments.css b/docs6b/docs/_static/pygments.css deleted file mode 100644 index b45d40de9..000000000 --- a/docs6b/docs/_static/pygments.css +++ /dev/null @@ -1,76 +0,0 @@ -pre { line-height: 125%; margin: 0; } -td.linenos pre { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; } -span.linenos { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; } -td.linenos pre.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; } -span.linenos.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; } -.highlight .hll { background-color: #c5b690; font-weight: bold; } /* CHANGED */ -/*.highlight { background: #eeffcc; }*/ -/* CHANGE ME */ -.highlight { background-color: #eae2cb; } -.highlight .c { color: #408090; font-style: italic } /* Comment */ -.highlight .err { border: 1px solid #FF0000 } /* Error */ -.highlight .k { color: #007020; font-weight: bold } /* Keyword */ -.highlight .o { color: #666666 } /* Operator */ -.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */ -.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ -.highlight .cp { color: #007020 } /* Comment.Preproc */ -.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */ -.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ -.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ -.highlight .gd { color: #A00000 } /* Generic.Deleted */ -.highlight .ge { font-style: italic } /* Generic.Emph */ -.highlight .gr { color: #FF0000 } /* Generic.Error */ -.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ -.highlight .gi { color: #00A000 } /* Generic.Inserted */ -.highlight .go { color: #333333 } /* Generic.Output */ -.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ -.highlight .gs { font-weight: bold } /* Generic.Strong */ -.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ -.highlight .gt { color: #0044DD } /* Generic.Traceback */ -.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ -.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ -.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ -.highlight .kp { color: #007020 } /* Keyword.Pseudo */ -.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ -.highlight .kt { color: #902000 } /* Keyword.Type */ -.highlight .m { color: #208050 } /* Literal.Number */ -.highlight .s { color: #4070a0 } /* Literal.String */ -.highlight .na { color: #4070a0 } /* Name.Attribute */ -.highlight .nb { color: #007020 } /* Name.Builtin */ -.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ -.highlight .no { color: #60add5 } /* Name.Constant */ -.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ -.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ -.highlight .ne { color: #007020 } /* Name.Exception */ -.highlight .nf { color: #06287e } /* Name.Function */ -.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ -.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ -.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ -.highlight .nv { color: #bb60d5 } /* Name.Variable */ -.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ -.highlight .w { color: #bbbbbb } /* Text.Whitespace */ -.highlight .mb { color: #208050 } /* Literal.Number.Bin */ -.highlight .mf { color: #208050 } /* Literal.Number.Float */ -.highlight .mh { color: #208050 } /* Literal.Number.Hex */ -.highlight .mi { color: #208050 } /* Literal.Number.Integer */ -.highlight .mo { color: #208050 } /* Literal.Number.Oct */ -.highlight .sa { color: #4070a0 } /* Literal.String.Affix */ -.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ -.highlight .sc { color: #4070a0 } /* Literal.String.Char */ -.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */ -.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ -.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ -.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ -.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ -.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ -.highlight .sx { color: #c65d09 } /* Literal.String.Other */ -.highlight .sr { color: #235388 } /* Literal.String.Regex */ -.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ -.highlight .ss { color: #517918 } /* Literal.String.Symbol */ -.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ -.highlight .fm { color: #06287e } /* Name.Function.Magic */ -.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ -.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ -.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ -.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */ -.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ diff --git a/docs6b/docs/_static/scrolls.css b/docs6b/docs/_static/scrolls.css deleted file mode 100644 index cdca3d37c..000000000 --- a/docs6b/docs/_static/scrolls.css +++ /dev/null @@ -1,524 +0,0 @@ -/* - * scrolls.css_t - * ~~~~~~~~~~~~~ - * - * Sphinx stylesheet -- scrolls theme. - * - * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -body { - /* background-color: #222; */ - background-color: #c0c0c0; /* CHANGED */ - margin: 0; - padding: 0; - /* font-family: 'Georgia', serif; */ - font-family: 'Trebuchet MS', sans-serif; /* CHANGED */ - font-size: 15px; - color: #eee; -} - -div.footer { - border-top: 1px solid #111; - padding: 8px; - font-size: 11px; - text-align: center; - letter-spacing: 0.5px; -} - -div.footer a { - color: #eee; -} - -div.header { - margin: 0 -15px 0 -15px; - background: url(headerbg.png) repeat-x; - border-top: 6px solid #1752b4; -} - -div.relnav { - border-bottom: 1px solid #111; - background: url(navigation.png); - margin: 0 -15px 0 -15px; - padding: 2px 20px 0 28px; - line-height: 25px; - color: #aaa; - font-size: 12px; - text-align: center; -} - -div.relnav a { - color: #eee; - font-weight: bold; - text-decoration: none; -} - -div.relnav a:hover { - text-decoration: underline; -} - -#content { - background-color: white; - color: #111; - border-bottom: 1px solid black; - background-color: #e0e0e0; - padding: 0 15px 0 15px; - margin: 0; -} - -h1 { - margin: 0; - padding: 15px 0 0 0; - color: #800000; /* CHANGED */ - background-color: #e0e0e0; /* CHANGED */ -} - -h1.heading { - margin: 0; - padding: 0; - height: 80px; -} - -h1.heading:hover { - background: #222; -} - -h1.heading a { - background: url(top.png) no-repeat center 0; - background-color: #808080; - display: block; - width: 100%; - height: 80px; -} - -h1.heading a:focus { - -moz-outline: none; - outline: none; -} - -h1.heading span { - display: none; -} - -#contentwrapper { - min-width: 0; - max-width: 680px; - padding: 0 18px 20px 18px; - margin: 0 auto 0 auto; - border-right: 1px solid #eee; - border-left: 1px solid #eee; - background: url(watermark_blur.png) center -114px; -} - -#contentwrapper h2, -#contentwrapper h2 a { - /* color: #222; */ - color: #800000; /* CHANGED */ - background-color: #e0e0e0; /* CHANGED */ - font-size: 24px; - margin: 20px 0 0 0; -} - -#contentwrapper h3, -#contentwrapper h3 a { - /* color: #0d306b; */ - color: #800000; /* CHANGED */ - background-color: #e0e0e0; /* CHANGED */ - font-size: 20px; - margin: 20px 0 0 0; -} - -table.docutils { - border-collapse: collapse; - border: 2px solid #aaa; - margin: 0.5em 1.5em 0.5em 1.5em; -} - -table.docutils td { - padding: 2px; - border: 1px solid #ddd; -} - -p, li, dd, dt, blockquote { - color: #333; -} - -blockquote { - margin: 10px 0 10px 20px; -} - -p { - line-height: 20px; - margin-bottom: 10px; - margin-top: 10px; -} - -hr { - border-top: 1px solid #ccc; - border-bottom: 0; - border-right: 0; - border-left: 0; - margin-bottom: 10px; - margin-top: 20px; -} - -dl { - margin-left: 10px; -} - -li, dt { - margin-top: 5px; -} - -dt { - font-weight: bold; - color: #000; -} - -dd { - margin-top: 10px; - line-height: 20px; -} - -th { - text-align: left; - padding: 3px; - background-color: #f2f2f2; -} - -a { - /* color: #1752b4; */ - color: #800000; /* CHANGED */ -} - -a:hover { - color: #444; -} - -pre { - /* background-image: url(metal.png); CHANGED -- REMOVED */ - /* border-top: 1px solid #ccc; CHANGED -- REMOVED */ - /* border-bottom: 1px solid #ccc; CHANGED -- REMOVED */ - padding: 5px; - font-size: 13px; - font-family: 'Bitstream Vera Sans Mono', 'Monaco', monospace; -} - -code { - font-size: 13px; - font-family: 'Bitstream Vera Sans Mono', 'Monaco', monospace; - color: black; - padding: 1px 2px 1px 2px; - /* background-color: #e9e2cd; */ /* CHANGE */ - /* background-color: #c3b694; */ - background-color: #e8e8e8; - border-bottom: 1px solid #eee; -} - -div.code-block-caption { - color: #efefef; - background-color: #888; -} - -div.code-block-caption span.caption-number { - padding: 0.1em 0.3em; - font-style: italic; -} - -div.code-block-caption span.caption-text { -} - -div.literal-block-wrapper { - padding: 1em 1em 0; -} - -div.literal-block-wrapper pre { - margin: 0; -} - -a.reference:hover code { - border-bottom-color: #aaa; -} - -cite { - /* abusing , it's generated by ReST for `x` */ - font-size: 13px; - font-family: 'Bitstream Vera Sans Mono', 'Monaco', monospace; - font-weight: bold; - font-style: normal; -} - -div.admonition { - margin: 10px 0 10px 0; - padding: 10px; - border: 1px solid #ccc; -} - -div.admonition p.admonition-title { - background-color: #28437f; - color: white; - margin: -10px -10px 10px -10px; - padding: 4px 10px 4px 10px; - font-weight: bold; - font-size: 15px; -} - -div.admonition p.admonition-title a { - color: white!important; -} - -a.headerlink { - color: #B4B4B4!important; - font-size: 0.8em; - padding: 0 4px 0 4px; - text-decoration: none!important; - visibility: hidden; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink, -dt:hover > a.headerlink, -caption:hover > a.headerlink, -p.caption:hover > a.headerlink, -div.code-block-caption:hover > a.headerlink { - visibility: visible; -} - -a.headerlink:hover { - background-color: #B4B4B4; - color: #F0F0F0!important; -} - -table caption span.caption-number { - font-style: italic; -} - -table caption span.caption-text { -} - -table.indextable { - width: 100%; -} - -table.genindextable td { - vertical-align: top; - width: 50%; -} - -table.indextable ul { - margin-top: 0; - margin-bottom: 0; - list-style-type: none; - font-size: 11px; -} - -table.indextable ul a { - color: #000; -} - -table.indextable > tbody > tr > td > ul { - padding-left: 0em; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -table.modindextable { - width: 100%; - border: none; -} - -table.modindextable td { - padding: 2px; - border-collapse: collapse; -} - -table.modindextable img.toggler { - margin-right: 10px; -} - -dl.function dt, -dl.class dt, -dl.exception dt, -dl.method dt, -dl.attribute dt { - font-weight: normal; -} - -dt .descname { - font-weight: bold; - margin-right: 4px; -} - -dt .sig-paren { - font-size: larger; -} - -dt .descname, dt .descclassname { - padding: 0; - background: transparent; - border-bottom: 1px solid #111; -} - -dt .descclassname { - margin-left: 2px; -} - -dl dt big { - font-size: 100%; -} - -ul.search { - margin: 10px 0 0 30px; - padding: 0; -} - -ul.search li { - margin: 10px 0 0 0; - padding: 0; -} - -ul.search div.context { - font-size: 12px; - padding: 4px 0 0 20px; - color: #888; -} - -span.highlight { - /* background-color: #eee; */ - background-color: #eae2cb; /* CHANGED */ - border: 1px solid #ccc; -} - -div.highlight { /* CHANGED */ - background-color: #eae2cb; - border: 0px solid #ccc; -} - -div.highlight-none { /* CHANGED */ - background-color: #eae2cb; - border-top: 2px solid #ffffff; - border-bottom: 8px solid #ffffff; - border-left: 0px solid #ffffff; - border-right: 0px solid #ffffff; - padding-left: 0px solid #ffffff; - padding-right: 0px solid #ffffff; -} - -#toc { - margin: 0 -17px 0 -17px; - display: none; -} - -#toc h3 { - float: right; - margin: 5px 5px 0 0; - padding: 0; - font-size: 12px; - color: #777; -} - -#toc h3:hover { - color: #333; - cursor: pointer; -} - -.expandedtoc { - background: #222 url(darkmetal.png); - border-bottom: 1px solid #111; - outline-bottom: 1px solid #000; - padding: 5px; -} - -.expandedtoc h3 { - color: #aaa; - margin: 0!important; -} - -.expandedtoc h3:hover { - color: white!important; -} - -#tod h3:hover { - color: white; -} - -#toc a { - color: #ddd; - text-decoration: none; -} - -#toc a:hover { - color: white; - text-decoration: underline; -} - -#toc ul { - margin: 5px 0 12px 17px; - padding: 0 7px 0 7px; -} - -#toc ul ul { - margin-bottom: 0; -} - -#toc ul li { - margin: 2px 0 0 0; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: 'Georgia', serif; -} - -div.viewcode-block:target { - background-color: #f4debf; - border-top: 1px solid #ac9; - border-bottom: 1px solid #ac9; - margin: -1px -5px; - padding: 0 5px; -} - -div.figure p.caption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text { -} - -/* math display */ - -div.math p { - text-align: center; -} - -span.eqno { - float: right; -} diff --git a/docs6b/docs/_static/top.png b/docs6b/docs/_static/top.png deleted file mode 100644 index d63e1c95089d71a962b20ae7d9e3f1e92e2e4dd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16618 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 diff --git a/docs6b/docs/coverart/cover-combined.png b/docs6b/docs/coverart/cover-combined.png deleted file mode 100644 index b35647ec577d5142db1e442981183c3137ac4a30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 210203 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
  • }D8 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νL+$D=!&~{Gjjn8FVkXjg4C(2 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 diff --git a/docs6b/docs/coverart/cover-sort-to-pprint.png b/docs6b/docs/coverart/cover-sort-to-pprint.png deleted file mode 100644 index 39f3d3d2d9a2de53d72c149535a0157ea72053c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114080 zcmZ^~1AJsn(>FY^ZCe}LwzaXfNjA1^bCZpo?8dfjYhxQT$;SF}J@@_Kd*1gw^Xut4 zUG=Z->eHvIyLu){MM)Y79v>b603gZANT>k-V1=Lb1}yaFH`~{e?*IUzt+lwgimbRe zsfx41H)~r906-?{hZc;s`WSYuUUFh$D0*aI>TDKimmFMyBx>T9RajZlg2A7tUoTDy zgKcnBD^JQJ3oGbJW1?3l3RhoDMJ07`+*C1taFc-<-2b@Fxz5V?cy~F>daPZ`_|by+2WM(b{SSu*iSw=`?=NalXG9NC1V&E!k**ot2`MnOZ$oq0xu)`dhId?3^EZH_liPLbk>Q(dJ2@ z@uva8t?3N(lEJT${8V_Xb>sTt8x+{TZjb?TXmsQ$U!Q-m8chd1g{c%^nmR<~w-?}$mMTp7U zmgV^XRfGacI#Iha=}Z#z8vGdb;x?!6ej8#x2?`DvN$(SJD1VLYjXgO!m0#>< z%)houXk>eua5=bUe}lbwaU zq(>V398v}LJx~VrAY@N*Z)56toY8*?afos0=Z2 z8t`-64)XF{pb?;GL?_0uM_q&UppJ<#7cV4)Sj&HNbYo)co`JH5u=Cy{^8_>^Gwv&F z!1C-8&!P~Z1m_BpO{k7kO~TtmUiM7wbhH#KQ*aigVTtt&&|ZxP$X2aGJUWh7paN)yc1_QW5JLD8Fc}1hzcB zdphS6frMW{i$Xs#QaiqOxVHLg-W?*89n*6YTSmKvD`ZoRTh{Gvi;nKeJx)_-+cVi$ z186@u%V$>jzkLWpnixI~V?9BjikzRH+q@1-_BmV?m^r>|zYYH}2;80a^QVXymp(5)cNf+_kEdZ}V5%+X5GqTwt;b3z9~7aWLs0&;?@3?@d!W1K;N)cF@Z%i$9?f}don}KkD^T_%b4#I-ekO9LLZgDUXt8LpNPR|h#*ZKO zO&p=LWbVd#!b+ntr7@zBm@ni?;dmbEZ`)sZZ^pMTZ%x=b6S^@~oU#=v6$hI+4?oXRe+)mHWd`@W2l~-zJh0C{x2Y+%YFtMk% zWqT!hr94^x9Amj>*{!7-_#SRRbl+#(Dq0&fn?GpW(}xtI9L_MnGC(-+Bit<s#SYauXVyW(QyjABX3tmNjkp0^(7 zK;oL>GBER=Y#fL+!M392(lc}4xS*2H8~S!wKdw`zZE!Svlyn4tYj?zW)P>!QEsHIQ z{lZABt;XQTz|Od$&86qAlc5t=muaD4=eCk*duhg4Z)oYa{2UTjr5HU$p2e4i(+u6L zzb>}^ef`Cqql2{LxBCzGmCLAmp?lu@tcx0+eB@kY@(B2diTGbd=|!tfDQ4%e{jl3; z$!I?)?0HplR+XTXmXs2*Gp6UJC8yn{YovAK6bRa!5B?+>83-6S8@RV_xGcF5UFsgJ z?L03}^~GIl?z(U091&j$t#oa@#YGfF%$hZf*eQn}Ofv z5p+2`ojeUbG2HPU%L9=>Ip^yqFLN^!%-h%b+j;Lw@4W9muST);L{x-LW{W9+7=U4K zb6~TGrm^?Va&I%~Evcc3#q7TEgs~`adgs{I$DPZE`Nb_#K9b?UaTF$=#FDFw4ig~` zmJ!YlZUIRiejW9mWrJLRzLT$$zMtLnn}j+g8QT|Uivz}Lxb&H-J@>eKVnLt3ziGdJ z6URuO-Nx!t9m<~Ve(CTVUm6dWz3tGdC8!$I zus1`^f=*3yA?ulko7^e@GE6o|CjZT=L+>T#tZ@^OI-9CNXSXjEpCx!@TCQ5o(h+`Z z3ekReIF?B$q9^`C4wXTh;sg~MRtqlA6570a+&2j;v5Buj9Fy`3hFdi69?~B7pQJx} z^}+{(M;GI#6N+P-d1XoIxgHXQ^kYfcnWlUe WfiyF1pxRxBw)_xn*)BaK7CC{U+ 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

    NU6Y@GUgX#^yRt7=hl7lTGrUAo5Q3%0%8i0|4q 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

    c^F8@%zE(Y*QvaGQvnhle69Y&m^vxqGAp)i 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 diff --git a/docs6b/docs/coverart/coverart.key b/docs6b/docs/coverart/coverart.key deleted file mode 100755 index 5f6feb9ef1dee29575a893afd05aeb2cdf97aafd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 529114 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