使用Miller处理超大TSV文件无输出,如何排查故障?
问题
处理一个超大TSV文件(约5000列、500000条记录),结构示例如下:
f.ID f.1.0.0 f.2.0.0 f.3.0.1 f.3.0.2 1 A 22 B32 -1 2 F 38 B1 65
有一个同格式的关联文件(共享关联键f.ID),在该关联文件上执行以下命令可正常输出:
$ mlr --itsv cut -f f.ID file1.tab | head -n2 f.ID=1 f.ID=2
但在目标文件file2.tab上执行相同命令时,Miller无任何标准输出:
$ mlr --itsv cut -f f.ID file2.tab | head -n2
怀疑文件格式不符合标准,但难以排查,想知道如何查看Miller的每条记录处理过程或定位故障点。
排查方法
1. 启用Miller调试日志
Miller自带调试参数,通过-d或--debug可以输出详细的处理过程,包括每行的解析状态、字段识别情况。执行命令时把标准错误重定向到标准输出,就能看到调试信息:
mlr --itsv -d cut -f f.ID file2.tab 2>&1 | head -n50
重点关注字段解析失败提示、字段数量不匹配信息,或是编码相关报错。
2. 检查原始字符格式
超大文件可能存在非标准分隔符(空格/制表符混合、隐藏控制字符),用以下命令查看前几行的原始字符:
# 查看前20行的ASCII码及对应字符 od -a file2.tab | head -n20 # 显示所有控制字符(制表符显示为^I,Windows换行符显示为^M) cat -A file2.tab | head -n5
如果发现是Windows换行符问题,可先转换格式再测试:
dos2unix file2.tab
3. 缩小测试范围
直接处理全量文件效率低,先提取前N行生成小测试文件,快速定位问题范围:
# 提取前10行到临时文件 head -n10 file2.tab > test_small.tab # 用Miller处理小文件 mlr --itsv cut -f f.ID test_small.tab
如果小文件能正常输出,说明问题出在后续行;如果仍无输出,就重点排查前10行的格式问题。
4. 验证表头正确性
Miller依赖表头识别字段,若表头行有拼写错误、额外空格或隐藏字符,会导致无法匹配f.ID。单独提取表头行检查:
head -n1 file2.tab | cat -A
对比正常文件的表头,确认f.ID的拼写和格式完全一致,无多余字符。
5. 用Miller的check命令验证格式
Miller的check命令专门用于验证文件是否符合指定输入格式,会输出具体错误位置和原因:
mlr --itsv check file2.tab 2>&1 | head -n30
内容的提问来源于stack exchange,提问作者Giulio Centorame
相关产品推荐
相关产品推荐

