Table of Contents
What I want to do
メモリに乗らないほどの巨大なファイル(.csv
, .txt
など)を分割してからそれぞれを読み込んで何かしらの処理を実行したい状況を考えます.
このとき, 内容に悪影響与えることなく & 後ほど復元できる形でファイル分割をするためにはどのようなコマンドを用いればよいのか?
ファイルサイズが大きくて, そのままではファイル転送ができない場合も上の問題に対するsolutionが活用できます.
このような状況のとき用いるコマンドがsplit
コマンドです.
What is split
command?
Def: split command
split
コマンドは, ファイルを指定したサイズや個数に分割する- 分割するファイルの種類には特に制限がなく, テキストファイルを分割することもできる
- デフォルトでは, ファイルを1000行ずつに分割する
- デフォルトでは分割先ファイルのprefixは
x
, suffixはaa, ab, ....
とアルファベットになる
helpで確かめてみると
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
33
34
35
36
37
38
39
40
41
42
43
% split --help
Usage: split [OPTION]... [FILE [PREFIX]]
Output pieces of FILE to PREFIXaa, PREFIXab, ...;
default size is 1000 lines, and default PREFIX is 'x'.
With no FILE, or when FILE is -, read standard input.
Mandatory arguments to long options are mandatory for short options too.
-a, --suffix-length=N generate suffixes of length N (default 2)
--additional-suffix=SUFFIX append an additional SUFFIX to file names
-b, --bytes=SIZE put SIZE bytes per output file
-C, --line-bytes=SIZE put at most SIZE bytes of records per output file
-d use numeric suffixes starting at 0, not alphabetic
--numeric-suffixes[=FROM] same as -d, but allow setting the start value
-x use hex suffixes starting at 0, not alphabetic
--hex-suffixes[=FROM] same as -x, but allow setting the start value
-e, --elide-empty-files do not generate empty output files with '-n'
--filter=COMMAND write to shell COMMAND; file name is $FILE
-l, --lines=NUMBER put NUMBER lines/records per output file
-n, --number=CHUNKS generate CHUNKS output files; see explanation below
-t, --separator=SEP use SEP instead of newline as the record separator;
'\0' (zero) specifies the NUL character
-u, --unbuffered immediately copy input to output with '-n r/...'
--verbose print a diagnostic just before each
output file is opened
--help display this help and exit
--version output version information and exit
The SIZE argument is an integer and optional unit (example: 10K is 10*1024).
Units are K,M,G,T,P,E,Z,Y (powers of 1024) or KB,MB,... (powers of 1000).
Binary prefixes can be used, too: KiB=K, MiB=M, and so on.
CHUNKS may be:
N split into N files based on size of input
K/N output Kth of N to stdout
l/N split into N files without splitting lines/records
l/K/N output Kth of N to stdout without splitting lines/records
r/N like 'l' but use round robin distribution
r/K/N likewise but only output Kth of N to stdout
GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
Full documentation <https://www.gnu.org/software/coreutils/split>
or available locally via: info '(coreutils) split invocation'
Frequently used options
b サイズ |
--bytes=サイズ |
分割ファイルのサイズを指定する |
-l 行数 |
--lines=行数 |
分割ファイルの行数を指定する |
-C サイズ |
--line-bytes=サイズ |
分割ファイルに含める行の最大サイズを指定する |
-a 長さ |
--suffix-length=長さ |
接尾辞の長さ(デフォルトは2文字) |
-d |
--numeric-suffixes |
接尾辞を英字ではなく数字にする(0から開始、「-d 開始番号」で変更可能) |
-n 個数 |
--number=個数 |
指定した個数のファイルに分割する. 例えば「-n 5」でファイルを5分割する. |
-e |
--elide-empty-files |
-nを使用した際に空のファイルを作成しない |
--additional-suffix= |
(数字やアルファベットの)suffixの最後につける文字列を指定 |
Recover the original file
splitで出力したファイルには改行コードなど余分なデータは入っていないので, 順番さえ間違えなければ
1
% cat <split-files> > recovered_file
で復元することができます.
例として, とある.png
fileがディレクトリに以下のような形で存在しているとします:
1
2
3
% ls -lh
total 364K
-rw-rw-r-- 1 kirakira-kirby kirakira-kirby 364K Aug 10 14:13 test.png
split
コマンドを用いて100Kずつのファイルに分割します
1
2
3
4
5
6
7
8
% split -b 100k --numeric-suffixes=0 test.png splitfile.png.
% ls -lh
total 728K
-rw-rw-r-- 1 kirakira-kirby kirakira-kirby 100K Aug 10 14:26 splitfile.png.00
-rw-rw-r-- 1 kirakira-kirby kirakira-kirby 100K Aug 10 14:26 splitfile.png.01
-rw-rw-r-- 1 kirakira-kirby kirakira-kirby 100K Aug 10 14:26 splitfile.png.02
-rw-rw-r-- 1 kirakira-kirby kirakira-kirby 64K Aug 10 14:26 splitfile.png.03
-rw-rw-r-- 1 kirakira-kirby kirakira-kirby 364K Aug 10 14:13 test.png
splitfile.png.*
filesを統合してファイルの復元をしてから, hash値の比較を実施します
1
2
3
4
% cat splitfile.png.* > recovered_file.png
% md5sum test.png recovered_file.png
b2bccb7daed8e86344cc4b5dfa002deb test.png
b2bccb7daed8e86344cc4b5dfa002deb recovered_file.png
復元したファイルのハッシュ値が一致しており問題が起きていないと推測できます.
統計
Python
math
Linux
Ubuntu 20.04 LTS
Shell
English
git
方法論
Ubuntu 22.04 LTS
統計検定
競技プログラミング
フーリエ解析
前処理
SQL
coding
コミュニケーション
Network
ssh
将棋
Data visualization
Docker
Econometrics
VSCode
statistical inference
GitHub Pages
apt
development
システム管理
Coffee
cloud
数値計算
素数
Book
Font
Metrics
Poetry
Ubuntu 24.04 LTS
architecture
aws
shell
systemctl
テンプレート
データ構造
ポワソン分布
会計分析
文字コード
環境構築
論文
App
Bayesian
Dynamic Programming
Keyboard
Processing
R
Steam
filesystem
quarto
regex
(注意:GitHub Accountが必要となります)