Разделить файл на два файла в заданной строке


12

Я ищу способ в Unix разделить файл на два файла по заданному номеру строки.

split -l 100 file_nameблизко к тому, что я ищу, но эта команда создает несколько файлов, каждый из 100 строк. Я ищу команду для разделения файла на два файла с заданным номером строки. Есть ли способ сделать это в Unix?

Ответы:


13

Немного более трудное решение:

(head -100 > f1.txt; cat > f2.txt) < input.txt

1
Хорошее решение. Не считая wcдо и входной файл по-прежнему обрабатывается только один раз, как в случае с awkрешением.
— Дубу

2
Существует небольшая вероятность, что headбудет прочитано более 100 строк, чтобы найти первые 100 строк для вывода f1.txt; эти дополнительные байты не будут видны cat.
— chepner

Это так чертовски медленно
— sdaffa23fdsf

12

Используйте awk, так что вам нужно сделать всего один проход через входной файл. Далее предполагается, что вы хотите первые 122 строки в первом файле, а остальные во втором.

awk 'NR < 123 { print >> "top_file"; next } {print >> "bottom_file" }' file_name

Это заслуживает больших пальцев. если вы хотите разделить файл с X на Y, это проще всего.
— Гленн Плас

Это самое простое решение для понимания. Работая как обаяние ... и заставляет меня думать, что мне следует стереть пыль с моей книги O'Reilly Sed & Awk, которая была у меня с 1999 года или около того, раздел sed хорошо читается, раздел awk не так уж и много.
— Майкл

Это лучше, чем исключенное решение по причине, указанной @chepner в комментариях. Вы потеряете символы в файле 'f2.txt'. Это решение является точным и эффективным. awk ftw.
— Горан

7

Вы можете использовать headи tailполучить обе части:

head -n K file_name > top_file
tail -n L file_name > bottom_file

где Kномер строки и Lколичество строк снизу (общее количество строк - K).

(вы можете получить общее количество строк, используя wc -l file_name).


5

Вы можете использовать csplit(если доступно), чтобы сделать это:

csplit file N+1

разделит файл на две части, одна часть до (и включая) номер строки, Nа другая часть от номера строки N+1до последней строки.
Если вы хотите разделить на (но не включая) номер строки N:

csplit file N

Это великолепно! Спасибо, это решило проблему идеально для меня.
— Зертрин

Наилучшая производительность для разделения файла размером 20 ГБ на части.
— dr0i

@ dr0i - неудивительно, csplitоптимизирован для этой работы.
— don_crissti

Разделив 200-мегапиксельный файл, я «исчерпал память», используя csplit, датированный до 2008 года. С помощью csplit, датированный до 2011 года, это работает :)
— dr0i

4

Оба headи tailимеют параметры для создания строк из «другого» конца файла, чем они могли бы. Итак, у вас есть эти два варианта:

head -n 100 source.txt > file1.txt
head -n -100 source.txt > file2.txt

или (где NNN на 100 меньше, чем результат wc -l source.txt):

tail -n +NNN source.txt > file1.txt
tail -n NNN source.txt > file.txt

Вы можете прочитать справочные страницы для своих версий headи tailдля получения дополнительной информации.


0

Вы можете использовать «wc», «dc», «head» и «tail». Т.е.

unix> wc -l foo
545 /tmp/foo
unix> dc -e '545 100 - p'
445
unix> head -n 100 foo > filea
unix> tail -n 445 foo > fileb

Для простоты использования, вы можете превратить выше в сценарий оболочки.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.