首页/新闻资讯/正文详情

Miller 压缩数据处理实战:GZIP/BZIP2/ZLIB/ZSTD 输入自动检测、`--prepipe` 外部解压与压缩输出完全指南

发布时间:2026/9/25 2:05:53 来源:云帆数科 栏目:资讯中心
Miller 压缩数据处理实战:GZIP/BZIP2/ZLIB/ZSTD 输入自动检测、`--prepipe` 外部解压与压缩输出完全指南
CLI数据分析【免费下载链接】millerMiller is like awk, sed, cut, join, and sort for name-indexed data such as CSV, TSV, and tabular JSON项目地址https://gitcode.com/gh_mirrors/mi/miller点击查看免费下载本篇技术指南以 Miller 官方文档 reference-main-compressed-data.md 为主体系统讲解 Miller 6 起内建支持的 GZIP、BZIP2、ZLIB、ZSTD 四种压缩格式的读取方式按文件扩展名自动检测、用--gzin/--bz2in/--zin/--zstdin手动指定、以及通过--prepipe/--prepipex调用任意外部解压程序的通用方案并覆盖管道、tee语句和-I原地模式下的压缩输出。读完本文你将掌握在不解压落盘的前提下直接对.gz、.bz2、.z、.zst文件执行mlr数据处理全流程的技能并理解这些能力在源码层面的实现原理与安全边界。压缩数据支持总览Miller 6 的内建解压能力从 Miller 6 开始Miller 在进程内部in-process直接支持读取以下四种压缩格式无需外部解压工具压缩格式文件扩展名内建解压方式GZIP.gzGo 标准库compress/gzipBZIP2.bz2Go 标准库compress/bzip2ZLIB.zGo 标准库compress/zlibZSTD.zst第三方库github.com/klauspost/compress/zstd这四种格式的读取统一由 pkg/lib/file_readers.go 中的TFileInputEncoding枚举FileInputEncodingDefault、FileInputEncodingBzip2、FileInputEncodingGzip、FileInputEncodingZlib、FileInputEncodingZstd标识并被所有输入格式的记录读取器CSV、JSON、XTAB、DKVP、NIDX、PPRINT、DCF 等共享因此无论你使用哪种文件格式压缩处理机制都是同一套。此外Miller 6 之前就已存在更通用的--prepipe选项用于调用$PATH中任意的外部解压程序。两条路径并存内建解压器进程内与外部解压器进程外。这两种方式的选择逻辑在 pkg/lib/file_readers.go 的OpenFileForRead中清晰可见prepipe非空时优先走外部管道openPrepipedHandleForRead否则再按内建编码打开。输入自动检测按文件扩展名识别压缩格式如果你的输入文件以.gz、.bz2、.z或.zst结尾Miller 会自动按扩展名判断压缩格式并即时解压。文档中的完整示例数据文件为仓库内 docs/src/gz-example.csv.gzfile gz-example.csv.gzgz-example.csv.gz: gzip compressed data, was gz-example.csv, last modified: Mon Aug 23 02:04:34 2021, from Unix, original size modulo 2^32 429mlr --csv sort -f color gz-example.csv.gzcolor,shape,flag,k,index,quantity,rate purple,triangle,false,5,51,81.2290,8.5910 purple,triangle,false,7,65,80.1405,5.8240 purple,square,false,10,91,72.3735,8.2430 red,square,true,2,15,79.2778,0.0130 red,circle,true,3,16,13.8103,2.9010 red,square,false,4,48,77.5542,7.4670 red,square,false,6,64,77.1991,9.5310 yellow,triangle,true,1,11,43.6498,9.8870 yellow,circle,true,8,73,63.9785,4.2370 yellow,circle,true,9,87,63.5058,8.3350注意mlr --csv sort -f color gz-example.csv.gz与mlr --csv sort -f color gz-example.csv的输出完全一致——解压发生在内存/流中磁盘上的压缩文件保持原样、不会被修改。这样做的价值在于压缩数据在磁盘上节省空间代价是运行时需要额外 CPU 开销完成解压。对于 GB 级的大文件这是一种典型的以 CPU 换磁盘的取舍。自动检测的实现位于 pkg/lib/file_readers.go 的FindInputEncoding与 pkg/lib/file_readers.go 的openEncodedHandleForRead若用户没有通过标志显式指定编码则依次检查后缀.bz2→ bzip2、.gz→ gzip、.z→ zlib、.zst→ zstd匹配到后缀后openEncodedHandleForRead将原始文件句柄包上一层对应的解压 Reader。一个值得注意的实现细节Go 标准库的bzip2.NewReader与klauspost/compress的zstd.NewReader都只返回io.Reader而不实现io.ReadCloser因此 Miller 在 pkg/lib/file_readers.go 中分别定义了BZip2ReadCloser与ZstdReadCloser包装类型把底层文件句柄的关闭职责一并代理保证解压流可以正常释放资源。手动指定压缩格式--gzin/--bz2in/--zin/--zstdin当输入文件的扩展名不在.gz、.bz2、.z、.zst之列例如被重命名为.bin、.dat或从流式 stdin 读取Miller 无法自动判断压缩格式。此时可用以下四个标志显式告知mlr --csv --gzin sort -f color myfile.bin # myfile.bin 的内容是 gzip 压缩的四个标志与格式的对应关系标志含义对应自动检测后缀--gzin按 gzip 解压.gz--bz2in按 bzip2 解压.bz2--zin按 zlib 解压.z--zstdin按 zstd 解压.zst这些标志在 pkg/cli/option_parse.go 的CompressedDataFlagSection中定义每个标志的作用都是把options.ReaderOptions.FileInputEncoding设置为对应的枚举值。--gzin的帮助文本明确写着Done by default if file ends in.gz即显式标志与扩展名自动检测的效果等价。与 stdin 配合使用压缩数据同样可以通过标准输入管道进入 Miller。由于管道没有文件名扩展名自动检测无从谈起此时--gzin等标志几乎是唯一的内建解压途径。仓库测试用例 test/cases/io-compressed-input/0008、0009、0010、0015 分别验证了mlr --bz2in count -g a test/input/medium.bz2 mlr --gzin count -g a test/input/medium.gz mlr --zin count -g a test/input/medium.z mlr --zstdin count -g a test/input/medium.zst对应地0005、0006、0007、0014 验证了同样的输入文件不带标志、仅靠扩展名自动检测即可读取。这组两两对照的用例文件方式 vs stdin 方式、自动检测 vs 手动标志完整覆盖了内建解压的四种格式、两条路径是理解本主题的最佳测试标本。外部解压器--prepipe与--prepipex基本用法--prepipe--prepipe接受$PATH中任意可执行程序的名称Miller 会对每个输入文件运行一次该程序把该程序的标准输出接到 Miller 的标准输入上。效果等价于传统的 shell 管道例如单文件场景下你完全可以自己写gunzip gz-example.csv.gz | mlr --csv sort -f colorcolor,shape,flag,k,index,quantity,rate purple,triangle,false,5,51,81.2290,8.5910 purple,triangle,false,7,65,80.1405,5.8240 purple,square,false,10,91,72.3735,8.2430 red,square,true,2,15,79.2778,0.0130 red,circle,true,3,16,13.8103,2.9010 red,square,false,4,48,77.5542,7.4670 red,square,false,6,64,77.1991,9.5310 yellow,triangle,true,1,11,43.6498,9.8870 yellow,circle,true,8,73,63.9785,4.2370 yellow,circle,true,9,87,63.5058,8.3350而--prepipe的收益在于Miller 会按文件边界对每个输入文件分别启动一次指定程序多文件处理时天然保留文件边界这是手工管道难以优雅实现的mlr --prepipe gunzip --csv sort -f color a.csv.gz b.csv.gz--prepipe的命令可以是任何从标准输入读取、向标准输出产出 Miller 可接受数据的程序因此名义上你可以按需选用系统里安装的各种解压工具且支持逐文件差异配置mlr --prepipe zcat -cf --csv cat data1.zst mlr --prepipe xz -cd --csv cat data2.xz如果命令自身带参数flag必须用引号整体包裹例如mlr --prepipe zcat -cf。这一点在 pkg/cli/option_parse.go 的实现中也能印证--prepipe会把紧随其后的整个参数原样存入options.ReaderOptions.Prepipe参数内的空格不会被重新分词。该功能非常通用并不局限于解压工具——你可以用它做任意逐文件过滤器例如只取每个文件的前 10 行mlr --prepipe head -n 10 ...--prepipe与--prepipex的区别两者都接受解压命令区别在于运行时如何拼接命令行见 pkg/lib/file_readers.go 的openPrepipedHandleForRead--prepipe按命令 文件名方式调用适用于从标准输入读取的程序如gunzip、zcat -cf、xz -cd--prepipex按命令 文件名方式调用不插入重定向适用于必须以文件名为参数的程序如unzip -qc。对应地pkg/cli/option_parse.go 中--prepipex的解析器会把PrepipeIsRaw置为true从而在拼接时走prepipe escapedFilename分支而--prepipe的PrepipeIsRaw为false走prepipe escapedFilename分支。优先级--prepipe会覆盖自动检测需要特别留意两条优先级规则文档明确说明pkg/cli/option_parse.go 的帮助文本也复述了同样的语义只要命令行指定了--prepipe或--prepipex它就替换掉一切基于文件扩展名的自动检测决定——即使文件叫foo.gz也会按你指定的外部命令来处理同理若同时指定了--prepipe/--prepipex则--gzin/--bz2in/--zin/--zstdin四个内建标志全部被忽略。原因显而易见从 pkg/lib/file_readers.go 的OpenFileForRead可以看到prepipe非空时直接返回外部管道句柄根本不会进入内建编码的分支。安全边界.mlrrc中的限制由于--prepipe/--prepipex会执行任意外部命令存在被恶意利用执行意外代码的风险因此这两个标志不允许出现在.mlrrc配置文件中。实现位于 pkg/climain/mlrcli_mlrrc.go 的handleMlrrcLine遇到--prepipe、--prepipex以及同样危险的--load、--mload时直接返回未识别该行被静默忽略。不过.mlrrc中可以使用四个固定等价物白名单式替代见 pkg/cli/option_parse.go可在.mlrrc中使用的标志等价于--prepipe-gunzip--prepipe gunzip--prepipe-zcat--prepipe zcat--prepipe-zstdcat--prepipe zstdcat--prepipe-bz2--prepipe bz2这组标志的命令是写死在代码里的常量不接受用户输入因此不构成任意代码执行风险。关于.mlrrc的完整用法参见 customization.md。另一个安全细节在把文件名拼入 shell 命令前Miller 会调用 pkg/lib/file_readers.go 的escapeFileNameForPopen做转义——对文件名中的单引号、双引号分别用单引号包裹对含空白的文件名整体加单引号从而避免 shell 注入外部命令本身最终通过 pkg/lib/halfpipe.go 的OpenInboundHalfPipe以/bin/sh -c ...方式启动Windows 上为cmd /c这也是为什么--prepipe天然支持管道符和重定向等 shell 语法。压缩输出三种写入压缩文件的方式以上全部内容围绕压缩输入展开。压缩输出则有三种典型路径1. 标准输出管道最常用Miller 默认把结果写到 stdout因此直接接管道即可mlr sort -n quantity foo.csv | gzip sorted.csv.gz这是最简单、最通用的做法任何压缩/加密/传输工具都能以这种方式参与。2.tee语句内重定向当使用 DSL 的tee语句 把输出写到文件而非 stdout时可以用tee的重定向语法指定压缩命令。官方示例将example.csv按color拆分成三个 gzip 文件mlr --from example.csv --csv put -q filename $color..csv.gz; tee | gzip .filename, $* 生成的文件确认为 gzip 格式file red.csv.gz purple.csv.gz yellow.csv.gzred.csv.gz: gzip compressed data, last modified: Mon Aug 23 02:34:05 2021, from Unix, original size modulo 2^32 185 purple.csv.gz: gzip compressed data, last modified: Mon Aug 23 02:34:05 2021, from Unix, original size modulo 2^32 164 yellow.csv.gz: gzip compressed data, last modified: Mon Aug 23 02:34:05 2021, from Unix, original size modulo 2^32 158这些压缩输出之后仍可被 Miller 直接读回自动检测再次生效mlr --csv cat yellow.csv.gzcolor,shape,flag,k,index,quantity,rate yellow,triangle,true,1,11,43.6498,9.8870 yellow,circle,true,8,73,63.9785,4.2370 yellow,circle,true,9,87,63.5058,8.3350tee | gzip ...的重定向底层由 pkg/lib/halfpipe.go 的OpenOutboundHalfPipe实现Miller 把数据写入管道写端子进程的 stdout/stderr 直接透传gzip在另一端完成压缩落盘。3. 原地模式-I自动重压缩使用 原地模式 的-I标志时被覆盖写回的文件在可能的情况下会自动重新压缩即输入是 gzip 压缩的输出依然是 gzip 压缩的。这一点由 pkg/lib/file_readers.go 的WrapOutputHandle保证——gzip 与 zlib 都支持写端压缩包装。但有两个必须知道的限制详见 reference-main-in-place-processing.mdbzip2 不支持原地重压缩受 Go 标准库所限compress/bzip2只读不写WrapOutputHandle对FileInputEncodingBzip2会直接返回bzip2 is not currently supported for in-place mode错误。换言之对.bz2文件使用-I会失败GZIP 和 ZLIB 则可以正常重压缩gzip 压缩级别不保留mlr -I ... yourfile.gz会以 gzip 默认级别重新压缩Miller 不尝试探测或模仿原文件的压缩级别--prepipe/--prepipex输入不可原地更新IsUpdateableInPlacepkg/lib/file_readers.go明确拒绝带外部管道的输入因为 Miller 无从知道如何反转该外部命令同理http://、https://、file:// 等 URL 输入也不可原地更新。源码级实现链路小结把整条压缩数据流串起来看参数解析pkg/cli/option_parse.go 的CompressedDataFlagSection统一注册全部压缩相关标志并把选择写入ReaderOptions.Prepipe/PrepipeIsRaw/FileInputEncoding打开输入pkg/lib/file_readers.go 的OpenFileForRead按prepipe 优先 → 内建编码 → 扩展名推断三级决策返回解压后的读取句柄内建解压openEncodedHandleForRead按编码分别包装 gzip/zlib/bzip2/zstd Readerpkg/lib/file_readers.go外部解压openPrepipedHandleForRead拼接命令区分与直接传参OpenInboundHalfPipe以 shell 子进程方式启动pkg/lib/halfpipe.go压缩输出stdout 管道、tee | 命令重定向OpenOutboundHalfPipe、-I原地模式的WrapOutputHandle安全护栏.mlrrc拒绝自由命令pkg/climain/mlrcli_mlrrc.go、文件名 shell 转义escapeFileNameForPopen。完整的端到端验证可参考仓库测试目录 test/cases/io-compressed-input其 16 个用例覆盖了四种格式 ×自动检测/手动标志×文件/标准输入的全部组合以及--prepipe与文件/标准输入的配合测试数据文件位于 test/input/medium.gz、test/input/medium.bz2、test/input/medium.z、test/input/medium.zst。使用建议与注意事项汇总优先用内建解压.gz/.bz2/.z/.zst文件直接传文件名即可零配置、跨平台一致纯 Go 实现无外部依赖stdin 场景必须手动声明格式管道没有扩展名用--gzin/--bz2in/--zin/--zstdin奇特的压缩格式或自定义过滤器用--prepipe读 stdin 的程序或--prepipex读文件名的程序命令带参记得整体加引号.mlrrc中只能用白名单四件套--prepipe-gunzip、--prepipe-zcat、--prepipe-zstdcat、--prepipe-bz2-I原地模式gzip/zlib 输入可自动重压缩bzip2 与 prepipe 输入不行文档生成说明本文所依据的 reference-main-compressed-data.md 由同目录的.md.in源文件经 docs/src/genmd-filterRuby 脚本处理GENMD-RUN-COMMAND等实时执行宏生成其中tee压缩示例特意采用非实时呈现因为 gzip 默认在头部写入时间戳每次重新生成都会产生文件差异不利于版本控制——这也是实际使用tee | gzip ...时可能遇到的现象若希望输出可复现可自行在命令中加入gzip -n之类的时间戳抑制参数。赞分享CLI数据分析【免费下载链接】millerMiller is like awk, sed, cut, join, and sort for name-indexed data such as CSV, TSV, and tabular JSON项目地址https://gitcode.com/gh_mirrors/mi/miller点击查看免费下载相关推荐SpoofDPI数据压缩gzip压缩与传输优化SpoofDPI数据压缩gzip压缩与传输优化 还在为网络限速和流量监控烦恼吗SpoofDPI作为专业的反审查工具不仅提供深度包检测Deep Packe网络安全3分钟快速上手drawio-desktop开源流程图工具完整指南3分钟快速上手drawio desktop开源流程图工具完整指南 还在为复杂的流程图工具烦恼吗 每次打开浏览器才能画图担心数据安全或者被各种付费订阅桌面应用图形学Rose/verdict-classifier未来路线图多模态事实核查和实时检测的终极指南Rose/verdict classifier未来路线图多模态事实核查和实时检测的终极指南 在当今信息爆炸的时代 Rose/verdict classifi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

Godot-MCP 代码实现解析:execute_editor_script 如何动态执行任意 GDScript
Godot-MCP 代码实现解析:execute_editor_script 如何动态执行任意 GDScript

Godot-MCP 代码实现解析:execute_editor_script 如何动态执行任意 GDScript 【免费下载链接】Godot-MCP An MCP for Godot that lets you create and edit games in the Godot game engine with tools like Claude 项目地址: https://gitcode.com/gh_mirrors/god/… · 2026/9/25 2:05:53

react-vis BarSeries 完全指南:用 VerticalBarSeries / HorizontalBarSeries 构建柱状图与堆叠柱状图
react-vis BarSeries 完全指南:用 VerticalBarSeries / HorizontalBarSeries 构建柱状图与堆叠柱状图

数据可视化图表库前端 【免费下载链接】react-vis Data Visualization Components 项目地址: https://gitcode.com/gh_mirrors/re/react-vis 点击查看 免费下载 导读 Bar Series(柱状系列)是 react-vis 中用于绘制矩形柱体的核心系列组件&a… · 2026/9/25 2:05:46

IMU外参静态标定:智能小车多传感器融合的精度基石
IMU外参静态标定:智能小车多传感器融合的精度基石

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 2:05:34

oh-my-opencode-slim 内置 MCP 服务器架构:context7 与 gh_grep 的配置、权限与禁用机制
oh-my-opencode-slim 内置 MCP 服务器架构:context7 与 gh_grep 的配置、权限与禁用机制

人工智能AI AgentAgent 编排AI 技能 【免费下载链接】oh-my-opencode-slim Lean, fine tuned Opencode multi agent suite Mix any models Auto delegate tasks 项目地址: https://gitcode.com/gh_mirrors/oh/oh-my-opencode-slim 点击查看 免费下载 本文围绕 oh… · 2026/9/25 2:36:14

英伟达暑期实习笔试样题解析:GPU体系结构与深度学习考点
英伟达暑期实习笔试样题解析:GPU体系结构与深度学习考点

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 2:36:14

使用 AWS SDK for .NET 构建 Amazon SES v2 优惠券新闻邮件工作流:从联系人列表到模板化群发
使用 AWS SDK for .NET 构建 Amazon SES v2 优惠券新闻邮件工作流:从联系人列表到模板化群发

示例工程教程后端 【免费下载链接】aws-doc-sdk-examples Welcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below. 项目地… · 2026/9/25 2:36:14

【AI】前沿速递 · 2026 年 7 月:用 TaoToken 统一 Key 打通开源大模型与智能体代码工作流
【AI】前沿速递 · 2026 年 7 月:用 TaoToken 统一 Key 打通开源大模型与智能体代码工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 2:36:14

校园失物招领系统毕设资料包二次开发与答辩指南
校园失物招领系统毕设资料包二次开发与答辩指南

简介:这份资源是面向计算机相关专业在校学生与教师的校园失物招领系统毕业设计完整资料包,已获导师认可并通过答辩评审,适合作为毕设、课程设计、作业或项目初期立项演示的参考方案,也便于基础较好的学习者在此基础上二次开发扩展… · 2026/9/25 2:36:14

微信小程序汉字笔顺动画组件:Canvas渲染与避坑指南
微信小程序汉字笔顺动画组件:Canvas渲染与避坑指南

简介:这是一份面向微信小程序开发者的 Hanzi Writer 组件源码包,用于在小程序内快速集成汉字书写器,实现笔画顺序动画、写法演示与问答交互等教学功能。组件原仓库虽已停止维护,但作者提供了 npm 的 beta 安装方式,适合… · 2026/9/25 2:36:08

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码