Mam duży (według liczby wierszy) zwykły plik tekstowy, który chciałbym podzielić na mniejsze pliki, również według liczby wierszy. Więc jeśli mój plik ma około 2 mln linii, chciałbym podzielić go na 10 plików zawierających 200 000 linii lub 100 plików zawierających 20 000 linii (plus jeden plik z resztą; bycie równo podzielne nie ma znaczenia).
Mogę to zrobić dość łatwo w Pythonie, ale zastanawiam się, czy istnieje jakiś sposób ninja, aby to zrobić za pomocą narzędzi bash i unix (w przeciwieństwie do ręcznego zapętlania i liczenia / dzielenia linii).
cat part* > original
Odpowiedzi:
Czy spojrzałeś na polecenie podziału?
Możesz zrobić coś takiego:
który utworzy pliki zawierające 200 000 linii o nazwie
xaa xab xac
...Inna opcja, podzielona według rozmiaru pliku wyjściowego (nadal dzieli się przy podziale wierszy):
tworzy pliki takie jak
output_prefix01 output_prefix02 output_prefix03 ...
każdy o maksymalnym rozmiarze 20 megabajtów.źródło
split -b 200m filename
(m dla megabajtów, k dla kilobajtów lub brak sufiksu dla bajtów)-d
opcja nie jest dostępna w OSX, użyjgsplit
zamiast tego. Mam nadzieję, że to przydatne dla użytkowników komputerów Mac.Co powiesz na polecenie split ?
źródło
Tak, jest
split
polecenie. Dzieli plik według linii lub bajtów.źródło
split -l 1000000 train_file train_file.
w tym samym katalogu otrzymamtrain_file.aa
pierwszy milion, a następnietrail_file.ab
następny milion itd.split input my/dir/
.posługiwać się
split
Syntax split [options] [INPUT [PREFIX]]
http://ss64.com/bash/split.html
źródło
Posługiwać się:
Tutaj 1 i 100 to numery linii, w których będziesz przechwytywać
output.txt
.źródło
split
tak jak mówią wszystkie najlepsze odpowiedzi tutaj.podziel plik „file.txt” na pliki 10000 linii:
źródło
split
(z GNU coreutils, od wersji 8.8 z 2010-12-22 ) zawiera następujący parametr:W ten sposób
split -n 4 input output.
wygeneruje cztery pliki (output.a{a,b,c,d}
) z taką samą ilością bajtów, ale linie mogą być przerwane w środku.Jeśli chcemy zachować pełne linie (tj. Dzielić na linie), to powinno działać:
Powiązana odpowiedź: https://stackoverflow.com/a/19031247
źródło
Jeśli chcesz po prostu podzielić x liczbę wierszy każdego pliku, podane odpowiedzi
split
są w porządku. Ale jestem ciekawy, czy nikt nie zwrócił uwagi na wymagania:Nie mogę tego zrobić bez „wc + cut”, ale używam tego:
Można to łatwo dodać do funkcji bashrc, aby można było po prostu wywołać przekazanie nazwy pliku i fragmentów:
Jeśli chcesz tylko x fragmentów bez pozostałej części dodatkowego pliku, po prostu dostosuj formułę do sumowania (fragmenty - 1) na każdym pliku. Stosuję to podejście, ponieważ zwykle chcę po prostu x liczby plików zamiast x linii na plik:
Możesz dodać to do skryptu i nazwać to „ninja”, ponieważ jeśli nic nie odpowiada twoim potrzebom, możesz go zbudować :-)
źródło
-n
opcjisplit
.możesz także użyć awk
źródło
awk -v lines=200000 -v fmt="%d.txt" '{print>sprintf(fmt,1+int((NR-1)/lines))}'
HDFS wkleja mały plik i rozlewa do rozmiaru nieruchomości.
Ta metoda spowoduje przerwanie linii
Próbuję się zanurzyć i podzielić na około 128 MB na każdy plik.
źródło