
你是否曾经面对过这样的情况:有一堆CSV、JSON或TSV文件需要处理,但又不想为此打开庞大的Excel或编写复杂的Python脚本?(我知道我经常遇到这种问题!)
Miller就是为解决这个痛点而生的命令行工具!它就像是命令行中的"瑞士军刀",专为处理结构化数据而设计。简单地说,Miller是CSV、TSV、JSON等格式数据的awk、sed、cut和join的结合体。
作为一名数据工程师,我第一次遇见Miller时简直惊为天人。它让我摆脱了编写临时Python脚本或打开笨重应用程序的困扰,只需一行命令就能完成数据转换、过滤和统计。
在深入了解Miller前,你可能会问:"为什么我需要另一个命令行工具?"这个问题很好!(实际上我最初也有同样的疑问)
以下是Miller的几个杀手锏特性:
最重要的是,Miller填补了命令行文本处理工具和全功能数据处理语言之间的空白。当你需要快速处理结构化数据但又不想启动R或Python环境时,Miller是完美选择!
好消息是,Miller的安装非常简单!(谁不喜欢无痛安装呢?)
使用Homebrew一键安装:
brew install miller
Debian/Ubuntu: apt-get install miller
CentOS/RHEL: yum install miller
Windows用户可以通过Chocolatey安装: choco install miller
或者直接从官方GitHub仓库下载预编译的二进制文件。
安装完成后,输入mlr --version确认安装成功。如果看到版本信息,恭喜你!你已准备好开始Miller之旅了!
Miller的命令结构非常直观,基本格式为:
mlr [操作] [选项] [文件...]
其中mlr是Miller的命令,后面跟着你想执行的操作和选项。
让我们从一些基础操作开始。假设我们有一个名为users.csv的文件,包含用户数据:
id,name,age,city 1,John,28,New York 2,Alice,24,Chicago 3,Bob,32,Los Angeles 4,Carol,45,Miami
将CSV转换为JSON格式非常简单:
mlr --csv --ojson cat users.csv
这会输出:
json [ { "id": "1", "name": "John", "age": "28", "city": "New York" }, { "id": "2", "name": "Alice", "age": "24", "city": "Chicago" }, ... ]
注意命令中的参数:--csv指定输入格式,--ojson指定输出格式,cat操作类似Unix的cat,将记录原样输出。
想找出年龄大于30的用户?没问题!
mlr --csv filter '$age > 30' users.csv
输出:
id,name,age,city 3,Bob,32,Los Angeles 4,Carol,45,Miami
Miller的过滤语法非常直观,$age表示访问"age"字段,然后我们可以使用标准比较运算符。
只想看部分字段,并给它们重命名?使用cut和rename:
mlr --csv cut -f name,age then rename name=user_name,age=user_age users.csv
输出:
user_name,user_age John,28 Alice,24 Bob,32 Carol,45
我喜欢Miller的一点是命令可以用then连接,形成处理管道!
Miller不仅仅是格式转换工具,它还有强大的数据分析能力!(这是我最喜欢的部分!)
想知道每个城市有多少用户,以及他们的平均年龄?
mlr --csv stats1 -a count,mean -f age -g city users.csv
输出:
city,age_count,age_mean New York,1,28 Chicago,1,24 Los Angeles,1,32 Miami,1,45
按年龄对用户排序:
mlr --csv sort -n age users.csv
输出会按年龄从小到大排列所有记录。添加-r参数可以反向排序。
Miller甚至可以执行类似SQL JOIN的操作!假设我们有另一个文件departments.csv:
user_id,department 1,Engineering 2,Marketing 3,Sales 4,HR
我们可以基于ID连接两个文件:
mlr --csv join -j id,user_id -f users.csv departments.csv
这会将两个文件按照id和user_id字段连接起来。
Miller在日志分析方面特别有用。假设我们有一个Apache日志文件转换成的CSV:
timestamp,ip,url,status,response_time 2023-01-01 10:15:23,192.168.1.1,/home,200,0.5 2023-01-01 10:16:42,192.168.1.2,/products,404,0.3 2023-01-01 10:17:15,192.168.1.1,/about,200,0.6 2023-01-01 10:18:32,192.168.1.3,/contact,500,1.2
mlr --csv filter '$status != "200"' access.csv
mlr --csv count-distinct -f ip access.csv
mlr --csv stats1 -a mean -f response_time access.csv
这些操作在处理GB级的日志文件时依然高效,因为Miller是用C语言编写的,专为性能优化!
Miller有自己的领域特定语言(DSL),让你能执行复杂操作。这种语言结合了awk和SQL的特点,非常灵活。
例如,我们可以添加新字段:
mlr --csv put '$is_adult = ($age >= 18 ? "yes" : "no")' users.csv
或者进行数学计算:
mlr --csv put '$age_in_months = $age * 12' users.csv
甚至可以使用正则表达式:
mlr --csv put '$is_ny = $city =~ "New York" ? 1 : 0' users.csv
在使用Miller一段时间后,我发现了一些提高效率的小技巧:
你可能想知道Miller与其他工具相比如何。这里是一个简单比较:
每个工具都有其适用场景。我个人在需要快速处理或转换数据文件时首选Miller,在需要更复杂分析时使用Python。
总结一下,Miller是数据处理工具箱中的必备工具。它不会取代Excel或Python,但在特定场景下,它能让你的工作效率提升数倍!
最让我印象深刻的是Miller的学习曲线非常平缓。即使你只记住几个基本命令,也能大幅提高处理结构化数据的效率。随着你对它的熟悉,你会发现它能处理越来越复杂的任务。
如果你经常处理CSV、JSON或日志文件,我强烈建议你花一点时间学习Miller。它绝对值得成为你数据处理工具箱中的一员!
对了,如果你想深入学习,官方文档非常详尽:Miller官方文档。
希望这篇文章能帮助你开启Miller之旅!数据处理不再是苦差事,而是一种乐趣。祝你数据处理愉快!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。