2010-06-18 21 views
88

Chcę podzielić plik logu o długości 400k z określonego numeru wiersza.Jak podzielić plik na numer wiersza

W przypadku tego pytania, dodajmy do tego liczbę 300k.

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

Wiem, że split pozwala mi podzielić plik na równe części według rozmiaru lub numerów linii, ale to nie jest to, czego chcę. Chcę pierwsze 300k w jednym pliku, a ostatnie 100k w drugim pliku.

Każda pomoc zostanie doceniona. Dzięki!

W drugiej chwili byłby bardziej odpowiedni dla superużytkownika lub witryny serwera.

+13

Myślę, że to pytanie jest w porządku tutaj. Masz zadanie programistyczne, które próbujesz rozwiązać za pomocą skryptu powłoki; jeśli jest to jedno-liniowy przy użyciu powszechnie dostępnych narzędzi Unix, tym lepiej! –

+0

Myślałem tak samo. Ale potem znowu nie pisałem skryptu powłoki :) no cóż, i tak znalazłem odpowiedź. Dzięki – denormalizer

+3

To pytanie jest bezbłędne, bez wątpienia, jest to pytanie programistyczne i nie jest zbyt zlokalizowane ani nie jest – Peter

Odpowiedz

171
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 

Również na drugim myśli, Split zadziała w Twoim przypadku, od pierwszego podziału jest większa niż sekundę. Podzielonego stawia bilans wejścia do ostatniego rozłamu, tak

split -l 300000 file_name

wyjście będzie xaa z 300k linii i xab z 100k linii, na wejście z 400k linii.

+0

Dzięki. znalazłem podobnie odpowiedział pytanie na superużytkownika tj. użyj ogona itp. I tak, podział będzie działał z moim przykładem, ale nie zawsze miałem mój przykład 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 - http://unxutils.sourceforge.net/ –

+12

Użyłbym 'tail -n + l nazwa_pliku_logu> bottom_file' gdzie tylko 'L = k + 1 'bez konieczności wykonywania' wc' pierwszy – Hashbrown