Linux / コマンド / csplit - 行番号・パターンでファイルを分割

csplitは、ファイルを一定のサイズではなく、行番号または一致するパターンが現れる位置で分割します。セクション境界のあるテキストを分けるときに便利です。

分割ポイントとファイル名の接頭辞を指定すると、文書の構造に合わせた分割ファイルを作成できます。基本的な出力ファイル名はxx00のように作成されるため、他の作業ファイルと重ならない専用ディレクトリと接頭辞を使用してください。

基本的な文法

csplit [オプション] 入力ファイル パターン ...

インストールされている実装とオプションは、配布版によって異なる場合があります。man csplitで現在のシステムの説明を確認してください。

使用例

行番号で分割

読み取り可能な notes.txt を用意します。11行目から2つ目のファイルが始まります。最初のファイルには最初の10行が入ります。

csplit -f part- notes.txt 11

パターンで分割

読み取れる report.txt を用意します。最初に基本正規表現 ^Chapter に一致する行の直前で分け、その行は2つ目の分割ファイルに含めます。

csplit -f section- report.txt '/^Chapter /'

複数の一致で繰り返し分割

book.txt に複数の章見出しを用意します。GNU版の {*} で以後の一致でも分割し、最後は入力の終わりまでを保存します。シェルによる展開を避けるため、例の引用符を保ってください。

csplit -f chapter- book.txt '/^Chapter /' '{*}'

パターン基準で分かれたファイルを見る

以下は独立した例です。同名ファイルのない書き込み可能な作業ディレクトリで試します。csplit は指定した正規表現に一致する行の直前で入力を分割します。-s は基本的に出力される各分割ファイルのバイト数を隠します。

printf 'one\nTWO\ntwo\n' > sample.txt
csplit -s -f part- sample.txt '/^TWO$/'
cat part-00
cat part-01

2つの cat コマンドを順に実行した例の出力:

one
TWO
two

part-00 には one の行、part-01 には一致した TWO の行から最後までが入ります。通常の正規表現パターンが見つからないとエラーになります。また、既存の分割ファイルを上書きする可能性があるため、サンプルファイルと出力のプレフィックスは別作業ディレクトリで使用してください。

主なオプションと形式

オプション・形式 説明
-f 接頭辞 分割ファイル名の前部分を決定します。
-n N 数字接尾辞の桁数を決定します。
-s 各分割ファイルのバイトサイズの出力を隠します。
-z 空の出力ファイルは作成しません。
-k エラーが発生しても、既に作成された分割ファイルは保持されます。

使用する際の注意点

パターンがない場合や境界が予想と異なる場合、分割ファイルの数や位置が変わります。テスト入力で結果を事前に確認し、既存の名前の出力ファイルがあるディレクトリで実行しないでください。一致位置が先頭なら空の分割ファイルもできるため、不要なら -z を検討します。GNU版は通常、エラー時に今回作った出力を削除しますが、-k なら途中までの出力が残ります。失敗時に残ったファイルを完全な結果と判断しないでください。splitによるサイズ・行数ごとの分割 と、内容の境界による分割を使い分けます。

よくある質問

splitとcsplitのどちらを使いますか?

サイズ・行数で均等に分けるならsplit、特定の行番号やタイトルパターンで分けるならcsplitが適しています。

公式ドキュメント

オプションの正確な動作と実装ごとの違いは、csplitに関する公式ドキュメントで確認できます。