我有一個記錄長度爲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 –