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

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
chepner
источник
Это заслуживает больших пальцев. если вы хотите разделить файл с 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).

jh314
источник
5

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

csplit file N+1

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

csplit file N
don_crissti
источник
Это великолепно! Спасибо, это решило проблему идеально для меня.
Зертрин
Наилучшая производительность для разделения файла размером 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для получения дополнительной информации.

twalberg
источник
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

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


источник