【コピペ解決】splitコマンドでヘッダーをつけたままファイル分割するシェルスクリプト!
CSVファイルを分割したい。でも1行目のヘッダーは全部のファイルに残したい。
そんなとき、「split」コマンドだけじゃちょっと足りないんですよね。
というわけで今回は、LinuxやWSL、macOSでそのまま動く「コピペOKなスクリプト」を紹介します!
運用エンジニアの方や、CSVをよくいじる人向けに、実務でそのまま使える形にしてあります。ファイル名と分割数を変えるだけでOKです🙆
📌 この記事でできること
- CSVファイルを複数に分ける
- 1行目(ヘッダー)をすべての出力ファイルに付ける
- Linux/WSL/Macでも動くシェルスクリプトを使う
🔧 使用するコマンド
split:ファイルを分割するコマンドhead/tail:ヘッダーと本体を切り分けbash:スクリプトで一括処理
📁 入力ファイル例(input.csv)
名前,年齢,性別
田中,30,男
佐藤,25,女
鈴木,28,男
高橋,32,女
📜 コピペOK!ヘッダー付きで分割するシェルスクリプト
以下の内容を split_with_header.sh として保存して、実行権限を付けてください。
#!/bin/bash
input="input.csv" # 入力ファイル名
prefix="part_" # 出力ファイルの接頭辞
parts=3 # 分割数(好きに変えてOK)
# ヘッダーを取得
header=$(head -n 1 "$input")
# 本体だけ一時ファイルに保存
tail -n +2 "$input" > tmp_body.txt
# 本体を分割(行数ベースでできるだけ均等に)
split -n l/$parts tmp_body.txt "$prefix"
# 各分割ファイルにヘッダーを先頭に追加
for file in ${prefix}*; do
tmpfile="${file}.tmp"
{
echo "$header"
cat "$file"
} > "$tmpfile"
mv "$tmpfile" "$file"
done
# 一時ファイル削除
rm tmp_body.txt
実行例:
bash split_with_header.sh
🔰 Linuxを試せる環境がない方へ
コマンドなどを実際に試してみたいけれど、Linux環境がない…
そんなときは、「さくらのVPS」を使えば簡単に自分専用のLinux環境が手に入ります!
- ✅ 月額524円(税込)〜手軽に始められる
- ✅ UbuntuやDebianなど、好みのOSが選べる
- ✅ SSH接続でターミナル操作もバッチリ
- ✅ 日本国内の大手サービスで安心・安定
さくらのVPSでLinux学習をはじめる
\ あなただけのLinux環境を5分で構築! /
🧩 スクリプトの1行ずつ解説
#!/bin/bash
→ シェルスクリプトの冒頭お約束。このスクリプトはbashで動かすよ、という宣言。
input="input.csv"
→ 分割対象となるCSVファイルの名前。自分の環境に合わせて変えてOK。
prefix="part_"
→ 分割後のファイル名の接頭語。part_aa、part_abのように連番が付く。
parts=3
→ 何個に分けたいか。ここを変更するだけで分割数を調整できる。
header=$(head -n 1 "$input")
→ 入力ファイルの1行目(ヘッダー)を取得して、$headerに代入。
例:「名前,年齢,性別」みたいなやつ。
tail -n +2 "$input" > tmp_body.txt
→ 2行目以降(=データ本体)をtmp_body.txtという一時ファイルに保存。
tail -n +2は「2行目から最後まで」を意味します。
split -n l/$parts tmp_body.txt "$prefix"
→ 本体部分だけを、できるだけ均等な行数で分割します。
-n l/3は「行ベースで3分割」。
出力は part_aa、part_ab のように生成されます。
for file in ${prefix}*; do
→ 分割されたファイルすべて(part_aaなど)をループ処理で回す。
tmpfile="${file}.tmp"
→ ヘッダー付きにするため、一時ファイルを用意。
{
→ 複数行のコマンドをまとめて処理したいときの書き方(ブレースグループ)
echo "$header"
→ 先ほど取得したヘッダーを出力(ファイルの先頭に入れる)
cat "$file"
→ 元の分割ファイルの中身(データ本体)を出力
} > "$tmpfile"
→ 上記2つの出力(ヘッダー+本体)を.tmpファイルにまとめて書き出し
mv "$tmpfile" "$file"
→ 一時ファイルを上書きして、元のファイルを更新します(ヘッダー付きに)
done
→ forループの終了。すべてのファイルに対して同じ処理を繰り返します。
rm tmp_body.txt
→ 一時ファイルのtmp_body.txtを削除して後始末。クリーンなスクリプトですね!
📦 出力ファイルの中身(例)
part_aa
名前,年齢,性別
田中,30,男
佐藤,25,女
part_ab
名前,年齢,性別
鈴木,28,男
part_ac
名前,年齢,性別
高橋,32,女
💡 補足・カスタマイズポイント
- ファイル名を変えたいときは
inputとprefixを変更すればOK partsを増やせばもっと細かく分けられるsplit -l 1000で「○行ごと」に分割もできる
👀 よくある質問
Q. Macでも動きますか?
A. はい。macOS標準のsplitでもOKです(coreutils系)。
Q. WSLやUbuntuでも?
A. もちろん動きます。bash + split があれば問題なし!
Q. 巨大なファイルも大丈夫?
A. ファイルサイズに応じて分割数や方法を調整すればOK。並列処理やgzip連携も可能です。
🧠 まとめ:現場で役立つ“ちょい足しsplit”
Linuxのsplitコマンドは超便利ですが、ヘッダーを維持したまま分割したいときにはちょっと工夫が必要です。
このスクリプトを使えば、毎回同じことを手作業でやらなくてもOK。
分割数とファイル名を変えるだけで再利用できるので、現場の運用やログ処理にぴったり。
「あ、これ欲しかったやつ!」となった方は、ぜひブックマークしておいてください📌
気が向いたらシェアもお願いします👍
🔰 Linuxを試せる環境がない方へ
コマンドなどを実際に試してみたいけれど、Linux環境がない…
そんなときは、「さくらのVPS」を使えば簡単に自分専用のLinux環境が手に入ります!
- ✅ 月額524円(税込)〜手軽に始められる
- ✅ UbuntuやDebianなど、好みのOSが選べる
- ✅ SSH接続でターミナル操作もバッチリ
- ✅ 日本国内の大手サービスで安心・安定
\ あなただけのLinux環境を5分で構築! /








ディスカッション
コメント一覧
まだ、コメントがありません