Як подати розділення за номером рядка [закрито]


94

Я хочу розділити файл журналу довжиною 400 кб з певного номера рядка.

Для цього питання давайте зробимо це довільним числом 300k.

Чи існує команда Linux, яка дозволяє мені це робити ( всередині сценарію )?

Я знаю, splitдозволяє мені розділити файл на рівні частини або за розміром, або за номерами рядків, але це не те, що я хочу. Я хочу, щоб перші 300k в одному файлі і останні 100k у другому.

Будь-яка допомога буде вдячна. Дякую!

По-друге, це більше підходить для сайту суперпользователя або сервера за замовчуванням.


16
Я думаю, що це питання тут добре. У вас є завдання програмування, яке ви намагаєтеся вирішити за допомогою сценарію оболонки; якщо це однолінійний інструмент, що використовує широко доступні інструменти Unix, тим краще, тим краще!
Джим Льюїс

Я думав те саме. Але знову ж таки, я не писав сценарій оболонки :) о, добре, я все одно знайшов свою відповідь. Спасибі
денормалізатор

5
Це питання без сумніву, це питання програмування, і воно не надто локалізоване
Петро,

9
чому це поза темою питання? думка поліції божевільна як ніколи.
Карел Білек

6
Хоча це питання може бути трохи поза темою, воно дуже голосує і є першим результатом в пошукових системах з такими запитами "Linux split file at line". Таким чином, я пропоную знову відкрити це питання, щоб можна було додати інші цінні відповіді. Або принаймні зробіть посилання на найбільш відповідне питання щодо SU.
Антуан Пінсар

Відповіді:


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

Також, по другій думці, розкол буде працювати у вашому випадку, оскільки перший розкол більший за другий. Спліт ставить баланс вхідних даних в останній розділ, так

split -l 300000 file_name

буде виводитися xaaз 300k рядків і xab100k рядків, для введення з 400k рядків.


Дякую. знайшов подібне відповідь на запитання у суперкористувача, тобто. використовувати хвіст і т. д. І так, спліт буде працювати з моїм прикладом, але не завжди мій приклад був 100K
денормалізатор

2
Якщо ви намагаєтеся зробити це в Windows і не хочете використовувати Cygwin, цей проект надає всі необхідні утиліти як власні двійкові файли win32 - unxutils.sourceforge.net
Джонатан Хілл

15
Я б використав tail -n +L file_name > bottom_fileтам, де просто L=K+1не потрібно бігати wcпершим
Хешбровн

2
Я б скоріше використав sed -n '1,1000p' test.log > top_test.log ; sed '1,1000d' test.log > bottom_test.log. IHMO, це простіше і не вимагає обчислення загальної кількості рядків. Також він все ще працює, якщо між виконанням кожної команди були додані рядки.
Антуан Пінсар

Для деяких файлів ця відповідь залишає рядок, але редакція, запропонована Hashbrown, виправляє проблему.
scharette
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.