csplitコマンドはsplitコマンドと同様にファイルを分割するコマンドになります。
splitコマンドと異なる点は、例えば、ファイル分割の方法を正規表現を指定して、パターンにマッチした箇所で内容が始まるようにファイルを分割できます。
また、csplitコマンドは出力として分割したファイルのサイズを結果として表示します。
csplitコマンドの使い方
csplitコマンドは入力ファイルとパターンを指定して、ファイルを分割します。ファイルを分割できた場合、コマンドの出力結果として、分割したファイルのサイズが表示されます。
csplitコマンドで利用できるパターンは主に3つのタイプがあります。1つ目は何行目で分割するか、2つ目は正規表現で分割するか、3つ目は前に指定したパターンの分割方法を何回繰り返すかになります。
基本的にパターン1つにつき、1回の分割になります。
file.txt
1 2 3 4 5 6 7 8 9 10 |
1 2 3 1 2 3 1 2 3 1 |
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$csplit file.txt 3 4 16 $ $ls file.txt xx00 xx01 $ $head xx* ==> xx00 <== 1 2 ==> xx01 <== 3 1 2 3 1 2 3 1 |
何回分割するかを指定する場合、パターンの後に'{repeat-count}'で、指定します。
この'{repeat-count}'は、実際には前のパターンを2回繰り返す場合'{2}'とし、入力ファイルが終了するまで指定する場合は'{*}'を指定します。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
$csplit file.txt 3 '{2}' 4 6 6 4 $ls file.txt xx00 xx01 xx02 xx03 $ $head xx* ==> xx00 <== 1 2 ==> xx01 <== 3 1 2 ==> xx02 <== 3 1 2 ==> xx03 <== 3 1 |
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
$csplit file.txt '/^2$/' '{*}' 2 6 6 6 $ $ls file.txt xx00 xx01 xx02 xx03 $ $head xx* ==> xx00 <== 1 ==> xx01 <== 2 3 1 ==> xx02 <== 2 3 1 ==> xx03 <== 2 3 1 |
csplitコマンドのパターンについて
csplitコマンドの構文は
csplit [option]... input... pattern...
で、inputは入力ファイル、patternはcsplitコマンドで利用できるパターンになります。
csplitコマンドのパターンには、主に3つのパターンがあります。1つ目は何行目での分割、2つ目は正規表現での分割、3つ目は前のパターンの繰り返しです。
また、それぞれの分割パターンに対して、下のファイルを分割します。
file.txt
1 2 3 4 5 6 7 8 9 10 |
1 2 3 1 2 3 1 2 3 1 |
何行目での分割:n
何行目で分割するかどうかは単純に数字を指定することで、その行数で分割することができます。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$csplit file.txt 3 4 16 $head xx* ==> xx00 <== 1 2 ==> xx01 <== 3 1 2 3 1 2 3 1 |
このパターンを繰り返した場合、次のn行目までを分割します。また、csplitコマンドはエラーが出るとそれまでに分割したファイルはすべて削除されます。エラーが出た時にファイルを削除されないためには、-kオプションを使用する必要があります。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
$csplit -k file.txt 3 '{*}' 4 6 6 csplit: `3': 範囲外の行番号 繰り返し 3 回目 4 $ls file.txt xx00 xx01 xx02 xx03 $ $head xx* ==> xx00 <== 1 2 ==> xx01 <== 3 1 2 ==> xx02 <== 3 1 2 ==> xx03 <== 3 1 |
正規表現での分割:/regexp/[offset]
正規表現での分割を行う場合、'/regexp/'または'%regexp%'でパターンを指定することができます。また、'/regexp/1'や'/regexp/-1'のようにoffsetを加えると正規表現にマッチした行からoffset分だけずらして分割できます。
コマンド例と実行結果(/regexp/)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$csplit file.txt '/2/' '{*}' 2 6 6 6 $head xx* ==> xx00 <== 1 ==> xx01 <== 2 3 1 ==> xx02 <== 2 3 1 ==> xx03 <== 2 3 1 |
offsetが正の数の場合、マッチしたパターンの行から後ろの行にずらすことができます。
コマンド例と実行結果(/regexp/1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$csplit file.txt '/2/1' '{*}' 4 6 6 4 $head xx* ==> xx00 <== 1 2 ==> xx01 <== 3 1 2 ==> xx02 <== 3 1 2 ==> xx03 <== 3 1 |
offsetが府の数の場合、マッチしたパターンの行から前の行にずらすことができます。
コマンド例と実行結果(/regexp/-1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$csplit file.txt '/2/-1' '{*}' 0 6 6 8 $head xx* ==> xx00 <== ==> xx01 <== 1 2 3 ==> xx02 <== 1 2 3 ==> xx03 <== 1 2 3 1 |
csplitコマンドの利用例
ファイルを分割する
(オプションなし)
csplitコマンドは、入力ファイルとパターンを引数にすることでファイルを分割することができます。分割されたファイルはデフォルトでは、'xx'の後に2桁の数字が入ったファイルが作成されます。標準入力を入力ファイルとする場合は'-'を利用することができます。
また、csplitコマンドが実行された結果は、分割されたファイルサイズが表示されます。
分割されたファイルは'cat xx*'のようにソートされた順番で結合することで元に戻すことができます。
コマンド例と実行結果
1 2 3 |
$seq 10 | csplit - 3 4 17 |
分割されたファイル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ls xx00 xx01 $ $head xx* ==> xx00 <== 1 2 ==> xx01 <== 3 4 5 6 7 8 9 10 |
実行結果の分割後ファイルサイズを表示しない
(-sオプション)
-sオプション(--silentオプション)または-qオプション(--quietオプション)を用いることで、csplitコマンドの実行結果の分割後ファイルサイズを表示しないようにできます。
コマンド例と実行結果
1 2 3 4 5 6 |
$ls file.txt $ $csplit -s file.txt 3 $ls file.txt xx00 xx01 |
分割されたファイルの名前の接頭辞を変更
(-fオプション)
-fオプションを用いることで、分割されたファイルの名前'xx'を別の名前に変更できます。
コマンド例と実行結果
1 2 3 |
$csplit -f splitfile file.txt 3 4 16 |
分割されたファイル
1 2 |
$ls file.txt splitfile00 splitfile01 |
分割されたファイルの接尾辞を変更
(-bオプション)
-bオプションを用いることで分割されたファイルに付けられる接尾辞(00,01,...の部分)を変更できます。
-bオプションで指定する接尾辞はC言語のprintfのような形式で指定することができます。
-bオプションで変更する場合は、分割されたファイルの数字が入るようにフォーマット形式を入れる必要があります。
使用できるフォーマット形式は、
%u(10進数)
%o(8進数)
%x(16進数,アルファベット小文字)
%X(16進数,アルファベット大文字)
になります。また、%uの別形式として、%iや%dを用いることができます。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
$seq 15 | csplit -s -b '%u' - '/./' '{*}' $ls xx0 xx10 xx12 xx14 xx2 xx4 xx6 xx8 xx1 xx11 xx13 xx15 xx3 xx5 xx7 xx9 $rm xx* $seq 15 | csplit -s -b '%o' - '/./' '{*}' $ls xx0 xx10 xx12 xx14 xx16 xx2 xx4 xx6 xx1 xx11 xx13 xx15 xx17 xx3 xx5 xx7 $rm xx* $seq 15 | csplit -s -b '%x' - '/./' '{*}' $ls xx0 xx1 xx2 xx3 xx4 xx5 xx6 xx7 xx8 xx9 xxa xxb xxc xxd xxe xxf $rm xx* $seq 15 | csplit -s -b '%X' - '/./' '{*}' $ls xx0 xx1 xx2 xx3 xx4 xx5 xx6 xx7 xx8 xx9 xxA xxB xxC xxD xxE xxF $rm xx* $seq 15 | csplit -s -b '%04u' - '/./' '{*}' $ls xx0000 xx0002 xx0004 xx0006 xx0008 xx0010 xx0012 xx0014 xx0001 xx0003 xx0005 xx0007 xx0009 xx0011 xx0013 xx0015 $rm xx* $seq 15 | csplit -s -b '%02u.txt' - '/./' '{*}' $ls xx00.txt xx02.txt xx04.txt xx06.txt xx08.txt xx10.txt xx12.txt xx14.txt xx01.txt xx03.txt xx05.txt xx07.txt xx09.txt xx11.txt xx13.txt xx15.txt |
分割されたファイルの接尾辞の桁数を変更
(-nオプション)
-nオプションで数字を指定することで、ファイルの接尾辞の数字をデフォルトの2桁から変更することができます。
コマンド例と実行結果
1 2 3 4 |
$seq 15 | csplit -s -n 3 - '/./' '{*}' $ls xx000 xx002 xx004 xx006 xx008 xx010 xx012 xx014 xx001 xx003 xx005 xx007 xx009 xx011 xx013 xx015 |
エラー時にファイルを削除しない
(-kオプション)
csplitコマンドはエラーが起きた時に、分割したファイルを削除します。エラーが起きた時にファイルを削除しないようにするには、-kオプションを用いる必要があります。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 |
$ls file.txt $ $csplit -s file.txt '1' '{*}' csplit: `1': 範囲外の行番号 繰り返し 10 回目 $ls file.txt $ $csplit -k -s file.txt '1' '{*}' csplit: `1': 範囲外の行番号 繰り返し 10 回目 $ls file.txt xx00 xx01 xx02 xx03 xx04 xx05 xx06 xx07 xx08 xx09 xx10 |
空ファイルを作成しない
(-zオプション)
パターンによっては、csplitコマンドはからファイルを作成する場合があります。
-zオプションを用いると空ファイルを作成しません。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$seq 2 | csplit -k - '1' '{*}' 0 2 2 csplit: `1': 範囲外の行番号 繰り返し 2 回目 $ls xx00 xx01 xx02 $rm * $ $seq 2 | csplit -z -k - '1' '{*}' 2 2 csplit: `1': 範囲外の行番号 繰り返し 2 回目 $ls xx00 xx01 |
パターンにマッチした行を出力しない
(--suppress-matchedオプション)
--suppress-matchedオプションは、csplitコマンドでパターンにマッチした行を分割したファイルに含めません。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$seq 10 | csplit --suppress-matched - '/[369]/' '{*}' 4 4 4 3 $ls xx00 xx01 xx02 xx03 $cat xx* 1 2 4 5 7 8 10 |