Linuxでテキストファイルを分割する方法【サンプル有】(split と sed)

概要

今回はファイル内の文字列を行単位で分割し、別ファイルに出力する方法をお伝えします。

自分の現場では、1ファイル数Gバイトある巨大なファイルを扱うことが多く、ファイルを開くと重くてまともに操作できないといったことが良くあります。
そこで行数ごとにファイルを分割することでファイルを軽量化し、作業しやすくしよう!というのが今回の経緯です。

同じようなケースは割とあると思う?のでどなたかの参考になりましたらうれしいです!

目次

方法

特定の行数だけ切り出し

特定の行数だけ切り出す場合は、sedコマンドを使用します。

例えば、100行目から300行目だけを切り出したい場合は下記のような感じです。

コマンド

1
sed -n '100,300p' input.csv > output.csv
  • <オプション>
  • -n ‘[数字],[数字]p’
    • 出力する行数の範囲
  • input.csv
    • 切り出しファイル
  • output.csv
    • 出力ファイル
sedコマンドといえば置換が有名ですが、こんな使い方もあるんですね!

行数単位で別々のファイルに一括出力

特定の行数単位で別々のファイルに一括出力したい場合は、split関数を使用します。

下記の例だと、100行単位で別々のファイルに出力されます。

コマンド

1
split -l 100 -d -a 2 --additional-suffix=".csv" input.csv output_
  • <オプション>
  • -l [数字]
    • 分割単位の行数
  • -d
    • 出力ファイルに付与される数字に変更
  • -a [数字]
    • 出力ファイルに付与される数字の桁数
  • –additional-suffix
    • 出力ファイルの末尾に入れる文字列(拡張子など)
  • input.csv
    • 分割対象のファイル
  • output_
    • 出力ファイルの先頭に入れる文字列

出力結果は、300行の場合下記のようになります。

  • output_01.csv
  • output_02.csv
  • output_03.csv

分割前に行数を確認する(wc -l)

分割する前に、そもそも何行あるのかを把握しておくと分割単位を決めやすいです。

行数の確認にはwc -lを使います。

コマンド

1
wc -l input.csv

例えば30万行あると分かれば「10万行ずつ3分割」といった具合に見当が付けられますよね(^^

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

分割したファイルを元の1ファイルに戻したい、あるいは複数ファイルをまとめたいときはcatで結合できます。

コマンド

1
cat output_*.csv > merged.csv

ワイルドカードの*は連番順に展開されるので、output_01.csvoutput_03.csvがこの順番で1つにまとまります。

分割して作業 → 加工 → 結合して戻す、という流れで巨大ファイルを安全に扱えます(^^b

締め

こんな便利なコマンドがあるんですね!

これで重いファイルとの長い戦いに終止符が打たれます!

簡単に分割できるので皆さんもぜひ使ってみてください(^^b

以上となります。
便利なものはみんなで共有してチーム全体での効率化を意識しましょう!
それでは、お疲れさまでした!