如何按重复分隔符拆分大文本文件(而非按行数或精确大小)
基于Unix工具的文件拆分方案
核心思路
用awk将All.asc以=======分隔符识别为独立记录(对应原单个文本文件内容+分隔符),累加记录大小,当总大小接近1MB时切换到新输出文件,确保单个原文件内容不会被拆分。
具体实现命令
拆分脚本代码
将以下内容保存为split.awk文件:
BEGIN { RS="\r?\n=======\r?\n" # 适配Windows/DOS的CRLF换行,精准匹配分隔符行 OFS="\r\n" # 保持输出为CRLF格式 file_num=1 current_size=0 target_size=1024*1024 # 1MB阈值,可按需微调 out_file=sprintf("split_%02d.asc", file_num) } { # 计算当前记录的总大小(含后续要追加的分隔符) record_size=length($0) + length(RS) # 若加入当前记录会超阈值且已有内容,切换新文件 if (current_size + record_size > target_size && current_size > 0) { close(out_file) file_num++ out_file=sprintf("split_%02d.asc", file_num) current_size=0 } # 写入当前记录 print $0 > out_file # 非最后一条记录,追加分隔符 if (NR != FNR) { print "=======" > out_file } current_size += record_size } END { close(out_file) }
执行方式
在命令行中运行:
awk -f split.awk D:\@temp\All.asc
细节说明
- 适配Windows/DOS格式的CRLF换行,避免因换行符差异导致分隔符匹配失败
- 输出文件按
split_01.asc、split_02.asc...命名,保证顺序清晰 - 自动跳过最后一条记录后的多余分隔符,还原原文件的结构逻辑
- 可调整
target_size的值(比如改为1000000),更贴近"约1MB"的需求
可选优化方案
如果需要更精准的大小控制,可先预统计所有记录大小再批量写入:
BEGIN { RS="\r?\n=======\r?\n" OFS="\r\n" } { records[NR] = $0 sizes[NR] = length($0) + length(RS) } END { file_num=1 current_size=0 target_size=1024*1024 out_file=sprintf("split_%02d.asc", file_num) for (i=1; i<=NR; i++) { if (current_size + sizes[i] > target_size && current_size >0) { close(out_file) file_num++ out_file=sprintf("split_%02d.asc", file_num) current_size=0 } print records[i] > out_file if (i != NR) { print "=======" > out_file } current_size += sizes[i] } close(out_file) }
内容的提问来源于stack exchange,提问作者user2574126
相关产品推荐
相关产品推荐

