
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 自 6.0.0 起的原生 Windows 支持展开如何获取mlr.exe、如何配置 PATH 让其在 CMD 与 MSYS2/Cygwin 中均可直接调用以及在 Windows 命令行下编写mlr put/mlr filter复杂 DSL 表达式时必然遇到的引号解析问题并给出四种可落地的绕过方案。读完本文你将能够在 Windows 上像在 Linux/macOS 上一样流畅地使用 Miller 处理 CSV、TSV 与 JSON 数据并能从源码层面理解这些差异的成因。一、为什么 Miller 6 才谈得上原生 Windows 支持Miller 最初面向 Unix 系操作系统包括 Linux 与 macOS开发。它对 Windows 的支持经历了两个阶段见 miller-on-windows.md5.2.0 起首次提供 Windows 支持但只是部分支持需要依赖 MSYS2 运行时二进制旁总是伴随一个msys2.dll。6.0.0 起Miller 直接在 Windows 上构建交付物是单个mlr.exe旁边不再有msys2.dllMSYS2 不再是必需项——当然如果你习惯在 MSYS2 里工作仍然可以继续使用。从仓库源码可以印证这一转变pkg/platform目录下按//go:build windows构建标签划分了专门的 Windows 实现如 getargs_windows.go、shellrun_windows.go、terminal_windows.go与_notwindows.go版本的 Unix 实现并行存在。也就是说Windows 下的命令行解析、shell 调用、ANSI 颜色输出等环节都有独立的代码路径而不是靠兼容层凑合。因此文档中的结论是现在在 Windows 上的使用体验几乎与 Linux、NetBSD/FreeBSD 和 macOS 上完全一致。二、获取 mlr.exe安装方式与版本核对根据 installing-miller.mdWindows 上获取mlr.exe主要有两条途径包管理器推荐使用 Chocolatey 安装choco install miller直接下载二进制从 Miller 的 releases 页面下载对应平台的压缩包也可以从 GitHub Actions 的最新构建产物Artifacts中获取 head 版本此类产物通常仅保留数天。安装完成后第一项核对是版本号mlr --version若输出形如mlr 6.0.0或mlr 5.10.3说明来自 tagged release 或包管理器若输出形如mlr 6.0.0-dev说明来自源码或近期构建产物详见 release-docs.md。第二项核对是实际跑一条命令。以仓库中的 example.csv 为例mlr --csv cat example.csv再试一次格式转换mlr --icsv --opprint cat example.csv若这两条都正常输出表格数据说明 Miller 已可用。三、Setup把 mlr.exe 放进 PATH使用前只需一步把mlr.exe所在目录加入PATH环境变量。加入后即可在任意目录的 CMD 提示符下直接调用例如mlr --c2p cat example.csv mlr --c2j filter $color yellow example.csv若要在 MSYS2/Cygwin 中使用同样只需确保mlr.exe位于PATH中MSYS2 的PATH与 Windows 的PATH相互可见也可在会话内临时追加例如export PATH$PATH:/c/miller/go。关于颜色输出Miller 在 Windows 上会主动启用 ANSI 转义序列处理。入口处通过 platform.EnableAnsiEscapeSequences() 调用 terminal_windows.go 中的实现为 stdout/stderr 开启虚拟终端处理Virtual Terminal Processing否则彩色输出会退化成←[0;30m之类的裸转义码。四、DifferencesWindows 命令行与 Unix 的根本差异4.1 单引号在 Windows 上的尽力而为Miller 在 Windows 上努力兼容 Unix 风格的单引号写法例如把mlr put $a $b . .ext这类表达式原样搬过来常常是可行的。这一能力来自 getargs_windows.go 中的GetArgs()程序启动时见 entrypoint.go 的os.Args platform.GetArgs()Miller 会读取 Windows 原始命令行windows.GetCommandLine()按 shell 规则重新切分参数再把以单引号包裹的参数段重组为单个参数——等效于帮你把 Unix 风格的单引号翻译成 Windows 能理解的形态。该函数还附带两个细节运行时检测 MSYS2通过环境变量MSYSTEM判断当前是否运行在 MSYS2 内。若是则直接返回os.Args原样参数因为 MSYS2 本身已经做好了 Unix 风格参数处理不需要 Miller 再介入。通配符展开对参数做filepath.Glob展开让*.csv之类的通配符在 Windows 下也能工作。4.2 复杂表达式为什么会在 CMD 中解析失败尽管有上述努力仍有一些复杂表达式无法从 Windows 原生提示符成功解析而在 MSYS2 中却可以。最典型的例子mlr --c2p filter $color red $flag true example.csv在 CMD 下会得到类似Parse error on token color...的解析错误而在 MSYS2 下则正常输出结果文档明确指出根本原因单引号内包含或||时在 Windows 下是根本上不可处理的——因为 Windows 命令行在把参数交给 Miller 的main()之前就已经按自己的规则完成了切分与预处理会被解释为命令连接符Miller 对此无能为力。这属于操作系统层面的限制任何程序都无法绕过。4.3 源码视角为什么 Miller 选择 CMD 而非 PowerShellshellrun_windows.go 的注释记录了 Miller 对 shell 选择的完整权衡可以帮我们理解 Miller 在 Windows 上的兼容性边界CMD 与 PowerShell 都能胜任绝大多数场景唯独行内put/filter语句中的...单引号处理不同PowerShell 稍强一些例如mlr put $flag $x 10中在 CMD 下会被当作文件重定向而 PowerShell 能识别为比较运算符但两者都不支持多行...输入PowerShell 每次调用约有 2 秒的启动延迟若回归测试改用它将被迫回到一次 shell 调用批量执行大量语句的老路难以调试结论继续使用 CMD因为更快且 PowerShell 的优势不足以抵消其启动开销带来的批处理复杂度。这也解释了为什么仓库的大量回归测试需要借助mlr -f .../cases/.../0047.mlr .../cases/.../0047.input这种表达式放文件的形式来规避 shell 差异详见下文方案二以及为什么存在test/cases/non-windows目录——其中的用例例如把emit重定向到 Unix 命令tr被明确标注为预期在 Windows 上无法工作见 non-windows/README.md。五、四种绕过方案在 Windows 下写出复杂 DSL文档给出了四种经过验证的绕过方案按推荐程度排列如下。方案一改用 MSYS2既然单引号与/||的问题根源在于 Windows 原生 shell最直接的办法就是把命令放到 MSYS2 里执行。MSYS2 的 POSIX shell 会正确处理单引号与操作符mlr.exe在其中的表现与在 Linux 上几乎一致。代价是需要额外安装 MSYS2 环境。方案二把复杂表达式写入 DSL 文件把表达式写进一个文件再用mlr filter -f或mlr put -f读取。以winx.mlr为例$color red $flag true然后mlr --c2p filter -f winx.mlr example.csv这种方式完全绕开命令行切分问题且在多行表达式、带注释的长脚本场景下可读性也更好——这正是 Miller 自己的回归测试框架采用-f读取用例文件的原因。方案三三重双引号转义另一种纯命令行技巧先把表达式中的替换为再把外层替换为。即把mlr --c2p filter $color red $flag true example.csv改写成mlr --c2p filter $color red $flag true example.csv这一写法的底层依据同样在 getargs_windows.go 的注释中Miller 在 Windows 上同时接受 Unix 风格写法mlr --icsv --ojson put $filename $basename . .ext ..\data\foo.csv也接受 Windows 风格写法mlr --icsv --ojson put $filename $basename . .ext ..\data\foo.csv两种都会被正确解析。方案四使用mlr -s脚本mlr -s是最优雅的长期方案把可复用的命令片段flags、verb 链放进一个文本文件之后只需指定数据文件名。它在 Windows 上同样可用详见 scripting.md 的 Miller scripts on Windows 一节。例如创建无 shebang 的example-mlr-s-script-no-shebang--c2p filter $quantity ! 20 then count-distinct -f shape then fraction -f count然后执行mlr -s example-mlr-s-script-no-shebang example.csv输出shape count count_fraction triangle 3 0.3 square 4 0.4 circle 3 0.3mlr -s在 Windows 上可行是因为它不需要chmod x与#!shebang 这类 Unix 机制。其实现位于 mlrcli_shebang.go 的maybeInterpolateDashS()Miller 读取脚本文件内容规范化\r\n行尾剥离首行#!若存在默认还会把#到行尾的注释全部剥除可用mlr --s-no-comment-strip关闭然后按 shell 规则把内容切分为参数序列插入到命令行中 verb 位置并为后续附加参数自动补上--分隔符。这意味着不需要行连接符反斜杠\不需要显式写--与$脚本内的多行复杂表达式天然不受 Windows 命令行切分影响。配合 mlrcli_parse.go 中描述的两遍命令行解析第一遍把命令行切分为主 flags 序列 / verb 序列 / 数据文件名第二遍再按序构造 options 与 transformermlr -s展开出的参数可以与命令行上的额外 flags如--ojson自由组合实现脚本管处理逻辑、命令行管文件与格式的分工。六、总结Windows 使用的三条经验法则安装与配置choco install miller或下载二进制把mlr.exe加入PATH用mlr --version与mlr --csv cat example.csv验证参考 installing-miller.md。表达式越简单越通用单引号表达式在 CMD 下通常可以直接用一旦涉及、||或多行 DSL优先切换到 MSYS2、-f文件、三重双引号或mlr -s四种方案之一。理解边界/||在单引号内的失败是 Windows 命令行切分的固有行为不是 Miller 的缺陷test/cases/non-windows目录的存在也提醒我们部分依赖 Unix 命令的用法如管道到tr在 Windows 上并不适用。至此你已能在 Windows 上完成 Miller 的安装、验证与复杂 DSL 表达式的全套绕过策略并清楚其背后的源码实现原理。赞分享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点击查看免费下载相关推荐Ceph 在 Windows 上的原生安装与配置指南Ceph 在 Windows 上的原生安装与配置指南 Ceph 的客户端工具与库 rbd 、 ceph dokan 、 librbd.dll 、 libcep存储分布式文件系统对象存储后端高可用Pandoc 的 reStructuredText 引用定义转义冒号与复杂引用名的解析原理7568 解析Pandoc 的 reStructuredText 引用定义转义冒号与复杂引用名的解析原理 7568 解析 本篇技术指南以 pandoc 仓库中的命令测试文档开发工具CLISpack 在 Windows 上的完整安装、配置与使用指南Spack 在 Windows 上的完整安装、配置与使用指南 本指南面向需要在 Windows 机器上运行 Spack 的开发者内容严格遵循 Spack 官方开发工具构建工具CLI上一篇3D视频转2D终极指南用VR-Reversal解锁沉浸式观影新体验下一篇H5GG iOS脚本引擎终极指南三分钟掌握无需越狱的游戏修改神器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考