Linuxでファイル分割をしたい場合、split
コマンドまたはcsplit
コマンドでファイル分割をすることができます。
ここではsplit
コマンド、csplit
コマンドでファイル分割をする一例を紹介します。
環境
OS:CentOS Linux release 8.5.2111
[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行ごとにファイルを分割してみます。
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_
[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
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 沖縄県
分割したファイルを結合するときは、cat
コマンドを使用します。結合後、diff
コマンドで、元のファイルと一致するか確認します。
cat sample01_aa sample01_ab sample01_ac sample01_ad sample01_ae > sample01_cat.txt
[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
コマンドで、以下のファイルを「---◯◯---」の地域ごとにファイルを分割してみます。
---北海道---
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_
[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
---北海道---
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 沖縄県
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
[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行目に「---北海道---」とあるため、分割された1つ目のファイルsample02_00
が0バイトとのファイルとなっています。
0バイトのファイルを出力したくない場合は、-z
を使用します。
csplit sample02.txt /^---.*---/ {*} -z -f sample02_
[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
[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]#
以上