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


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.