天天看點

切割大檔案shell腳本大檔案切割shell腳本

大檔案切割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

    :指定子檔案名是數字
  • -b

    :以位元組來切割,機關有m, k, b
#!/bin/sh
split -d -b 4096m $1 _part_
           

應用:檔案切割+排序

将一個較大的檔案先使用

split

切割成小檔案,然後用

sort

排序,以滿足記憶體和cpu核數限制,結果輸出到檔案。

  • sort

    的參數說明
    • -S

      :指定記憶體大小
    • --parallel

      :指定cpu核數大小
#!/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
               

繼續閱讀