Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Csv Unix Split函数将文件拆分为多个文件:拆分记录_Csv_Unix_Split - Fatal编程技术网

Csv Unix Split函数将文件拆分为多个文件:拆分记录

Csv Unix Split函数将文件拆分为多个文件:拆分记录,csv,unix,split,Csv,Unix,Split,我需要在FTP之前将文件拆分为多个文件(因为FTP限制为1GB)。我正在使用分割函数来实现这一点 split --bytes=$SPLIT_FILE_SIZE $FILE -d $FILE"_" $SPLIT_FILE_SIZE=900M 现在我注意到它也在打破记录。 此外,记录中的数据中没有任何新行字符 例如 我的原始文件已保存 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|

我需要在FTP之前将文件拆分为多个文件(因为FTP限制为1GB)。我正在使用分割函数来实现这一点

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

$SPLIT_FILE_SIZE=900M
现在我注意到它也在打破记录。 此外,记录中的数据中没有任何新行字符

例如

我的原始文件已保存

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

感谢您的建议。

因为您要求它通过计数字节进行拆分,所以它不在乎拆分点是否在行的中间。相反,获取每行字节数的平均值,添加一些安全裕度并按行分割

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

您可以使用
wc-l$FILENAME
计算文件中的行数。请注意,Mac OS X和FreeBSD发行版没有-d`选项。

这可以根据需要添加到中,但在最基本的形式中,只要您处理文本输入,您就可以使用以下内容:

#!/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[]
),或者在脚本运行时包含某种状态/调试输出。

下面是我如何做到的

拆分文件大小=900

行的平均长度=
awk'{total+=length($0);count++}END{print total/count}'$FILE

行的r\u平均长度=
printf“%.0f\n”“行的$avg\u长度”

文件的最大限制=
expr$SPLIT\u文件大小\*1024\*1024

max_line_count=
echo$(_file的max_limit_/r_avg_line的长度_))


拆分-l$max\u line\u count$FILE-d$FILE“

问题是什么?我如何避免拆分记录而在行末拆分。@Prajakta,提出问题的最佳位置是。
--line
选项在FreeBSD或OSX中不可用。如果您使用的工具或选项只针对一个平台,最好提及哪个平台!我可能不得不做“获取每行的平均字节数”,这将有望解决我的问题。我用的是克朗贝壳。