Linuxのsplit、csplitコマンドでファイルを分割

Linuxでファイル分割をしたい場合、`split`コマンドまたは`csplit`コマンドでファイル分割をすることができます。
ここでは`split`コマンド、`csplit`コマンドでファイル分割をする一例を紹介します。

# 環境
OS：CentOS Linux release 8.5.2111

```console:OSバージョン
[root@centos85 work]# cat /etc/redhat-release
CentOS Linux release 8.5.2111
[root@centos85 work]#
```

# 1. splitコマンドとcsplitコマンドの違い
### 1.1. splitコマンド
`split`コマンドは、ファイルを一定のサイズや行数ごとに分割するためのコマンドです。
行数 (`-l`オプション) やバイト数 (`-b`オプション) で指定してファイルを分割します。
ファイルを均等に分割したい場合に使用します。たとえば、大きなログファイルを一定の行数で分割したいときに便利です。

### 1.2 csplitコマンド
`csplit`コマンドは、指定した条件に基づいてファイルを分割するためのコマンドです。
正規表現や特定の行番号を使って分割します。
特定のパターンが現れるごとにファイルを分割する場合に使用します。例えば、セクションごとに分割したいときなどに便利です。

# 2. splitコマンドでファイル分割
`split`コマンドで、以下のファイルを10行ごとにファイルを分割してみます。
```:sammple01.txt
01      北海道
02      青森県
03      岩手県
04      宮城県
05      秋田県
06      山形県
07      福島県
08      茨城県
09      栃木県
10      群馬県
11      埼玉県
12      千葉県
13      東京都
14      神奈川県
15      新潟県
16      富山県
17      石川県
18      福井県
19      山梨県
20      長野県
21      岐阜県
22      静岡県
23      愛知県
24      三重県
25      滋賀県
26      京都府
27      大阪府
28      兵庫県
29      奈良県
30      和歌山県
31      鳥取県
32      島根県
33      岡山県
34      広島県
35      山口県
36      徳島県
37      香川県
38      愛媛県
39      高知県
40      福岡県
41      佐賀県
42      長崎県
43      熊本県
44      大分県
45      宮崎県
46      鹿児島県
47      沖縄県
```

以下のコマンドで10行ごとに分割します。

`split -l 10 sample01.txt sample01_`

```console:実行結果
[root@centos85 test1]# ls
sample01.txt
[root@centos85 test1]# split -l 10 sample01.txt sample01_
[root@centos85 test1]# ls
sample01.txt  sample01_aa  sample01_ab  sample01_ac  sample01_ad  sample01_ae
[root@centos85 test1]#
```

`split`コマンドを実行すると、`sample01.txt`が以下のファイルに分割されました。
+ sample01_aa
+ sample01_ab
+ sample01_ac
+ sample01_ad
+ sample01_ae

```:sample01_aa
01      北海道
02      青森県
03      岩手県
04      宮城県
05      秋田県
06      山形県
07      福島県
08      茨城県
09      栃木県
10      群馬県
```

```:sample01_ab
11      埼玉県
12      千葉県
13      東京都
14      神奈川県
15      新潟県
16      富山県
17      石川県
18      福井県
19      山梨県
20      長野県
```

```:sample01_ac
21      岐阜県
22      静岡県
23      愛知県
24      三重県
25      滋賀県
26      京都府
27      大阪府
28      兵庫県
29      奈良県
30      和歌山県
```

```:sample01_ad
31      鳥取県
32      島根県
33      岡山県
34      広島県
35      山口県
36      徳島県
37      香川県
38      愛媛県
39      高知県
40      福岡県
```

```:sample01_ae
41      佐賀県
42      長崎県
43      熊本県
44      大分県
45      宮崎県
46      鹿児島県
47      沖縄県
```

分割したファイルを結合するときは、`cat`コマンドを使用します。結合後、`diff`コマンドで、元のファイルと一致するか確認します。

`cat sample01_aa sample01_ab sample01_ac sample01_ad sample01_ae > sample01_cat.txt`

```console:実行結果
[root@centos85 test1]# cat sample01_aa sample01_ab sample01_ac sample01_ad sample01_ae > sample01_cat.txt
[root@centos85 test1]# diff sample01.txt sample01_cat.txt
[root@centos85 test1]#
```

# 3. csplitコマンドでファイル分割
`csplit`コマンドで、以下のファイルを「---◯◯---」の地域ごとにファイルを分割してみます。

```:sample02.txt
---北海道---
01      北海道
---東北---
02      青森県
03      岩手県
04      宮城県
05      秋田県
06      山形県
07      福島県
---関東---
08      茨城県
09      栃木県
10      群馬県
11      埼玉県
12      千葉県
13      東京都
14      神奈川県
19      山梨県
20      長野県
---北陸---
15      新潟県
16      富山県
17      石川県
18      福井県
---中部---
21      岐阜県
22      静岡県
23      愛知県
24      三重県
---近畿---
25      滋賀県
26      京都府
27      大阪府
28      兵庫県
29      奈良県
30      和歌山県
---中国---
31      鳥取県
32      島根県
33      岡山県
34      広島県
35      山口県
---四国---
36      徳島県
37      香川県
38      愛媛県
39      高知県
---九州---
40      福岡県
41      佐賀県
42      長崎県
43      熊本県
44      大分県
45      宮崎県
46      鹿児島県
---沖縄---
47      沖縄県
```

以下のコマンドで地域ごとに分割します。
`csplit sample02.txt /^---.*---/ {*} -f sample02_`

```console:実行結果
[root@centos85 test2]# ls
sample02.txt
[root@centos85 test2]# csplit sample02.txt /^---.*---/ {*} -f sample02_
0
29
91
133
65
65
94
78
65
107
26
[root@centos85 test2]# ls
sample02.txt  sample02_01  sample02_03  sample02_05  sample02_07  sample02_09
sample02_00   sample02_02  sample02_04  sample02_06  sample02_08  sample02_10
[root@centos85 test2]#
```

`csplit`コマンドを実行すると、`sample02.txt`が以下のファイルに分割されました。
+ sample02_00
+ sample02_01
+ sample02_02
+ sample02_03
+ sample02_04
+ sample02_05
+ sample02_06
+ sample02_07
+ sample02_08
+ sample02_09
+ sample02_10

```:sample02_00
```
```:sample02_01
---北海道---
01      北海道
```
```:sample02_02
---東北---
02      青森県
03      岩手県
04      宮城県
05      秋田県
06      山形県
07      福島県
```
```:sample02_03
---関東---
08      茨城県
09      栃木県
10      群馬県
11      埼玉県
12      千葉県
13      東京都
14      神奈川県
19      山梨県
20      長野県
```
```:sample02_04
---北陸---
15      新潟県
16      富山県
17      石川県
18      福井県
```
```:sample02_05
---中部---
21      岐阜県
22      静岡県
23      愛知県
24      三重県
```
```:sample02_06
---近畿---
25      滋賀県
26      京都府
27      大阪府
28      兵庫県
29      奈良県
30      和歌山県
```
```:sample02_07
---中国---
31      鳥取県
32      島根県
33      岡山県
34      広島県
35      山口県
```
```:sample02_08
---四国---
36      徳島県
37      香川県
38      愛媛県
39      高知県
```
```:sample02_09
---九州---
40      福岡県
41      佐賀県
42      長崎県
43      熊本県
44      大分県
45      宮崎県
46      鹿児島県
```
```:sample02_10
---沖縄---
47      沖縄県
```

`cat`コマンドを使用して結合し、`diff`コマンドでもとのファイルと一致するか確認します。

`cat sample02_00 sample02_01 sample02_02 sample02_03 sample02_04 sample02_05 sample02_06 sample02_07 sample02_08 sample02_09 sample02_10 > sample02_cat.txt`

```console:実行結果
[root@centos85 test2]# cat sample02_00 sample02_01 sample02_02 sample02_03 sample02_04 sample02_05 sample02_06 sample02_07 sample02_08 sample02_09 sample02_10 > sample02_cat.txt
[root@centos85 test2]# diff sample02.txt sample02_cat.txt
[root@centos85 test2]#
```

なお、`sample02.txt`の1行目に「---北海道---」とあるため、分割された１つ目のファイル`sample02_00`が0バイトとのファイルとなっています。
0バイトのファイルを出力したくない場合は、`-z`を使用します。

`csplit sample02.txt /^---.*---/ {*} -z -f sample02_`

```console:実行結果
[root@centos85 test2]# csplit sample02.txt /^---.*---/ {*} -z -f sample02_
29
91
133
65
65
94
78
65
107
26
[root@centos85 test2]# ls
sample02.txt  sample02_01  sample02_03  sample02_05  sample02_07  sample02_09
sample02_00   sample02_02  sample02_04  sample02_06  sample02_08
[root@centos85 test2]#
```

catコマンドで結合して、元のファイルと一致することを確認します。

`cat sample02_00 sample02_01 sample02_02 sample02_03 sample02_04 sample02_05 sample02_06 sample02_07 sample02_08 sample02_09 > sample02_cat.txt`

```console:実行結果
[root@centos85 test2]# cat sample02_00 sample02_01 sample02_02 sample02_03 sample02_04 sample02_05 sample02_06 sample02_07 sample02_08 sample02_09 > sample02_cat.txt
[root@centos85 test2]# diff sample02.txt sample02_cat.txt
[root@centos85 test2]#
```

---
以上