【发布时间】:2015-12-03 03:31:17
【问题描述】:
我有一个记录长度为 n 的 UNIX 数据集(这将是可变的,但总是可以被 2769 整除)。
我想处理这个文件以得到一个新数据集,其中包含长度为 2769 的单独记录,并且需要在 UNIX 中完成(perl?、sed?、awk?或其他)。
我可以使用循环在 shell 脚本中执行此操作,但花费的时间过多。
我尝试了“拆分”,但您可以指定的长度似乎有限制。
有人可以提出一个有效的答案吗?
谢谢,
伯尼
【问题讨论】:
我有一个记录长度为 n 的 UNIX 数据集(这将是可变的,但总是可以被 2769 整除)。
我想处理这个文件以得到一个新数据集,其中包含长度为 2769 的单独记录,并且需要在 UNIX 中完成(perl?、sed?、awk?或其他)。
我可以使用循环在 shell 脚本中执行此操作,但花费的时间过多。
我尝试了“拆分”,但您可以指定的长度似乎有限制。
有人可以提出一个有效的答案吗?
谢谢,
伯尼
【问题讨论】:
你可以从命令行使用 perl,
perl -Mautodie -ne 'BEGIN{$/ = \2769} print {open $f, ">", ++$i; $f} $_' file
【讨论】:
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 表示数字后缀,最后一个参数是输出文件前缀。您必须将 <(seq ..) 替换为您的输入文件。
【讨论】:
split的关键是使用-a开关定义后缀的长度,如链接问题中所述。
我很惊讶split 无法做到这一点,但另一种选择是使用 awk:
awk 'NR%2769==1{ close(outfile); outfile = sprintf("%s%03d", FILENAME, ++i) }{ print > outfile }' file
这会将输入文件的每一行打印到名称由输入文件组成的文件,后跟一个用零填充的 3 位数字。每 2769 行,数字将增加 1。
如果有很多输出文件,则调用close(第一次调用时不会做任何事情)很有用,否则它们都将被 awk 保持打开状态。
【讨论】:
awk '{print > ( FILENAME "." int( ( NR + 2768) / 2769) )}' YourFile
从YourFile.1
开始的文件名【讨论】: