2017-06-05 89 views
0

我有有數千個值的數量一樣的文本文件。 。 。 。 n分裂大文件分成小文件

我知道我們可以使用awk來分離這些值。但是有沒有辦法可以在不同的文本文件中獲取第一個10,20,40,80,160 ....,n個值。

我使用Python這樣做,但它需要大量的時間去這些files.Here分開是蟒蛇

import numpy as np 
from itertools import islice 
data = np.loadtxt('ABC.txt', 
       unpack=True, 
       delimiter=',', 
       skiprows=1) 
n = 10 
iterator = list(islice(data[0], n)) 
for item in range(n): 
np.savetxt('output1.txt',iterator,delimiter=',',fmt='%10.5f') 

iterator = list(islice(data[0], n*2)) 
for item in iterator: 
np.savetxt('output2.txt', iterator, delimiter=',',fmt='%10.5f') 

iterator = list(islice(data[0], n*4)) 
for item in iterator: 
np.savetxt('output3.txt', iterator, delimiter=',',fmt='%10.5f') 

iterator = list(islice(data[0], n*8)) 
for item in iterator: 
np.savetxt('output4.txt', iterator, delimiter=',',fmt='%10.5f') 

等的示例代碼。

是否有更好的方式在bash或python中做到這一點。先謝謝你!

+1

'np.loadtxt'負載一切在一次到內存中。你需要一個迭代器。標準Python的'open'提供了一個迭代器接口。不過,你必須自己解析。 – ForceBru

+0

期望的結果是什麼?一堆文件,每個文件都有來自第一列和10,20,... n個第一行的數據?你的_n有多大?_ – 9000

+0

@ 9000:是的,你是對的,這些文件有大約36000個條目 –

回答

1

一個低效的,但快速實施apprach

s=5; for i in {1..10}; do ((s*=2)); head -$s file > sub$i; done 

,因爲這些文件是重疊的,會有更好的辦法,但根據文件的大小和多少次它需要重複這可能是夠好了。

+0

謝謝你對我的工作 –

1

你沒有提供任何樣品的輸入和預期的輸出和你的問題的文字有歧義所以這只是一個猜測,但是這可能是你在找什麼:

$ seq 1000 | awk -v c=10 'NR==c{print; c=2*c}' 
10 
20 
40 
80 
160 
320 
640 

如果沒有,那麼編輯你的問題澄清。

1

SED是你的朋友:

$ numlines=$(wc -l big_text_file.txt | cut -d' ' -f1) 

$ step=100 

$ echo $numlines 
861 

$ for ((ii=1; ii<=$numlines; ii+=$step)); do echo $ii,$((ii+step-1))w big_text_file.${ii}.txt; done > break.sed 

$ cat break.sed 
1,100w big_text_file.1.txt 
101,200w big_text_file.101.txt 
201,300w big_text_file.201.txt 
301,400w big_text_file.301.txt 
401,500w big_text_file.401.txt 
501,600w big_text_file.501.txt 
601,700w big_text_file.601.txt 
701,800w big_text_file.701.txt 
801,900w big_text_file.801.txt 

$ sed -n -f break.sed big_text_file.txt 

$ wc -l big_text_file*.txt 
    100 big_text_file.101.txt 
    100 big_text_file.1.txt 
    100 big_text_file.201.txt 
    100 big_text_file.301.txt 
    100 big_text_file.401.txt 
    100 big_text_file.501.txt 
    100 big_text_file.601.txt 
    100 big_text_file.701.txt 
    61 big_text_file.801.txt 
    861 big_text_file.txt 
    1722 total 
+0

這可以簡單地用'split -l 100 ...' – karakfa

+1

那麼,只是沒有樂趣! :P – Jack

+0

現在你可以聲稱你實現了'split'命令。 – karakfa