2017-06-05 6 views
0

Ich habe eine Textdatei, die Tausende von Zahlenwerten wie hat. . . . nSplitting große Datei in kleine Dateien

Ich weiß, dass wir awk verwenden können, um diese Werte zu trennen. Aber gibt es einen Weg, auf dem man erste 10,20,40,80,160 ...., n-Werte in verschiedenen Textdateien holen kann.

Ich war mit Python so zu tun, aber es braucht viel Zeit, um diese files.Here zu trennen, ist der Beispielcode für Python

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') 

und so weiter.

Gibt es eine bessere Möglichkeit, dies in bash oder in Python zu tun. Vielen Dank im Voraus!

+1

'np.loadtxt' alles Lasten auf einmal in den Speicher. Sie benötigen einen Iterator. Das Standard-Python-'open' bietet eine Iterator-Schnittstelle. Sie müssen die Analyse jedoch selbst durchführen. – ForceBru

+0

Was ist das gewünschte Ergebnis? Eine Reihe von Dateien mit jeweils Daten aus der ersten Spalte und 10, 20, ... n ersten Zeilen? Wie groß ist Ihre _n _ – 9000

+0

@ 9000:? Ja, Sie sind richtig, und die Dateien haben rund 36.000 Einträge –

Antwort

1

eine ineffiziente aber schnell apprach

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

da die Dateien überlappend zu implementieren sind, wird es bessere Möglichkeiten, aber von der Größe der Datei und wie oft sie wiederholt werden, muss dies sein könnte, basierend gut genug.

+0

Dank die für mich gearbeitet –

1

Sie keinen Abtastwerteingang und erwartete Ausgabe und den Text Ihrer Fragen nicht eindeutig vorsah so ist dies nur eine Vermutung, aber dies kann sein, was Sie suchen:

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

Wenn nicht, dann Bearbeite deine Frage, um sie zu klären.

1

SED ist dein Freund:

$ 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

dies einfach mit 'geteilt getan werden kann -l 100 ...' – karakfa

+1

Nun, Sie‘ Es macht einfach keinen Spaß! : P – Jack

+0

Nun können Sie behaupten, dass Sie den Befehl 'split' implementiert haben. – karakfa

Verwandte Themen