Miller

John Kerl, автор проекта Miller · лицензия BSD-2-Clause

Сводит, фильтрует и соединяет выгрузки CSV, TSV и JSON одной командой. Агент посчитает итоги по группам, уберёт повторы, разрежет таблицу на файлы и переведёт её в JSON или Markdown.

macOS · Windows · LinuxНа компьютере, на сервере и в контейнереБесплатно, BSD-2-Clause

✓ Проверено 15.10.2026: Ubuntu 24.04 (x86_64) в одноразовом контейнере Docker на сервере, от root: Miller 6.22.0 из готового архива со страницы выпуска на GitHub, потом пакет .deb того же выпуска. Что именно проверяли

Установить агентом ↓

Какую задачу решает

Обрабатывает таблицы CSV, TSV и JSON по именам колонок: отбирает строки, считает итоги по группам, соединяет два файла по общему полю, сортирует и переводит из одного формата в другой. Окон у программы нет, агент пишет цепочку команд и получает готовый файл. На Linux программа - один файл без внешних библиотек.

  • Отбирает строки по условию и считает по группам сумму, число записей, среднее или медиану (filter, stats1), потом сортирует по нужной колонке. В прогоне так собран отчёт по менеджерам из тестовой выгрузки заказов.
  • Соединяет две таблицы по общему полю командой join и подставляет из второй таблицы нужные колонки, например имя менеджера по его коду.
  • Переводит CSV в JSON, TSV или таблицу Markdown, по документации и в JSON Lines (--ojsonl). Сжатые файлы .gz, .bz2 и .zst по документации читает без распаковки, это мы не проверяли.
  • Убирает повторы строк по ключу (head -n 1 -g), выкидывает лишние колонки (cut -x) и раскладывает таблицу по отдельным файлам по значению поля (split -g).

Пример результата

Говоришь агенту

Вот выгрузка заказов orders.csv с разделителем «;» и список менеджеров managers.csv. Возьми только оплаченные заказы, убери повторы номеров, подставь имя менеджера и посчитай сумму и число заказов по каждому, по убыванию суммы. Сохрани отчёт в JSON и покажи его таблицей.

Что получится

Мы прогнали этот сценарий на тестовой выгрузке из 9 заказов, где был повтор, отменённый заказ и заказ без суммы, а список менеджеров был через запятую. Miller собрал отчёт одной цепочкой команд за 93 мс: суммы 4100, 1300.25 и 450.25 при 3, 2 и 1 оплаченном заказе. Итоги совпали с отдельным расчётом на Python, исходные файлы не изменились. Та же цепочка с ключом --omd дала таблицу Markdown.

Паспорт

Кто делает
John Kerl, автор проекта Miller
Исходный код
github.com/johnkerl/miller
Лицензия
BSD-2-Clause
Версия
6.22.0 на 15.10.2026
Системы
macOS · Windows · Linux
Где работает
На компьютере, на сервере и в контейнере
Цена
Бесплатно
Проверка
Проверено 15.10

Установить агентом

Для Claude Code, Codex, Hermes и любого агента с терминалом
Установи программу «Miller». Работай по шагам и после каждого коротко говори, что сделал.

Что это за программа (каталог smyslokod.ru, официальные источники сверены 15.10.2026):
- официальный сайт: https://miller.readthedocs.io/en/6.22.0/
- исходный код: https://github.com/johnkerl/miller
- инструкция по установке: https://miller.readthedocs.io/en/6.22.0/installing-miller/
- актуальная версия на 15.10.2026: 6.22.0
- лицензия: BSD-2-Clause

Правила:
1. Ничего не устанавливай и не меняй, пока я не скажу «да» на твой план.
2. Ставь только способами из этого промпта. Сторонние сборки, скрипты с форумов и из чужих репозиториев не бери.
3. Мои проекты не трогай: не меняй их файлы, виртуальные окружения и списки зависимостей (package.json, requirements.txt, pyproject.toml).
4. Команды с sudo, правку профиля оболочки (~/.zshrc, ~/.bashrc) и переменной PATH делай только после моего отдельного «да» на каждую.
5. Не проси у меня пароли и ключи и не выводи их. Если нужен пароль администратора, дай команду, я выполню её сам.
6. Запускай mlr с MLR_NO_SHELL=1 или ключом --no-shell. Функции system и exec, ключ --prepipe и mlr mcp --allow-shell включай только по прямой просьбе человека.
7. Результат пиши в новый файл. Ключ -I на исходных файлах запускай только после «да» человека и после копии.
8. split и вывод в файлы направляй в новую папку через --folder, чтобы не перезаписать файлы рядом с данными.
9. После join проверь, что вывод не пустой и число строк похоже на ожидаемое. Пустой вывод с кодом 0 обычно значит разные разделители или имена ключевых колонок.
10. Итоги, которые человек понесёт в отчёт, сверь выборочно: число строк на входе и выходе, сумму по всему файлу.

Шаги:
0. Определи, где ты работаешь: мой компьютер, сервер или контейнер. Какая система и процессор, какие менеджеры пакетов есть (Homebrew, apt, winget, uv, pipx). Ставить нужно туда, где ты сам запускаешь команды.
   - на компьютере: выгрузки из таблиц, магазинов и сервисов приёма заявок на своём компьютере.
   - на сервере: обработка выгрузок и журналов по расписанию, без окон и без вопросов в терминале.
   - в контейнере: мы проверяли в контейнере Ubuntu 24.04 от root, установка заняла 1 секунду.
1. Проверь, не стоит ли программа уже: mlr --version ; which -a mlr. Если стоит и запускается, ничего не ставь и переходи к шагу 5.
2. Отдельных зависимостей у программы нет. Проверь свободное место на диске: нужно Архив miller-6.22.0-linux-amd64.tar.gz весит 6 075 166 байт, пакет .deb - 6 067 156 байт. Распакованный mlr занимает 17 473 698 байт (около 16,7 МиБ), других файлов программа не ставит. Сколько займёт Homebrew или winget, мы не мерили..
3. Составь план: каким одним способом из списка ниже будешь ставить, что появится на диске и сколько места займёт, что поменяется в системе и как потом удалить. Покажи план и жди моего «да».
   Способы из официальных источников:
   - macOS, Homebrew: brew install miller (так советует документация, формула на 15.10.2026 ставит 6.22.0. Ни установку, ни удаление через Homebrew мы не проверяли, команда удаления взята из справки Homebrew)
   - Windows, winget: winget install --exact --id Miller.Miller (команда из README проекта, winget берёт архив со страницы выпуска на GitHub. Ни установку, ни удаление мы не проверяли, команда удаления взята из справки winget)
   - Linux, готовый файл с GitHub: mkdir -p ~/.local/bin && curl -fsSL -o /tmp/miller-6.22.0-linux-amd64.tar.gz https://github.com/johnkerl/miller/releases/download/v6.22.0/miller-6.22.0-linux-amd64.tar.gz && echo "0551f8696e8f42dae1c67c782bbe04e0589e718268722fa98561e2566e4623b8  /tmp/miller-6.22.0-linux-amd64.tar.gz" | sha256sum -c - && tar xzf /tmp/miller-6.22.0-linux-amd64.tar.gz -C /tmp && install -m 755 /tmp/miller-6.22.0-linux-amd64/mlr ~/.local/bin/mlr && rm -rf /tmp/miller-6.22.0-linux-amd64.tar.gz /tmp/miller-6.22.0-linux-amd64 (архив для x86-64, для ARM64 на странице выпуска лежит miller-6.22.0-linux-arm64.tar.gz со своей суммой в файле checksums.txt. Сумму мы сверили с checksums.txt выпуска. Команда кладёт один файл mlr в ~/.local/bin, эта папка должна быть в PATH. Мы ставили ровно так)
   - Linux, пакет .deb с GitHub: curl -fsSL -o /tmp/miller-6.22.0-linux-amd64.deb https://github.com/johnkerl/miller/releases/download/v6.22.0/miller-6.22.0-linux-amd64.deb && echo "128b794487ed2c19b1ddde90d037f39cde257bd0ace1e8fef5a2b3aeffdf9a8d  /tmp/miller-6.22.0-linux-amd64.deb" | sha256sum -c - && sudo dpkg -i /tmp/miller-6.22.0-linux-amd64.deb && rm /tmp/miller-6.22.0-linux-amd64.deb (для Debian и Ubuntu на x86-64. Пакет кладёт один файл /usr/bin/mlr. Установку и удаление мы проверили, в контейнере команды шли от root без sudo)
   - Linux, apt: sudo apt-get install miller (пакет дистрибутива. В Ubuntu 24.04 это 6.11.0, она намного старше, и документация сама предупреждает, что apt и yum могут дать старую версию. Мы этот пакет не ставили и не удаляли, команда удаления взята из справки apt-get)
4. Установи по согласованному плану. Если что-то идёт не так, как в плане, остановись и спроси.
5. Проверь результат:
   - mlr --version: программа запускается без ошибки;
   - Сделай во временной папке тестовую выгрузку заказов с разделителем «;», с повтором заказа, отменённым заказом и пустой суммой, и список менеджеров через запятую. Одной цепочкой mlr возьми оплаченные заказы без повторов, подставь имя менеджера, посчитай сумму и число заказов и отсортируй по убыванию суммы. Сверь итог с расчётом на Python и проверь, что исходные файлы не изменились. Проверь split -g, -I на копии, коды ошибок и запрет внешних команд --no-shell. Делай это во временной папке и не трогай мои файлы.
     export PATH=$HOME/.local/bin:$PATH
     mlr --version
     mlr --icsv --ifs ';' --ojson filter '$status == "paid"' then head -n 1 -g order_id then join --ifs , -j manager_id --lk name -f data/managers.csv then stats1 -a sum,count -f amount -g manager_id,name then sort -nr amount_sum data/orders.csv > out/report.json
     mlr --icsv --ifs ';' --omd filter '$status == "paid"' then head -n 1 -g order_id then join --ifs , -j manager_id --lk name -f data/managers.csv then stats1 -a sum,count -f amount -g manager_id,name then sort -nr amount_sum data/orders.csv > out/report.md
     mlr --icsv --ifs ';' --ocsv filter '$status == "paid"' then split -g manager_id --folder out/by-manager data/orders.csv
     mlr -I --icsv --ifs ';' --ocsv --ofs ';' cut -x -f status out/orders-copy.csv
     mlr --icsv cat data/nope.csv
     mlr --icsv --ojson cat data/ragged.csv
     mlr --icsv --ojson --allow-ragged-csv-input cat data/ragged.csv
     mlr --no-shell -n put 'end{print system("echo shell-ran")}'
     MLR_NO_SHELL=1 mlr --icsv --prepipe cat cat data/managers.csv
   - если ты работаешь в папке моего проекта, покажи git status: от установки в проекте не должно появиться изменений.
6. Итог одним сообщением: что установлено, какой версии и куда, сколько места заняло, что поменялось в системе и как всё удалить (macOS, Homebrew: brew uninstall miller; Windows, winget: winget uninstall --exact --id Miller.Miller; Linux, готовый файл с GitHub: rm -f ~/.local/bin/mlr; Linux, пакет .deb с GitHub: sudo dpkg -r miller; Linux, apt: sudo apt-get remove miller).

Если на любом шаге ошибка, не чини наугад: покажи текст ошибки и скажи, что, по-твоему, случилось. Частые проблемы: https://smyslokod.ru/cli/miller#problemy

Промпт собран из официальных инструкций, сверенных 15.10.2026. Агент сначала проверит, что уже стоит, покажет план с местом на диске и способом удаления и без твоего «да» ничего не поставит.

Как ставят вручную

Способы из официальных источников, у каждого ссылка на первоисточник.

  • macOS · Homebrew · источник

    brew install miller

    так советует документация, формула на 15.10.2026 ставит 6.22.0. Ни установку, ни удаление через Homebrew мы не проверяли, команда удаления взята из справки Homebrew

  • Windows · winget · источник

    winget install --exact --id Miller.Miller

    команда из README проекта, winget берёт архив со страницы выпуска на GitHub. Ни установку, ни удаление мы не проверяли, команда удаления взята из справки winget

  • Linux · готовый файл с GitHub · источник

    mkdir -p ~/.local/bin && curl -fsSL -o /tmp/miller-6.22.0-linux-amd64.tar.gz https://github.com/johnkerl/miller/releases/download/v6.22.0/miller-6.22.0-linux-amd64.tar.gz && echo "0551f8696e8f42dae1c67c782bbe04e0589e718268722fa98561e2566e4623b8 /tmp/miller-6.22.0-linux-amd64.tar.gz" | sha256sum -c - && tar xzf /tmp/miller-6.22.0-linux-amd64.tar.gz -C /tmp && install -m 755 /tmp/miller-6.22.0-linux-amd64/mlr ~/.local/bin/mlr && rm -rf /tmp/miller-6.22.0-linux-amd64.tar.gz /tmp/miller-6.22.0-linux-amd64

    архив для x86-64, для ARM64 на странице выпуска лежит miller-6.22.0-linux-arm64.tar.gz со своей суммой в файле checksums.txt. Сумму мы сверили с checksums.txt выпуска. Команда кладёт один файл mlr в ~/.local/bin, эта папка должна быть в PATH. Мы ставили ровно так

  • Linux · пакет .deb с GitHub · источник

    curl -fsSL -o /tmp/miller-6.22.0-linux-amd64.deb https://github.com/johnkerl/miller/releases/download/v6.22.0/miller-6.22.0-linux-amd64.deb && echo "128b794487ed2c19b1ddde90d037f39cde257bd0ace1e8fef5a2b3aeffdf9a8d /tmp/miller-6.22.0-linux-amd64.deb" | sha256sum -c - && sudo dpkg -i /tmp/miller-6.22.0-linux-amd64.deb && rm /tmp/miller-6.22.0-linux-amd64.deb

    для Debian и Ubuntu на x86-64. Пакет кладёт один файл /usr/bin/mlr. Установку и удаление мы проверили, в контейнере команды шли от root без sudo

  • Linux · apt · источник

    sudo apt-get install miller

    пакет дистрибутива. В Ubuntu 24.04 это 6.11.0, она намного старше, и документация сама предупреждает, что apt и yum могут дать старую версию. Мы этот пакет не ставили и не удаляли, команда удаления взята из справки apt-get

Как удалить

  • macOS, Homebrew: brew uninstall miller
  • Windows, winget: winget uninstall --exact --id Miller.Miller
  • Linux, готовый файл с GitHub: rm -f ~/.local/bin/mlr
  • Linux, пакет .deb с GitHub: sudo dpkg -r miller
  • Linux, apt: sudo apt-get remove miller

Что нужно для работы

Отдельных зависимостей нет.

Системы

  • macOS - ставится через Homebrew, на странице выпуска есть готовые файлы для Intel и Apple Silicon. На Mac мы не проверяли.
  • Windows - winget ставит mlr.exe из архива выпуска на GitHub, для x86, x64 и ARM64. На Windows мы не проверяли.
  • Linux - мы проверяли на Ubuntu 24.04 x86-64 готовый архив и пакет .deb со страницы выпуска. Файл mlr собран без внешних библиотек. Для ARM64 и других процессоров в выпуске лежат свои файлы.

Где запускать

Ставить нужно туда, где работает агент: на твой компьютер, сервер или в контейнер.

  • На компьютере - выгрузки из таблиц, магазинов и сервисов приёма заявок на своём компьютере.
  • На сервере - обработка выгрузок и журналов по расписанию, без окон и без вопросов в терминале.
  • В контейнере - мы проверяли в контейнере Ubuntu 24.04 от root, установка заняла 1 секунду.

Сколько ресурсов нужно

Место на диске
Архив miller-6.22.0-linux-amd64.tar.gz весит 6 075 166 байт, пакет .deb - 6 067 156 байт. Распакованный mlr занимает 17 473 698 байт (около 16,7 МиБ), других файлов программа не ставит. Сколько займёт Homebrew или winget, мы не мерили.
Память
Память мы не мерили. По справке join без ключа -s читает левый файл (-f) в память целиком.
Сеть
Для установки нужна сеть: в прогоне соединения шли к github.com (140.82.121.3) и адресам скачивания GitHub 185.199.108-111.133, плюс DNS контейнера 127.0.0.11. Обработка файлов и установка пакета .deb соединений не открывали. По документации входом может быть и веб-адрес файла, тогда Miller сам скачает данные. Это мы не проверяли.

Лицензия и платные замены

Лицензия BSD-2-Clause. Пользоваться можно бесплатно, и лично, и в работе компании. Кто распространяет Miller, в исходниках или готовым файлом, сохраняет уведомление об авторских правах, условия лицензии и отказ от гарантий. Текст лицензии

Цена: Бесплатно. Программа бесплатная, лицензия BSD-2-Clause.

Платные замены

  • EasyMorph Desktop - Программа с окном для Windows, где обработку таблиц собирают из готовых действий без кода. В бесплатной версии до 20 действий в проекте, Professional стоит 900 долларов в год за пользователя или 300 долларов за 3 месяца.

Бесплатные замены

  • jq - Разбирает и переделывает JSON. Miller удобнее для таблиц с колонками, jq - для вложенного JSON.
  • DuckDB - Запросы SQL к CSV, Excel и Parquet. Подойдёт, если удобнее писать SQL, чем цепочки команд.

О чём помнить

  • Безопасность. Агент запускает mlr в терминале сам (exec). Программа читает файлы, которые ей передали, левый файл join и файлы настроек .mlrrc: ~/.mlrrc, $XDG_CONFIG_HOME/miller/mlrrc (если переменной нет, ~/.config/miller/mlrrc) и ./.mlrrc в текущей папке (read). Пишет файлы по пути, который задаёт агент: вывод в файл, split в текущую папку или папку из --folder, команды tee, emit и print с перенаправлением в файл с именем из выражения (write). Ключ -I переписывает исходные файлы результатом, а split перезаписывает файлы с теми же именами, если не указан -a (acts). Функции system и exec в выражениях, ключ --prepipe и перенаправление в команду запускают внешние программы (exec). Ключ --no-shell или переменная MLR_NO_SHELL=1 это запрещают, мы проверили: system вернул «(error)» и echo не запустил, --prepipe закончился ошибкой. Запись файлов этот запрет не отключает. Входа в учётные записи и ключей программа не просит.
  • Чужой файл ./.mlrrc в папке с данными меняет настройки по умолчанию, например формат ввода. По документации ключи --prepipe, --load и --mload в .mlrrc не принимаются. Не читать ни один файл настроек можно с переменной MLRRC=__none__.
  • Если у основного файла и у файла в join разные разделители, разделитель левого файла указывают после слова join (join --ifs ,). Иначе join не найдёт пар и молча выдаст пустой результат с кодом 0, так было в нашем первом прогоне.
  • В Ubuntu 24.04 apt ставит 6.11.0, а документация на сайте написана для 6.22.0. Например, mlr mcp и ключ --no-shell в описании выпуска 6.20.2 от 04.07.2026 названы новыми. Сверяй справку со своей версией (mlr --version).

Частые проблемы

После цепочки с join вывод пустой, ошибки нет, код выхода 0

Левый файл join читается с тем же разделителем, что и основной. В нашем прогоне основная выгрузка была через «;», список менеджеров через запятую, и пар не нашлось. Укажи разделитель левого файла после слова join: join --ifs , -j manager_id -f managers.csv.

mlr: CSV header/data length mismatch 2 != 1 at filename data/ragged.csv row 3

В строке меньше полей, чем в заголовке. Miller вернул код 1, а записи до этой строки уже успел напечатать. Поправь файл или добавь ключ --allow-ragged-csv-input: тогда у такой записи будут только те поля, что есть в строке.

mlr: verb "sorted" not found. Please use "mlr -l" for a list.

Опечатка в названии команды, Miller вернул код 1. Посмотри список команд через mlr -l и справку по нужной через mlr <команда> --help.

Проверка

✓ Проверено 15.10.2026: Ubuntu 24.04 (x86_64) в одноразовом контейнере Docker на сервере, от root: Miller 6.22.0 из готового архива со страницы выпуска на GitHub, потом пакет .deb того же выпуска.

Когда
15.10.2026
Среда
Ubuntu 24.04 (x86_64) в одноразовом контейнере Docker на сервере, от root: Miller 6.22.0 из готового архива со страницы выпуска на GitHub, потом пакет .deb того же выпуска
Объём
Установили и прогнали задачу на тестовых данных
Что именно сделали
  1. Одноразовый контейнер Ubuntu 24.04 без данных и ключей. Скачали архив miller-6.22.0-linux-amd64.tar.gz и файл сумм со страницы выпуска, сумма совпала. Положили mlr в ~/.local/bin, установка заняла 1 секунду, mlr --version вывел «mlr 6.22.0».
  2. Скрипт прогона сам сделал тестовую выгрузку из 9 заказов через «;»: с повтором одного заказа, отменённым заказом и заказом без суммы. Рядом лёг список из трёх менеджеров через запятую.
  3. Одной цепочкой mlr взяли оплаченные заказы, убрали повтор, подставили имя менеджера через join, посчитали сумму и число заказов и отсортировали по убыванию суммы. Отчёт в JSON собрался за 93 мс, та же цепочка с --omd дала таблицу Markdown.
  4. Итоги 4100, 1300.25 и 450.25 при 3, 2 и 1 заказе совпали с отдельным расчётом на Python. Контрольные суммы исходных файлов не изменились.
  5. split -g разложил оплаченные заказы на три файла по менеджерам в отдельную папку. -I убрал колонку status из копии выгрузки, а исходник не тронул.
  6. Без файла, со строкой короче заголовка и с опечаткой в команде mlr вернул код 1 и понятную ошибку. С ключом --allow-ragged-csv-input короткая строка прошла.
  7. Без запрета system() в выражении запустил echo. С --no-shell и с MLR_NO_SHELL=1 вместо результата вышло «(error)», а --prepipe закончился ошибкой.
  8. Пакет .deb того же выпуска поставил /usr/bin/mlr 6.22.0, dpkg -r его убрал. Обработка файлов соединений не открывала. Удалили mlr из ~/.local/bin, команда больше не находится. Скрипт сверил каждый результат сам и только после этого напечатал TASK_OK.
ДатаВерсияОбъёмГдеИтог
15.10.20266.22.0задачаконтейнер, Linuxполучилось

«Проверено» ставим, только когда сами поставили программу и прогнали её на задаче. Сверка ссылок и вывод версии так не называются.

Похожие программы

Программу делают её авторы. Мы сверяем официальные источники и описываем, что ей нужно, но код остаётся чужим. Перед установкой посмотри план агента: что он поставит и что поменяет в системе.