2015-09-07 75 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