2015-12-23 239 views
1

我有要求在FTP之前將文件拆分爲多個文件(因爲FTP有1 GB的限制)。我正在使用SPLIT函數來執行此操作。Unix拆分功能將文件拆分成多個文件:拆分記錄

split --bytes=$SPLIT_FILE_SIZE $FILE -d $FILE"_" 

$SPLIT_FILE_SIZE=900M 

現在我注意到它也在分裂記錄。 此外,我在記錄中的數據沒有任何NEW LINE字符。

例如,

我的原始文件有

a|b|c|d|e|f 
a1|b1|c1|d1|e1|f1 
a2|b2|c2|d2|e2|f2 
a3|b3|c3|d3|e3|f3 
a4|b4|c4|d4|e4|f4 

所以我劃分的文件是

第一個文件的內容:

a|b|c|d|e|f 

a1|b1|c1|d1|e1|f1 

a2|b2|c2| 

第二個文件內容:

d2|e2|f2 

a3|b3|c3|d3|e3|f3 

a4|b4|c4|d4|e4|f4 

欣賞任何建議。

+0

什麼問題? – zedfoxus

+0

我怎樣才能避免分裂記錄,但在行結束時分裂。 – Prajakta

+1

@Prajakta,把你的問題放在最好的地方是[在你的問題](http://stackoverflow.com/posts/34440994/edit)。 – ghoti

回答

1

由於您要求通過計算字節數進行拆分,因此它並不在乎拆分點是否在行的中間位置。相反,獲得每行字節數的平均值,添加一些安全邊界並逐行分割。

split -l=$SPLIT_FILE_LINE $FILE -d $FILE"_" 

你可以指望使用wc -l $FILENAME文件中的行數。請注意,Mac OS X和FreeBSD發行版沒有-d選項。

+0

'--line'選項在FreeBSD或OSX中不可用。如果您使用的工具或選項只針對一個平臺,那麼提及哪個平臺是個好主意! – ghoti

+0

我可能需要做「獲得每行字節數的平均值」,這將有望解決我的問題。我正在使用Krone外殼。 – Prajakta

1

這可以被添加到你需要,但在最基本的形式,只要你在處理文本輸入,您可以使用這樣的事情:

#!/usr/bin/awk -f 

BEGIN { 
inc=1 
} 

s > 900*1024*1024 {  # 900MB, per your question 
inc++ 
s=0 
} 

{ 
s+=length($0) 
print > "outfile." inc 
} 

此散步通過文件,逐行,將長度添加到變量,然後重置變量並遞增計數器以用作輸出文件名。

升級可能包括或許從命令行選項(ARGV[])獲取大小,或者在腳本運行時包括某種狀態/調試輸出。

0

這裏是我是如何做到的

SPLIT_FILE_SIZE = 900

avg_length_of_line = awk '{ total += length($0); count++ } END { print total/count }' $FILE

r_avg_length_of_line = printf "%.0f\n" "$avg_length_of_line"

max_limit_of_file = expr $SPLIT_FILE_SIZE \* 1024 \* 1024

max_line_count = echo $((max_limit_of_file/r_avg_length_of_line))

split -l $ max_line_count $ FILE -d $ FILE「_」

+0

即使你自己的答案不是[可接受](http://stackoverflow.com/help/accepted-answer)。 – pnuts