Jak złożyć wniosek o podział pod numerem linii [zamknięty]

94

Chcę podzielić plik dziennika o długości 400 tys. Wierszy z określonego numeru wiersza.

W przypadku tego pytania zróbmy to dowolną liczbę 300k.

Czy istnieje polecenie systemu Linux, które pozwala mi to zrobić ( w skrypcie )?

Wiem, że splitpozwala mi podzielić plik na równe części według rozmiaru lub numerów linii, ale nie tego chcę. Chcę, aby pierwsze 300 KB w jednym pliku i ostatnie 100 KB w drugim pliku.

Każda pomoc będzie mile widziana. Dzięki!

Po zastanowieniu byłoby to bardziej odpowiednie dla witryny superużytkownika lub witryny z błędem serwera.

denormalizer
źródło
17
Myślę, że to pytanie jest w porządku. Masz zadanie programistyczne, które próbujesz rozwiązać za pomocą skryptu powłoki; jeśli jest to jednolinijkowy, wykorzystujący powszechnie dostępne narzędzia Unix, tym lepiej!
Jim Lewis
Myślałem tak samo. Ale z drugiej strony nie pisałem skryptu powłoki :) no cóż, i tak znalazłem odpowiedź. Dzięki
denormalizer
5
To pytanie jest imho w porządku, bez wątpienia jest to pytanie programistyczne i nie jest też zbyt zlokalizowane
Peter
9
dlaczego jest to pytanie niezwiązane z tematem? myśl, że policja jest bardziej szalona niż kiedykolwiek.
Karel Bílek
7
Chociaż to pytanie może być nieco niezwiązane z tematem, jest wysoko oceniane i jest pierwszym wynikiem w wyszukiwarkach z takimi zapytaniami „linux split file at line”. Dlatego proponuję ponownie otworzyć to pytanie, aby można było dodać inne cenne odpowiedzi. Lub przynajmniej zrób link do najbardziej odpowiedniego pytania na SU.
Antoine Pinsard

Odpowiedzi:

178
file_name=test.log

# set first K lines:
K=1000

# line count (N): 
N=$(wc -l < $file_name)

# length of the bottom file:
L=$(( $N - $K ))

# create the top of file: 
head -n $K $file_name > top_$file_name

# create bottom of file: 
tail -n $L $file_name > bottom_$file_name

Ponadto, po zastanowieniu się, podział będzie działał w twoim przypadku, ponieważ pierwszy podział jest większy niż drugi. Split umieszcza równowagę wejścia w ostatnim splicie, więc

split -l 300000 file_name

wyświetli xaa300 tys. linii i xab100 tys. linii, dla wejścia zawierającego 400 tys. linii.

akademickiRobot
źródło
Dzięki. znalazłem podobnie odpowiedź na pytanie w superużytkowniku tj. użyj ogona itp. Tak, split będzie działał z moim przykładem, ale nie zawsze, gdy mój przykład to 100K.
denormalizer
2
Jeśli próbujesz to zrobić w systemie Windows i nie chcesz używać Cygwin, ten projekt zapewnia wszystkie potrzebne narzędzia jako natywne pliki binarne win32 - unxutils.sourceforge.net
Jonathon Hill
15
Użyłbym tail -n +L file_name > bottom_filetam, gdzie po prostu L=K+1nie trzeba biegać wcpierwszy
Hashbrown,
2
Wolałbym raczej użyć sed -n '1,1000p' test.log > top_test.log ; sed '1,1000d' test.log > bottom_test.log. IHMO, jest to prostsze i nie wymaga obliczania całkowitej liczby linii. Ponadto nadal działa, jeśli między wykonaniem każdego polecenia zostały dołączone wiersze.
Antoine Pinsard
W przypadku niektórych plików ta odpowiedź pozostawia linię, ale zmiana sugerowana przez Hashbrown rozwiązuje problem.
scharette