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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.