mlr 实战:命令行处理 CSV 和 Excel 表格,筛选、分组、统计一条命令搞定

做运维和自建服务这几年,我几乎每周都要跟表格…

做运维和自建服务这几年,我几乎每周都要跟表格数据打交道:服务器清单、云厂商账单导出的 CSV、访问日志的汇总、域名和证书的续费表……这些文件动辄几千上万行,用 Excel 打开经常要卡半天,改一个单元格还得等它重算。时间一长你会发现,其实大部分「筛选、分组、求和」的活儿,命令行一条命令就能干完,根本不用启动 Office。

今天推荐一款专门处理结构化文本的命令行工具——miller,命令是 mlr。它原生支持 CSV、TSV、JSON 等格式,语法直白,处理百万行数据也就一两秒。最关键的是,它天生适合写进脚本做自动化,比如每天凌晨拉取账单、清洗后汇总成一张表发给自己。

安装

Ubuntu / Debian 一条命令装好:

sudo apt install miller

macOS 用 brew install miller。装完执行 mlr --version 确认即可。如果你不想动系统包,官方也提供单文件的静态二进制,下载解压就能跑,放到 /usr/local/bin 里最省事。

核心概念:动词(verb)

mlr 的核心是一堆「动词」,每个动词只干一件事:filter 是筛选、sort 是排序、stats1 是统计、cut 是取列、put 是新增计算列。用 then 把动词串起来,就组成一条数据处理流水线。所有动词前面统一用 --csv 声明输入格式。

下面假设我们有一份服务器清单 servers.csv,内容长这样:

host,region,cpu,price
web-01,us-east,4,20
db-01,us-west,8,40
cache-01,eu-central,2,10

处理之前先用 head 看前几行,确认表头和格式对不对:

mlr --csv head servers.csv

实战一:筛选

挑出 8 核以上、月费不超过 50 的机器,filter 里的 $cpu、$price 就是列名,&& 表示「并且」:

mlr --csv filter '$cpu >= 8 && $price <= 50' servers.csv

要筛选名字里带 web 的行,用正则匹配 =~:

mlr --csv filter '$host =~ "web"' servers.csv

实战二:分组统计

按 region 统计机器数量和总价,-a 指定聚合函数、-f 指定聚合的列、-g 指定分组列:

mlr --csv stats1 -a count,sum -f price -g region servers.csv

再算每个 region 的平均价格,并按均价降序排列,注意 mean 生成的新列会自动叫 price_mean:

mlr --csv stats1 -a mean -f price -g region then sort -nr price_mean servers.csv

实战三:新增列与格式转换

加一列年费,$yearly = $price * 12:

mlr --csv put '$yearly = $price * 12' servers.csv

CSV 转 JSON 同样一条命令,--icsv 声明输入、--ojson 声明输出:

mlr --icsv --ojson cat servers.csv

顺便提醒一句:如果你的 Excel 导出的是分号分隔(不少欧洲和中文老版本会这样),加一个 --ifs ';' 参数即可。遇到字段里带逗号、被双引号包起来的情况,mlr 也能正确处理,不用自己写解析。

什么时候用它

数据量大、规则明确、需要重复执行、要写进脚本自动化,用 mlr 最合适;至于透视表、图表、要给人看的美观报表,还是交给 Excel 或 WPS。两者不冲突——mlr 负责把脏数据快速洗干净,Excel 负责最终呈现。下次再导出一份几万行的 CSV,别傻等表格软件转圈了,试试 mlr 吧。

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注