【问题标题】:File splitting in UNIXUNIX 中的文件拆分
【发布时间】:2015-12-03 03:31:17
【问题描述】:

我有一个记录长度为 n 的 UNIX 数据集(这将是可变的,但总是可以被 2769 整除)。

我想处理这个文件以得到一个新数据集,其中包含长度为 2769 的单独记录,并且需要在 UNIX 中完成(perl?、sed?、awk?或其他)。

我可以使用循环在 shell 脚本中执行此操作,但花费的时间过多。

我尝试了“拆分”,但您可以指定的长度似乎有限制。

有人可以提出一个有效的答案吗?

谢谢,

伯尼

【问题讨论】:

标签: perl unix awk sed


【解决方案1】:

你可以从命令行使用 perl,

perl -Mautodie -ne 'BEGIN{$/ = \2769} print {open $f, ">", ++$i; $f} $_' file

【讨论】:

  • 谢谢。这看起来很有希望。理想情况下,我希望一个数据集中的输出在每个 2769 块的末尾带有行尾字符,并在末尾有一个文件结尾,这样我就可以将它用作普通的 UNIX 数据集。伯尼。
【解决方案2】:

split 会用魅力处理这个问题

$ split -l 2769 -d <(seq 1 30000) section
$ wc -l sec*                                                                                    
2769 section00
2769 section01
2769 section02
2769 section03
2769 section04
2769 section05
2769 section06
2769 section07
2769 section08
2769 section09
2310 section10
30000 total

-l 表示行大小,-d 表示数字后缀,最后一个参数是输出文件前缀。您必须将 &lt;(seq ..) 替换为您的输入文件。

【讨论】:

  • 我认为使用split的关键是使用-a开关定义后缀的长度,如链接问题中所述。
【解决方案3】:

我很惊讶split 无法做到这一点,但另一种选择是使用 awk:

awk 'NR%2769==1{ close(outfile); outfile = sprintf("%s%03d", FILENAME, ++i) }{ print > outfile }' file

这会将输入文件的每一行打印到名称由输入文件组成的文件,后跟一个用零填充的 3 位数字。每 2769 行,数字将增加 1。

如果有很多输出文件,则调用close(第一次调用时不会做任何事情)很有用,否则它们都将被 awk 保持打开状态。

【讨论】:

    【解决方案4】:
    awk '{print > ( FILENAME "." int( ( NR + 2768) / 2769) )}' YourFile
    

    YourFile.1

    开始的文件名

    【讨论】:

      猜你喜欢
      • 2012-05-24
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多