У меня проблема с просмотром фрагментов очень большого текстового файла. Этот файл, размером приблизительно 19 ГБ, очевидно, слишком велик для просмотра любыми традиционными способами.
Я попытался head 1
и tail 1
( head -n 1
и tail -n 1
) с обеими командами по-разному соединены (чтобы получить кусок в середине) без удачи. Моя Linux-машина с Ubuntu 9.10 не может обработать этот файл.
Как мне обработать этот файл? Моя конечная цель - отточить линии 45000000 и 45000100.
split
облегчить работу с большим файлом.dd
то, что вам нужно. Напримерdd if=bigfile of=extractfile bs=1M skip=10240 count=5
извлечет 5 МБ из файла, начиная с точки 10 ГБ.Ответы:
Вы должны использовать
sed
.Это говорит
sed
о необходимости печатать строки 45000000-45000100 включительно и выходить из строки 45000101.источник
tail+|head
быстрее на 10-15%.Создайте базу данных MySQL с одной таблицей, которая имеет одно поле. Затем импортируйте ваш файл в базу данных. Это позволит легко найти определенную строку.
Я не думаю, что что-то еще может быть быстрее (если
head
иtail
уже не получится ). В конце концов, приложение, которое хочет найти строкуn
, должно выполнить поиск по всему файлу, пока не найдетn
новые строки. Без какого-либо поиска (строковый индекс к байтовому смещению в файл) невозможно добиться лучшей производительности.Учитывая, как легко создать базу данных MySQL и импортировать в нее данные, я чувствую, что это жизнеспособный подход.
Вот как это сделать:
/tmp/my_large_file
будет файл, который вы хотите прочитать.Правильный синтаксис для импорта файла с разделенными табуляцией значениями в каждой строке:
Еще одним важным преимуществом этого является то, что, если вы решите позднее извлечь другой набор строк, вам не придется ждать часами обработки снова (если, конечно, вы не удалите базу данных).
источник
sed
командой ниже и определил мои строки. Но теперь у меня есть дополнительный вопрос, для которого метод базы данных может быть лучше подходит. Теперь мне нужно удалить пару сотен строк из файла.sed
мог бы сделать это также. Конечно, если бы у вас были данные в базе данных, было бы тривиально экспортировать новый файл с нужными строками.sed
ответ (потому что он доставил мне больше непосредственного удовольствия; -), но дал вам возможность проголосовать, потому что я буду использовать ваш метод в будущем. Я признателен за это.FIELDS TERMINATED BY '\n'
вLOAD DATA
строку.Два старых добрых инструмента для больших файлов есть
join
иsplit
. Вы можете использовать разделение с--lines=<number>
опцией, которая сокращает файл до нескольких файлов определенного размера.Например
split --lines=45000000 huge_file.txt
. Полученные части будут представлены в виде xa, xb и т. Д. Затем вы можете получитьhead
часть xb, которая будет содержать нужные вам строки. Вы также можете «объединить» файлы обратно в один большой файл.источник
У вас есть нужные инструменты, но вы используете их неправильно. Как ранее ответили в U & L,
tail -n +X file | head -n Y
(обратите внимание, что+
) на 10-15% быстрее, чемsed
для линий Y, начинающихся с X. И удобно, вам не нужно явноexit
обрабатывать процесс как сsed
.источник