超大文字檔(如日誌、匯出資料)難以傳輸或編輯,需分割成小檔。本文提供兩階段分割策略:先用 split 按行數/大小粗分,再用 Shell 迴圈將每段進一步細分,並自動建立對應目錄歸檔。
# 按行數分割(每檔 100 萬行)
split -l 1000000 bigfile.txt chunk_
# 按大小分割(每檔 100MB)
split -b 100M bigfile.txt chunk_
# 產出:chunk_aa, chunk_ab, chunk_ac ...
參數:-l 行數、-b 位元組(支援 k/m/g 後綴)。
#!/bin/bash
bigfile="1.txt"
# 1. 先粗分 100 萬行
split -l 1000000 "$bigfile" text
currdir=1
for smallfile in $(ls | grep "^text"); do
linenum=$(wc -l < "$smallfile")
n1=1
file=1
savedir="${smallfile}${currdir}"
# 建立對應目錄
[ ! -d "$savedir" ] && mkdir "$savedir"
# 迴圈細分每 1 萬行
while [ $n1 -lt $linenum ]; do
n2=$((n1 + 9999))
sed -n "${n1},${n2}p" "$smallfile" > "${savedir}/text${file}.txt"
n1=$((n2 + 1))
file=$((file + 1))
done
currdir=$((currdir + 1))
done
split 自動產生 aa, ab, ac... 後綴,避免檔名衝突;sed -n "M,Np" 精準提取行範圍,不載入整檔記憶體;${smallfile}${currdir} 確保唯一性;#!/bin/bash
# 使用 awk 一次掃描完成分割與歸檔
awk '
{ print > sprintf("part_%03d/%06d.txt", (NR-1)/10000, (NR-1)%10000) }
' bigfile.txt
# 需先建立 part_000, part_001... 目錄
或使用 split -l 10000 --additional-suffix=.txt bigfile.txt part_ 直接產生小檔,再用腳本歸檔。
| 場景 | 推薦分割單位 | 工具選擇 |
|---|---|---|
| 日誌分析上傳 ELK | 5-10 萬行 | split + Filebeat |
| 資料庫匯出 CSV 導入 | 1-5 萬行 | split -l |
| 郵件附件傳輸限制 | 20-25MB | split -b 20M |
| 編輯器開啟大檔 | 1-2 萬行 | split -l |
善用 split 與 Shell 流控制,輕鬆馭服 GB 級文字檔。
