Вы должны использовать sed
.
sed -n -e 45000000,45000100p -e 45000101q bigfile > savedlines
Это говорит sed
о необходимости печатать строки 45000000-45000100 включительно и выходить из строки 45000101.
У меня проблема с просмотром фрагментов очень большого текстового файла. Этот файл, размером примерно 19 ГБ, очевидно, слишком велик для просмотра любыми традиционными способами.
Я попытался head 1
и tail 1
( head -n 1
и tail -n 1
) с обеими командами по-разному соединены (чтобы получить кусок в середине) без удачи. Моя Linux-машина с Ubuntu 9.10 не может обработать этот файл.
Как мне обработать этот файл? Моя конечная цель - отточить линии 45000000 и 45000100.
Вы должны использовать sed
.
sed -n -e 45000000,45000100p -e 45000101q bigfile > savedlines
Это говорит sed
о необходимости печатать строки 45000000-45000100 включительно и выходить из строки 45000101.
Создайте базу данных MySQL с одной таблицей, которая имеет одно поле. Затем импортируйте ваш файл в базу данных. Это позволит легко найти определенную строку.
Я не думаю, что что-то еще может быть быстрее (если head
и tail
уже не получится ). В конце концов, приложение, которое хочет найти строку n
, должно выполнить поиск по всему файлу, пока не найдет n
новые строки. Без какого-либо поиска (строковый индекс к байтовому смещению в файл) невозможно добиться лучшей производительности.
Учитывая, как легко создать базу данных MySQL и импортировать в нее данные, я чувствую, что это жизнеспособный подход.
Вот как это сделать:
DROP DATABASE IF EXISTS helperDb; CREATE DATABASE `helperDb`; CREATE TABLE `helperDb`.`helperTable`( `lineIndex` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `lineContent` MEDIUMTEXT, PRIMARY KEY (`lineIndex`) ); LOAD DATA INFILE '/tmp/my_large_file' INTO TABLE helperDb.helperTable (lineContent); SELECT lineContent FROM helperTable WHERE ( lineIndex > 45000000 AND lineIndex < 45000100 );
/tmp/my_large_file
будет файл, который вы хотите прочитать.
Правильный синтаксис для импорта файла с разделенными табуляцией значениями в каждой строке:
LOAD DATA INFILE '/tmp/my_large_file' INTO TABLE helperDb.helperTable FIELDS TERMINATED BY '\n' (lineContent);
Еще одним важным преимуществом этого является то, что, если вы решите позднее извлечь другой набор строк, вам не придется ждать часами обработки снова (если, конечно, вы не удалите базу данных).
Two good old tools for big files are join
and split
. You can use split with --lines=<number>
option that cut file to multiple files of certain size.
For example split --lines=45000000 huge_file.txt
. The resulted parts would be in xa, xb, etc. Then you can head
the part xb which would include the the lines you wanted. You can also 'join' files back to single big file.
У вас есть нужные инструменты, но вы используете их неправильно. Как было сказано ранее в U & L, tail -n +X file | head -n Y
(обратите внимание, что +
) на 10-15% быстрее, чем sed
для линий Y, начинающихся с X. И удобно, что вам не нужно явно exit
обрабатывать процесс, как с sed
.
tail будет читать и отбрасывать первые строки X-1 (пути назад нет), затем читать и печатать следующие строки. head прочитает и напечатает требуемое количество строк, затем выйдет. Когда голова выходит, tail получает сигнал SIGPIPE и умирает, поэтому он не будет считывать из входного файла строки размером больше буфера (обычно несколько килобайт).