Как разделить большой текстовый файл на меньшие файлы с равным количеством строк?
У меня есть большой текстовый файл (по количеству строк), который я хотел бы разбить на более мелкие файлы, тоже по количеству строк. Например, если в моем файле около 2 миллионов строк, мне нужно разбить его на 10 файлов, каждый из которых содержит 200 тысяч строк, или на 100 файлов по 20 тысяч строк (плюс один файл с остатком; равное деление не критично).
Я мог бы сделать это достаточно легко на Python, но интересует, существует ли какой-либо "ниндзя-способ" сделать это с использованием Bash и утилит Unix, вместо того чтобы вручную перебрать строки и разбить файл.
5 ответ(ов)
Да, существует команда split
. Она позволяет разделить файл на части по строкам или байтам.
Пример использования команды:
$ split --help
Usage: split [OPTION]... [INPUT [PREFIX]]
Выводит части фиксированного размера из INPUT в файлы PREFIXaa, PREFIXab и т.д.; размер по умолчанию - 1000 строк, а префикс по умолчанию - `x`. Если INPUT не указан или равен -, читается стандартный ввод.
Обязательные аргументы для длинных опций являются обязательными и для коротких опций.
-a, --suffix-length=N использовать суффиксы длиной N (по умолчанию 2)
-b, --bytes=SIZE выводить SIZE байт в файл вывода
-C, --line-bytes=SIZE выводить не более SIZE байт строк в файл вывода
-d, --numeric-suffixes использовать числовые суффиксы вместо буквенных
-l, --lines=NUMBER выводить NUMBER строк в файл вывода
--verbose выводить диагностическую информацию перед тем,
как будет открыт каждый файл вывода
--help показать эту справку и выйти
--version вывести информацию о версии и выйти
SIZE может иметь суффикс множителя:
b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024,
GB 1000*1000*1000, G 1024*1024*1024 и так далее для T, P, E, Z, Y.
Чтобы разбить большой текстовый файл на меньшие файлы по 1000 строк каждый:
split <файл> -l 1000
Чтобы разбить большой бинарный файл на меньшие файлы по 10М каждый:
split <файл> -b 10M
Чтобы объединить разбитые файлы в один файл:
cat x* > <файл>
Разбить файл так, чтобы каждый отдельный файл содержал 10 строк (кроме последнего фрагмента):
split -l 10 имя_файла
Разделить файл на 5 частей. Файл разбивается так, чтобы каждая часть имела одинаковый размер (кроме последнего фрагмента):
split -n 5 имя_файла
Разделить файл, чтобы в каждом фрагменте было по 512 байт (кроме последнего фрагмента; используйте 512k для килобайт и 512m для мегабайт):
split -b 512 имя_файла
Разделить файл так, чтобы в каждом фрагменте было не более 512 байт, не нарушая целостности строк:
split -C 512 имя_файла
Чтобы разделить файл "file.txt" на части, содержащие по 10,000 строк каждая, вы можете воспользоваться командой split
в Unix-подобных операционных системах. Вот как это можно сделать:
split -l 10000 file.txt
Эта команда создаст несколько файлов, названия которых будут начинаться с "xaa", "xab" и так далее. Если вы хотите использовать более понятные имена для выходных файлов, вы можете добавить префикс с помощью параметра -d
и указать свой префикс. Например:
split -l 10000 -d -a 3 file.txt output_
В этом случае выходные файлы будут называться output_000
, output_001
и так далее.
Не забудьте проверить, что у вас есть необходимые права доступа к файлу и директории, куда будет производиться запись.
Вы можете использовать следующую команду sed
, чтобы вывести строки с 1 по 100 из файла и сохранить результат в output.txt
:
sed -n '1,100p' filename > output.txt
В этой команде 1
и 100
— это номера строк, которые вы хотите скопировать в файл output.txt
. Опция -n
подавляет автоматический вывод, а команда p
заставляет sed
печатать только указанные строки.
Вы можете разделить файл "toSplit.txt" на более мелкие файлы по 200 строк, используя команду split
в Unix-подобных системах. Вот пример того, как это сделать:
split -l 200 --numeric-suffixes --additional-suffix=".txt" toSplit.txt splited
В этом примере -l 200
указывает количество строк в каждом создаваемом файле. Параметр --numeric-suffixes
добавляет числовые суффиксы к именам выходных файлов, а --additional-suffix=".txt"
добавляет расширение .txt
к каждому из них. В результате, вы получите файлы с именами "splited00.txt", "splited01.txt", ..., "splited25.txt", в зависимости от общего количества строк в исходном файле.
Что означает "2>&1"?
Разница между sh и Bash
Прерывание скрипта оболочки при возвращении любой команды ненулевого значения
Как отключить индикатор прогресса в cURL?
Как узнать, в какой интерактивной оболочке я нахожусь (командная строка)