csplit - 按行号或内容模式分割文件

csplit 根据行号或上下文模式把输入拆分为多个文件。与按固定大小或行数分割的 split 相比,它更适合按照标题、标记行或记录边界分割。

默认输出文件名为 xx00xx01 等,并输出每个文件的字节数。

常用参数

  • -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.txtpart_001.txt

安全建议

csplit 会在当前目录创建多个文件。正式处理前先在空的临时目录中用副本试运行,并选择不会与现有文件冲突的前缀。

参考资料