我有一个记录长度为n的UNIX数据集(这是可以改变的,但总是可以被2769整除)。UNIX中的文件拆分
我要处理此文件与长度2769的独立的记录新的数据集就结了,它需要在UNIX做(perl的?SED?AWK?或其他)。
我可以在shell脚本中使用一个循环做到这一点,但它需要的时间过长。
我尝试“分裂”,但它似乎有你可以指定长度的限制。
任何人都可以提出一个有效的答案吗?
谢谢
伯尼
我有一个记录长度为n的UNIX数据集(这是可以改变的,但总是可以被2769整除)。UNIX中的文件拆分
我要处理此文件与长度2769的独立的记录新的数据集就结了,它需要在UNIX做(perl的?SED?AWK?或其他)。
我可以在shell脚本中使用一个循环做到这一点,但它需要的时间过长。
我尝试“分裂”,但它似乎有你可以指定长度的限制。
任何人都可以提出一个有效的答案吗?
谢谢
伯尼
我很惊讶,split
不能够这样做的,但一个替代方案是使用AWK:
awk 'NR%2769==1{ close(outfile); outfile = sprintf("%s%03d", FILENAME, ++i) }{ print > outfile }' file
这将打印的每一行输入文件的名称由输入文件组成,后跟零填充的3位数字。该数字将每2769行增加1。
调用close
(在第一次调用时不会执行任何操作),如果输出文件很多,那么它很有用,否则它们将全部由awk打开。
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'开关定义后缀的长度,如链接问题所述。 –
您可以使用命令行的perl,
perl -Mautodie -ne 'BEGIN{$/ = \2769} print {open $f, ">", ++$i; $f} $_' file
谢谢。这看起来有希望。理想情况下,我希望一个数据集中的输出结尾行字符位于每个2769块的末尾,最后是文件结尾,以便我可以将其用作普通的UNIX数据集。伯尼。 – bernie110749
awk '{print > (FILENAME "." int((NR + 2768)/2769))}' YourFile
文件名开始YourFile 0.1
相关:http://stackoverflow.com/q/24268989/2088135 –