【问题标题】:Unix Split Function to split file into multiple files : splitting the recordUnix拆分功能将文件拆分为多个文件:拆分记录
【发布时间】:2015-12-23 17:38:23
【问题描述】:

我需要在 FTP 之前将文件拆分为多个文件(因为 FTP 有 1 GB 的限制)。我正在使用 SPLIT 函数来执行此操作。

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

感谢任何建议。

【问题讨论】:

  • 问题是什么?
  • 如何避免拆分记录但在行尾拆分。
  • @Prajakta,提出问题的最佳地点是in your question

标签: csv unix split


【解决方案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】:

    由于您要求它通过计算字节数来分割,所以它不关心分割点是否在行的中间。相反,获取每行字节数的平均值,添加一些安全余量并按行拆分。

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

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

    【讨论】:

    • --line 选项在 FreeBSD 或 OSX 中不可用。如果您使用的是特定于一个平台的工具或选项,最好说明是哪个平台!
    • 我可能需要“获取每行的平均字节数”,这有望解决我的问题。我正在使用 Krone shell。
    【解决方案3】:

    这是我的做法

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 2014-12-13
      • 1970-01-01
      相关资源
      最近更新 更多