我要求在FTP之前将文件拆分成多个文件(因为FTP限制为1 GB)。我正在使用SPLIT功能。
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 :(得分:1)
由于您要求它通过计算字节进行拆分,因此不关心分割点是否在行的中间。相反,获取每行的平均字节数,添加一些安全边距并逐行分割。
split -l=$SPLIT_FILE_LINE $FILE -d $FILE"_"
您可以使用wc -l $FILENAME
计算文件中的行数。请注意,Mac OS X和FreeBSD发行版没有-d`选项。
答案 1 :(得分: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[]
)获取大小,或者在脚本运行时包含某种状态/调试输出。
答案 2 :(得分: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))
拆分-l $ max_line_count $ FILE -d $ FILE" _"