Как легко разбить текстовый файл на части меньше порога?

5619
WilliamKF

У меня есть некоторые текстовые файлы длиной от 100 до 300 МБ, которые я хочу просмотреть в Emacs, но мой Emacs сталкивается с некоторыми проблемами с производительностью, открывая и просматривая такие большие файлы. Поэтому я ищу простую утилиту для разделения файла на управляемые фрагменты, скажем, по 50 МБ каждый, и для именования фрагментов на основе исходного имени и некоторого суффикса для указания их расположения в последовательности. Каждый чанк выбирается там, где был обрезан предыдущий, и не длиннее 50 МБ, а последний чанк, возможно, короче.

Есть ли какой-нибудь простой инструмент для такой работы на компьютере с Linux, возможно, что-то вроде головы или хвоста, дающее несколько результатов, по одному на каждый кусок?

например, для данного файла test.outдлиной 120 МБ разбейте его на test.out.1первые 50 МБ, test.out.2вторые 50 МБ и test.out.3оставшиеся 20 МБ в конце файла.

Я мог бы использовать комбинации headи, tailчтобы получить кусочки, но мне нужен инструмент, который абстрагирует все это, возможно, скрипт Perl или скрипт Python, который кто-то уже создал для выполнения такой задачи?

5

1 ответ на вопрос

18
Hennes

There already is a nice tool for that: split

> man 1 split NAME split -- split a file into pieces SYNOPSIS split [-l line_count] [-a suffix_length] [file [prefix]] split -b byte_count[K|k|M|m|G|g] [-a suffix_length] [file [prefix]] split -p pattern [-a suffix_length] [file [prefix]] 


split --bytes 50M test.out test.out_ would split the file test.out into test.out_xaa, test.out_xab, test.out_xac, ...

A much uglier solution would be to use dd

dd if=test.out of=test.out.part1 bs=1M count=50 skip=0 creates a file named test.out.part1 with the first 50M from test.out. You can increase the value for skip to 1 to get the second chunk, to 2 for the third etc etc. Just make sure to also change the filenames or you will end up overwriting the same output file.

По крайней мере, в моем Linux строчная буква «m» требуется для мегабайт. WilliamKF 10 лет назад 0
Еще одна новая команда узнала ☺ Ramchandra Apte 10 лет назад 0
@williamKF: Какой это был вкус Linux? Я проверил на Ubuntu и FreeBSD. FreeBSD требовалось `-b 50M` (нет опции для --bytes). И Ubuntu принял как обычный `m`, так и прописной` M`. Hennes 10 лет назад 0
@Hennes `split (coreutils) 5.2.1 февраль 2011` на моем Linux centos4 32 бит 2.6.9-103.ELsmp # 1 SMP пт 9 декабря 04:31:51 EST 2011 i686 i686 i386 GNU / Linux WilliamKF 10 лет назад 0

Похожие вопросы