5

У меня есть некоторые текстовые файлы длиной от 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-скрипт, который кто-то уже создал для выполнения такой задачи?

1 ответ1

18

Для этого уже есть хороший инструмент: 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_ разделит файл test.out на test.out_xaa, test.out_xab, test.out_xac, ...

Гораздо более уродливым решением было бы использовать dd

dd if=test.out of=test.out.part1 bs=1M count=50 skip=0 создает файл с именем test.out.part1 с первыми 50M из test.out. Вы можете увеличить значение для skip до 1, чтобы получить второй блок, до 2 для третьего и т.д. И т.д. Просто убедитесь, что вы также изменили имена файлов, иначе вы перезапишете тот же выходной файл.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .