split コマンド

splitコマンドはファイルを複数のファイルに分割するコマンド。

$ split large.txt

このコマンドを実行すると、large.txtを1000行ごとに分割し、xaaxabxac…という名前のファイルを生成する。

$ ls
large.txt  xaa  xab  xac

デフォルトでは1000行ごとに分割し、プレフィックスはx、サフィックスはアルファベット2文字になる。

行数を指定して分割する

-lオプションで分割する行数を指定できる。

$ split -l 100 large.txt

このコマンドはlarge.txtを100行ごとに分割する。

$ wc -l xaa
100 xaa
$ wc -l xab
100 xab

各ファイルは100行になる。最後のファイルは100行未満になる場合がある。

ファイルサイズで分割する

-bオプションでバイト単位のサイズを指定して分割できる。

$ split -b 1M large.txt

このコマンドは1MBごとに分割する。単位には以下が使用できる。

  • K - キロバイト(1024バイト)
  • M - メガバイト(1024KB)
  • G - ギガバイト(1024MB)
$ ls -lh
-rw-r--r-- 1 ubuntu ubuntu 1.0M Jan 11 21:00 xaa
-rw-r--r-- 1 ubuntu ubuntu 1.0M Jan 11 21:00 xab
-rw-r--r-- 1 ubuntu ubuntu 512K Jan 11 21:00 xac

各ファイルは指定したサイズ以下になる。

プレフィックスを指定する

分割後のファイル名のプレフィックスを指定できる。

$ split -l 100 large.txt part_

このコマンドはpart_aapart_abpart_ac…という名前のファイルを生成する。

$ ls
large.txt  part_aa  part_ab  part_ac

プレフィックスを指定することで、分割ファイルの識別が容易になる。

プレフィックスにはディレクトリパスも含められる。

$ mkdir output
$ split -l 100 large.txt output/part_

数字のサフィックスを使用する

-dオプションでアルファベットではなく数字のサフィックスを使用できる。

$ split -d -l 100 large.txt part_

このコマンドはpart_00part_01part_02…という名前のファイルを生成する。

$ ls
large.txt  part_00  part_01  part_02

数字のサフィックスは、アルファベット(aa, ab, …, az, ba, …)より直感的に順序を把握できる。特に分割ファイル数が多い場合に便利。

サフィックスの桁数を指定する

-aオプションでサフィックスの桁数を指定できる。

$ split -d -a 3 -l 100 large.txt part_

このコマンドはpart_000part_001part_002…という名前のファイルを生成する。

$ ls
large.txt  part_000  part_001  part_002

桁数を増やすことで、より多くのファイルに分割できる。デフォルトは2桁。

分割したファイルを結合する

分割したファイルを元に戻すにはcatコマンドを使用する。

$ cat xaa xab xac > restored.txt

ワイルドカードを使用してすべてのファイルを結合できる。

$ cat x* > restored.txt

アルファベット順または数字順で結合されるため、元のファイルが復元される。

標準入力からの文字列を分割する

パイプから受け取ったデータを分割する場合は、ファイル名の代わりに-を指定する。

$ cat large.txt | split -l 100 - part_

コマンドの出力を直接分割できる。

$ find /var/log -type f | split -l 100 - filelist_

このコマンドはfindの出力を100行ごとに分割する。

具体例

大きなログファイルを日付ごとに分割する

大きなログファイルを扱いやすいサイズに分割する。

$ split -l 10000 access.log access_log_

このコマンドは10000行ごとにaccess_log_aaaccess_log_ab…というファイルを生成する。

分割後のファイルは個別に解析できる。

$ grep "ERROR" access_log_aa
$ grep "ERROR" access_log_ab

CSVファイルをヘッダー付きで分割する

CSVファイルをヘッダー行を保持して分割する場合は、工夫が必要。

まずヘッダー行を保存する。

$ head -1 data.csv > header.txt

ヘッダーを除いた残りを分割する。

$ tail -n +2 data.csv | split -l 1000 - data_part_

参考: tailコマンドで指定行「以降」を表示

各分割ファイルにヘッダーを追加する。

$ for file in data_part_*; do
    cat header.txt "$file" > "with_header_$file"
done