Unix Split功能将文件拆分为多个文件:拆分记录

时间:2015-12-23 17:38:23

标签: csv unix split

我要求在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

感谢任何建议。

3 个答案:

答案 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" _"