Как разделить файл по номеру строки [закрыто]

94

Я хочу разделить файл журнала длиной 400 тыс. Строк из определенного номера строки.

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

Есть ли команда linux, которая позволяет мне это делать ( в сценарии )?

Я знаю, что splitпозволяет разделить файл на равные части либо по размеру, либо по номерам строк, но это не то, что я хочу. Я хочу, чтобы первые 300k в одном файле и последние 100k во втором файле.

Любая помощь будет оценена. Благодарность!

Если подумать, это больше подходит для сайта суперпользователя или сервера.

денормализатор
источник
17
Я думаю, что этот вопрос здесь уместен. У вас есть задача программирования, которую вы пытаетесь решить с помощью сценария оболочки; если это однострочник с использованием широко доступных инструментов Unix, тем лучше!
Джим Льюис
Я так же думал. Но опять же, я не писал сценарий оболочки :) да ладно, все равно нашел свой ответ. Спасибо
denormalizer
5
Это вопрос imho в порядке, без сомнения, это вопрос программирования, и он тоже не слишком локализован
Питер
9
почему это не по теме вопрос? Мысленная полиция безумнее, чем когда-либо.
Karel Bílek
7
Хотя этот вопрос может быть немного не по теме, он получил высокую оценку и является первым результатом в поисковых системах с такими запросами «linux split file at line». Таким образом, я предлагаю снова открыть этот вопрос, чтобы можно было добавить другие ценные ответы. Или хотя бы сделать ссылку на самый актуальный вопрос по SU.
Антуан Пинсар

Ответы:

179
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 помещает баланс входных данных в последний разделитель, поэтому

split -l 300000 file_name

будет выводить xaaс 300 тыс. строк и xab100 тыс. строк для входа с 400 тыс. строк.

академикРобот
источник
Спасибо. нашел аналогичный ответ на вопрос суперпользователя, т.е. использовать хвост и т. д. И, да, разделение будет работать с моим примером, но не всегда мой пример был 100K.
denormalizer
2
Если вы пытаетесь сделать это в Windows и не хотите использовать Cygwin, этот проект предоставляет все необходимые утилиты в виде собственных двоичных файлов win32 - unxutils.sourceforge.net
Джонатон Хилл
15
Я бы использовал tail -n +L file_name > bottom_filewhere просто L=K+1без необходимости wcсначала запускать
Hashbrown
2
Я бы предпочел использовать sed -n '1,1000p' test.log > top_test.log ; sed '1,1000d' test.log > bottom_test.log. IHMO, это более просто и не требует подсчета общего количества строк. Кроме того, он по-прежнему работает, если между выполнением каждой команды добавляются строки.
Антуан Пинсар
Для некоторых файлов в этом ответе остается строчка, но изменение, предложенное Hashbrown, устраняет проблему.
scharette