在巨大的文本文件上使用“head”或“tail” - 19 GB

nic*_*ius 23 tail head

我在查看非常大的文本文件块时遇到问题。这个大约 19 GB 的文件显然太大了,无法通过任何传统方式查看。

我已经尝试过head 1and tail 1( head -n 1and tail -n 1) 以各种方式将两个命令连接在一起(以获取中间部分),但没有运气。我的运行 Ubuntu 9.10 的 Linux 机器无法处理这个文件。

我如何处理这个文件?我的最终目标是在 45000000 和 45000100 线上磨练。

Kyl*_*nes 16

你应该使用sed.

sed -n -e 45000000,45000100p -e 45000101q bigfile > savedlines
Run Code Online (Sandbox Code Playgroud)

这告诉sed打印第 45000000-45000100 行,并在第 45000101 行退出。


Der*_*ler 5

使用具有单个字段的单个表创建 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 );
Run Code Online (Sandbox Code Playgroud)

/tmp/my_large_file将是您要读取的文件。

导入每行都包含制表符分隔值的文件的正确语法是:

LOAD DATA INFILE '/tmp/my_large_file' INTO TABLE helperDb.helperTable FIELDS TERMINATED BY '\n' (lineContent);
Run Code Online (Sandbox Code Playgroud)

这样做的另一个主要优点是,如果您稍后决定提取另一组行,则不必等待数小时才能再次处理(当然,除非您删除数据库)。