大檔案切割shell腳本
按照行數來切割
可以按照檔案内容的行數來對檔案切割
#!/bin/sh
lines=$(wc -l $1 | sed 's/ .*//g') #擷取指令行第一個參數指定的檔案總行數
echo $lines
lines_per_file=`expr $lines / 10` #将總行數除以10,得到每份的行數
echo $lines_per_file
#将$1指定的檔案按照每份檔案包括lines_per_file行的大小,分成多份,以_part_檔案名+數字的形式命名(-d指定以數字,否則預設按照字典序小寫字母)
split -d -l $lines_per_file $1 _part_
示例:下面為a.txt内容
aaaa
bbbb
cccc
dddd
eeee
ffff
執行腳本切割
$> sh ./split_demo.sh a.txt
在目前檔案夾下輸出
_part_00
,
_part_01
和
_part_02
三個子檔案,每個檔案包括2行内容。
按照位元組大小來切割
-
:指定子檔案名是數字-d
-
:以位元組來切割,機關有m, k, b-b
#!/bin/sh
split -d -b 4096m $1 _part_
應用:檔案切割+排序
将一個較大的檔案先使用
split
切割成小檔案,然後用
sort
排序,以滿足記憶體和cpu核數限制,結果輸出到檔案。
-
的參數說明sort
-
:指定記憶體大小-S
-
:指定cpu核數大小--parallel
-
#!/bin/sh
lines=$(wc -l $1 | sed 's/ .*//g')
echo $lines
lines_per_file=`expr $lines / 10`
echo $lines_per_file
split -d -l $lines_per_file $1 _part_
for file in _part_*
do
{
sort $file -S 4G --parallel=8 > t_sort_$file
} &
done
wait
sort -sm t_sort_* -S 4G --parallel=8 > $2
rm -f _part_*
rm -f t_sort_*
示例:
sh ./split_sort.sh in_file out_file
- 評估性能:可用
來擷取運作時間,輸出示例如下time 執行指令
- real:實際執行時間
- user:使用者空間時間
- sys:核心處理時間
$> time `sh ./split_sort.sh in_file out_file` real 9m47.986s user 7m18.700s sys 1m51.468