2017-08-07 73 views
0

我試圖寫在KSH環境中的bash腳本,將通過源文本文件進行迭代,並通過KSH shell腳本 - 通過線條的塊進行處理文件

到目前爲止,我想出了線的塊進行處理它與此代碼,但它似乎跟下去,因爲tail命令不返回0行,如果要求檢索超出源文本文件

i=1 
while [[ `wc -l /path/to/block.file | awk -F' ' '{print $1}'` -gt $((i * 1000)) ]] 

do 
    lc=$((i * 1000)) 
    DA=ProcessingResult_$i.csv 
    head -$lc /path/to/source.file | tail -1000 > /path/to/block.file 
    cd /path/to/processing/batch 
    ./process.sh #This will process /path/to/block.file 
    mv /output/directory/ProcessingResult.csv /output/directory/$DA 
    i=$((i + 1)) 
done 

線啓動我手動執行「第一次注射上述腳本之前':head -$lc /path/to/source.file | tail -1000 > /path/to/temp.source.file

關於如何在處理源文件最後一行後停止腳本的任何想法?

在此先感謝大家

回答

0

如果你不想在開始處理每個塊之前創建這麼多的臨時文件,你可以嘗試下面的解決方案。處理大文件時可以節省大量空間。

#!/usr/bin/ksh 

range=$1 
file=$2 

b=0; e=0; seq=1 
while true 
do 
    b=$((e+1)); e=$((range*seq)); 

    sed -n ${b},${e}p $file > ${file}.temp 

    [ $(wc -l ${file}.temp | cut -d " " -f 1) -eq 0 ] && break 

    ## process the ${file}.temp as per your need ## 

    ((seq++)) 
done 

上面的代碼一次只能生成一個臨時文件。 您可以將範圍(塊大小)和文件名作爲命令行參數傳遞給腳本。

example: extractblock.sh 1000 inputfile.txt 
+0

謝謝你的Abis,我會嘗試下次我需要執行處理 – BNT

+0

我已經使用腳本進行了另一個處理,並且它完美地工作。再次感謝 – BNT

0

,看一下man split

NAME 
    split - split a file into pieces 

SYNOPSIS 
    split [OPTION]... [INPUT [PREFIX]] 

    -l, --lines=NUMBER 
      put NUMBER lines per output file 

例如

split -l 1000 source.file 

或者提取例如第三塊(1000這裏是不是數字,它是塊的數量,或塊是源的1/1000)。文件)

split -nl/3/1000 source.file 

條件的說明:

[[ `wc -l /path/to/block.file | awk -F' ' '{print $1}'` -gt $((i * 1000)) ]] 

也許這應該是source.file代替block.file,這是一個很大的文件非常低效的,因爲它會讀取(算上文件的行)每次迭代;行數可以存儲在一個變量,也使用在標準輸入上廁所使用AWK阻止:

nb_lines=$(wc -l </path/to/source.file) 
+0

感謝納韋爾我會盡量拆分命令,然後重複上生成的文件 我倒是+1的處理腳本,但我沒有足夠的權限,那麼遠, – BNT

0

隨着豪爾的建議,我是能夠建立這樣的腳本:

i=1 
cd /path/to/sourcefile/ 
split source.file -l 1000 SF 

for sf in /path/to/sourcefile/SF* 
do 
    DA=ProcessingResult_$i.csv 
    cd /path/to/sourcefile/ 
    cat $sf > /path/to/block.file 
    rm $sf 
    cd /path/to/processing/batch 
    ./process.sh #This will process /path/to/block.file 
    mv /output/directory/ProcessingResult.csv /output/directory/$DA 
    i=$((i + 1)) 
done 

這個工作很好