split コマンド
splitコマンドはファイルを複数のファイルに分割するコマンド。
$ split large.txt
このコマンドを実行すると、large.txtを1000行ごとに分割し、xaa、xab、xac…という名前のファイルを生成する。
$ 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_aa、part_ab、part_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_00、part_01、part_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_000、part_001、part_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_aa、access_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_
各分割ファイルにヘッダーを追加する。
$ for file in data_part_*; do
cat header.txt "$file" > "with_header_$file"
done
