Czy lubisz korzystać z polecenia podziału? Jeśli nie, możesz to łatwo zrobić za pomocą prostej manipulacji tekstem, z pewnością używając Perla lub Pythona. Tak długo, jak plik nie jest zbyt zły, wczytaj go do pamięci jako ciąg, a następnie podziel ciąg. Jeśli plik jest zbyt duży, potrzeba więcej pracy.
Faheem Mitha
@Faheem Mitha Plik ma 64 MB. Podoba mi się pomysł używania podziału, ponieważ jest on szybszy niż pisanie kodu. Zastanawiałem się teraz, czy jeśli podam liczbę wierszy odpowiadających 70% pliku, otrzymam duży plik i mały plik. Czy to nie powinno działać?
aneuryzm
I tak .. zadziałało .. Czy powinienem usunąć pytanie?
Na MacOSX wc czasami zwraca liczbę wierszy ze spacją przed nimi, co psuje ten skrypt. Pierwsze potokowanie do xargs usunie te spacje i sprawi, że wszystko znowu split -l $[ $(wc -l filename | xargs | cut -d" " -f1) * 70 / 100 ] filename
zacznie
4
Możesz użyć csplitdo podzielenia na dwie części (używając dowolnego procentu) np. Pierwsza część - pierwsze 20% linii, druga część - pozostałe 80% linii:
$(wc -l < infile): całkowita liczba linii 2 / 10: procent +1: dodaj jedną linię, ponieważ csplitdzieliup to but not including line N
Możesz jednak dzielić tylko na podstawie linii.
Zasadniczo, o ile masz numer linii $(( $(wc -l < file) * 2 / 10)), możesz użyć dowolnego narzędzia zorientowanego na linię:
sed 1,$(( $(wc -l < infile) * 2 / 10))'{
w 20-infile
d
}' infile > 80-infile
... powinien działać w tym prostym przypadku, ponieważ dzielisz tylko raz - i prawdopodobnie splitjest to trochę przesada. Tak długo, jak plik jest widoczny, ddwykona tylko jeden read()na nim <stdin, a więc catpozostanie rozpocząć read()od momentu, w którym ddgo opuści.
Jeśli plik jest duży, to count=1 bs=$big_ol_nummoże stać się trochę nieporęczny i można go zablokować za pomocą dodatkowej - ale prostej - matematyki powłoki.
Wejście niż możliwy do przeszukania - jak z rury - może pochylać dd"S wyniki, chociaż mogą być również traktowane jako w / GNU ddjest iflag=fullblock.
Odpowiedzi:
Poniższe polecenia będą działać dla wartości procentowych powyżej 50% (jeśli chcesz podzielić tylko na dwa pliki), szybkie i brudne podejście.
1) podział 70% na podstawie linii
2) podziel 70% na podstawie bajtów
źródło
split -l $[ $(wc -l filename | xargs | cut -d" " -f1) * 70 / 100 ] filename
Możesz użyć
csplit
do podzielenia na dwie części (używając dowolnego procentu) np. Pierwsza część - pierwsze 20% linii, druga część - pozostałe 80% linii:$(wc -l < infile)
: całkowita liczba linii2 / 10
: procent+1
: dodaj jedną linię, ponieważcsplit
dzieliup to but not including line N
Możesz jednak dzielić tylko na podstawie linii.
Zasadniczo, o ile masz numer linii
$(( $(wc -l < file) * 2 / 10))
, możesz użyć dowolnego narzędzia zorientowanego na linię:lub nawet chłodniejsze:
chociaż niektóre
head
są głupie i nie są zgodne ze standardami, więc nie będzie działać na wszystkich konfiguracjach ...źródło
... powinien działać w tym prostym przypadku, ponieważ dzielisz tylko raz - i prawdopodobnie
split
jest to trochę przesada. Tak długo, jak plik jest widoczny,dd
wykona tylko jedenread()
na nim<stdin
, a więccat
pozostanie rozpocząćread()
od momentu, w którymdd
go opuści.Jeśli plik jest duży, to
count=1 bs=$big_ol_num
może stać się trochę nieporęczny i można go zablokować za pomocą dodatkowej - ale prostej - matematyki powłoki.Wejście niż możliwy do przeszukania - jak z rury - może pochylać
dd
"S wyniki, chociaż mogą być również traktowane jako w / GNUdd
jestiflag=fullblock
.źródło
Poniższy kod używa
head
itail
działa z dowolnym współczynnikiem (w tym przypadku 40 do 60):źródło