Miller
John Kerl, автор проекта Miller · лицензия BSD-2-Clause
Сводит, фильтрует и соединяет выгрузки CSV, TSV и JSON одной командой. Агент посчитает итоги по группам, уберёт повторы, разрежет таблицу на файлы и переведёт её в JSON или Markdown.
✓ Проверено 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
Установить агентом
Установи программу «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 месяца.
Бесплатные замены
О чём помнить
- Безопасность. Агент запускает 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 того же выпуска
- Объём
- Установили и прогнали задачу на тестовых данных
- Что именно сделали
- Одноразовый контейнер Ubuntu 24.04 без данных и ключей. Скачали архив miller-6.22.0-linux-amd64.tar.gz и файл сумм со страницы выпуска, сумма совпала. Положили mlr в ~/.local/bin, установка заняла 1 секунду, mlr --version вывел «mlr 6.22.0».
- Скрипт прогона сам сделал тестовую выгрузку из 9 заказов через «;»: с повтором одного заказа, отменённым заказом и заказом без суммы. Рядом лёг список из трёх менеджеров через запятую.
- Одной цепочкой mlr взяли оплаченные заказы, убрали повтор, подставили имя менеджера через join, посчитали сумму и число заказов и отсортировали по убыванию суммы. Отчёт в JSON собрался за 93 мс, та же цепочка с --omd дала таблицу Markdown.
- Итоги 4100, 1300.25 и 450.25 при 3, 2 и 1 заказе совпали с отдельным расчётом на Python. Контрольные суммы исходных файлов не изменились.
- split -g разложил оплаченные заказы на три файла по менеджерам в отдельную папку. -I убрал колонку status из копии выгрузки, а исходник не тронул.
- Без файла, со строкой короче заголовка и с опечаткой в команде mlr вернул код 1 и понятную ошибку. С ключом --allow-ragged-csv-input короткая строка прошла.
- Без запрета system() в выражении запустил echo. С --no-shell и с MLR_NO_SHELL=1 вместо результата вышло «(error)», а --prepipe закончился ошибкой.
- Пакет .deb того же выпуска поставил /usr/bin/mlr 6.22.0, dpkg -r его убрал. Обработка файлов соединений не открывала. Удалили mlr из ~/.local/bin, команда больше не находится. Скрипт сверил каждый результат сам и только после этого напечатал TASK_OK.
| Дата | Версия | Объём | Где | Итог |
|---|---|---|---|---|
| 15.10.2026 | 6.22.0 | задача | контейнер, Linux | получилось |
«Проверено» ставим, только когда сами поставили программу и прогнали её на задаче. Сверка ссылок и вывод версии так не называются.
Похожие программы
- jqДостаёт нужное из JSON: ответов сервисов, выгрузок заказов и заявок. Агенту нужен, чтобы отфильтровать записи, посчитать суммы и сохранить таблицу CSV для Excel.
- DuckDBСчитает итоги по таблицам в CSV, Excel и Parquet запросом SQL, без отдельного сервера базы данных. Агент сводит выгрузки и сохраняет результат в Excel или CSV.
Программу делают её авторы. Мы сверяем официальные источники и описываем, что ей нужно, но код остаётся чужим. Перед установкой посмотри план агента: что он поставит и что поменяет в системе.