csplit - 按行号或内容模式分割文件
csplit 根据行号或上下文模式把输入拆分为多个文件。与按固定大小或行数分割的 split 相比,它更适合按照标题、标记行或记录边界分割。
默认输出文件名为 xx00、xx01 等,并输出每个文件的字节数。
常用参数
-f PREFIX、--prefix=PREFIX:指定输出文件名前缀。-b FORMAT、--suffix-format=FORMAT:指定printf风格的后缀格式。-n DIGITS、--digits=DIGITS:指定数字后缀位数。-k、--keep-files:出错或中断时保留已经生成的文件。-q、-s、--quiet:不输出文件大小。-z、--elide-empty-files:不生成空文件。--suppress-matched:不把匹配到的边界行写入输出。
按行号分割
# 在第 100 行之前分割
csplit filename 100
# 使用三位数字后缀
csplit -n 3 filename 100
# 指定前缀
csplit -f part_ filename 100行号模式 N 会把第 N 行之前的内容写入当前输出文件,第 N 行成为下一部分的开头。
重复固定行数
# 第一部分为前 19 行,之后重复按 20 行分割直到输入结束
csplit filename 20 '{*}'{*} 表示尽可能重复前一个模式,直到输入处理完毕。
按内容模式分割
# 每遇到以“Chapter”开头的行就开始一个新文件
csplit -z -f chapter_ filename '/^Chapter/' '{*}'如果不希望边界行出现在输出中:
csplit --suppress-matched -z -f section_ filename '/^---$/' '{*}'自定义文件名
csplit -f part_ -b '%03d.txt' filename '/^Chapter/' '{*}'输出文件名类似 part_000.txt、part_001.txt。
安全建议
csplit 会在当前目录创建多个文件。正式处理前先在空的临时目录中用副本试运行,并选择不会与现有文件冲突的前缀。