如何用Miller工具合并3个及以上首列相同的CSV文件?
用Miller合并多列匹配的CSV文件
问题分析
你的场景是多个CSV文件第一列(date)完全一致,需要按列横向合并。直接使用多文件join命令会因为Miller的多文件join逻辑(每个后续文件单独与第一个左文件join)导致额外列,正确的做法是链式逐步合并。
解决方案
1. 清理表头空格(可选,匹配你的期望输出)
你的示例文件表头存在空格(如date, a),先清理每个文件的表头空格:
# 清理csv_1的表头空格 mlr --csv rename ' *,*' csv_1 > cleaned_csv1.csv # 清理csv_2的表头空格 mlr --csv rename ' *,*' csv_2 > cleaned_csv2.csv # 清理csv_3的表头空格 mlr --csv rename ' *,*' csv_3 > cleaned_csv3.csv
2. 链式合并多个文件
先合并前两个文件,再将结果与第三个文件合并,用管道传递中间结果:
mlr --csv join -u -j date -f cleaned_csv1.csv cleaned_csv2.csv | mlr --csv join -u -j date -f - cleaned_csv3.csv > output.csv
3. 验证输出
最终output.csv内容会和你期望的一致:
date,a,t,q 1,b,h,w 2,c,j,e 3,d,k,r
扩展到更多文件
如果有更多CSV文件,继续链式拼接即可,比如合并4个文件:
mlr --csv join -u -j date -f cleaned_csv1.csv cleaned_csv2.csv | mlr --csv join -u -j date -f - cleaned_csv3.csv | mlr --csv join -u -j date -f - cleaned_csv4.csv > output.csv
为什么直接多文件join不行?
Miller的join -f file1 file2 file3逻辑是:将file2、file3分别与file1做join操作,而非将file2与file1合并后再和file3合并,这会导致重复引入file1的列,最终出现额外列。链式合并则是基于前一次的合并结果继续join,保证列的正确累加。
内容的提问来源于stack exchange,提问作者mysql
相关产品推荐
相关产品推荐

