如何拆分30GB的bz2文件、为分片加表头并按timestamp按日拆分
解决方案
你可以直接使用流式处理工具awk实现按日期拆分+自动加表头+压缩输出的需求,不需要用到split命令,完整处理命令如下:
bzcat logging.abc_gps.bz2 | pv | awk -F'\t' ' BEGIN { # 预定义制表符分隔的表头 header = "a\tb\tc\td\te\tf\ttimestamp" } { # 提取行中的日期字段,示例数据中日期为第8个字段,可根据实际情况修改 cur_date = $8 # 若当前日期对应的输出文件未初始化 if (!(cur_date in output_pipes)) { # 初始化对应日期的bzip2压缩输出管道 output_pipes[cur_date] = "bzip2 > splitted_file_" cur_date ".csv.bz2" # 先写入表头 print header | output_pipes[cur_date] } # 写入当前行数据到对应日期的压缩文件 print $0 | output_pipes[cur_date] } END { # 处理完所有行后关闭所有输出管道,确保压缩文件完整 for (dt in output_pipes) { close(output_pipes[dt]) } } '
说明
- 整个过程为流式处理,不需要加载全量30GB文件到内存,资源占用极低,适合大文件处理
- 输出文件自动按日期命名,完全匹配你要求的
splitted_file_2021-01-01.csv.bz2格式 - 每个输出的压缩文件自动添加指定的表头
- 如果你的实际数据中日期所在的字段序号和示例不一致,修改
cur_date = $8中的数字即可(字段从左到右从1开始计数) - 如果需要批量处理多个bz2文件,将开头的
bzcat logging.abc_gps.bz2替换为bzcat *.bz2即可,所有文件的数据会自动合并按天拆分
内容的提问来源于stack exchange,提问作者MALAM
相关产品推荐
相关产品推荐

