2015-09-07 88 views
0

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

我要处理此文件与长度2769的独立的记录新的数据集就结了,它需要在UNIX做(perl的?SED?AWK?或其他)。

我可以在shell脚本中使用一个循环做到这一点,但它需要的时间过长。

我尝试“分裂”,但它似乎有你可以指定长度的限制。

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

谢谢

伯尼

+0

相关:http://stackoverflow.com/q/24268989/2088135 –

回答

0

我很惊讶,split不能够这样做的,但一个替代方案是使用AWK:

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

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

调用close(在第一次调用时不会执行任何操作),如果输出文件很多,那么它很有用,否则它们将全部由awk打开。

1

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 ..)替换为您的输入文件。

+0

我认为使用'split'的关键是使用'-a'开关定义后缀的长度,如链接问题所述。 –

2

您可以使用命令行的perl,

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

谢谢。这看起来有希望。理想情况下,我希望一个数据集中的输出结尾行字符位于每个2769块的末尾,最后是文件结尾,以便我可以将其用作普通的UNIX数据集。伯尼。 – bernie110749

0
awk '{print > (FILENAME "." int((NR + 2768)/2769))}' YourFile 

文件名开始YourFile 0.1