请求编写Linux脚本:按行数分割订单文件且订单不跨文件
零售订单文件智能分割脚本实现
完全可以用Linux下的awk脚本实现这个需求,下面是针对你的场景编写的脚本,满足「同一订单不拆分到多个文件」「每个子文件最多指定行数」的要求(假设单个订单的记录数不超过最大行数限制)。
分割脚本
#!/bin/bash # 配置参数 MAX_LINES=5 # 每个子文件的最大记录行数(不含表头) INPUT_FILE="orders.csv" # 输入的订单文件 OUTPUT_PREFIX="sub_file" # 输出子文件的前缀 # 使用awk处理分割 awk -v max_lines="$MAX_LINES" -v prefix="$OUTPUT_PREFIX" ' BEGIN { file_num = 1 current_lines = 0 # 初始化第一个输出文件并写入表头 output_file = prefix file_num getline header print header > output_file } # 处理数据行 NR > 1 { current_order = $1 # 如果是新订单,先统计该订单的总记录数 if (current_order != prev_order) { order_count = 0 temp_line = $0 # 预读后续行统计当前订单的总条数 while (getline next_line > 0) { if (next_line ~ "^" current_order) { order_count++ temp_lines[order_count] = next_line } else { ungetline(next_line) break } } order_count++ # 加上当前行 temp_lines[1] = $0 # 检查当前文件剩余行数是否能容纳整个订单 if (current_lines + order_count > max_lines) { # 切换新文件并写入表头 file_num++ output_file = prefix file_num print header > output_file current_lines = 0 } # 写入当前订单的所有行 for (i=1; i<=order_count; i++) { print temp_lines[i] > output_file current_lines++ } prev_order = current_order } } ' "$INPUT_FILE"
脚本说明
- 参数配置:开头的变量可按需修改,比如调整最大行数、输入文件路径或输出文件前缀。
- 表头处理:每个新生成的子文件都会自动写入原始文件的表头。
- 订单完整性保障:遇到新订单时,先预读统计该订单的所有记录数,避免拆分订单。
- 文件切换逻辑:如果当前文件剩余行数不足以容纳整个订单,自动创建新文件并重置行数计数器。
使用步骤
- 将脚本保存为
split_orders.sh,赋予执行权限:chmod +x split_orders.sh - 确保输入文件已按order_nu排序(未排序的话先执行
sort -k1,1 orders.csv > sorted_orders.csv,再修改脚本中的INPUT_FILE为排序后的文件) - 运行脚本:
./split_orders.sh
示例验证
针对你提供的示例输入,设置MAX_LINES=5运行脚本后,会生成:
sub_file1:包含订单1(3行)+订单2(2行),共5条记录sub_file2:包含订单3(2行)sub_file3:包含订单4(5行)sub_file4:包含订单5(3行)
完全符合你的预期输出。
内容的提问来源于stack exchange,提问作者Maxx c
相关产品推荐
相关产品推荐

