从一个非常大的文件中获取n个中间行的有效方法

时间:2013-12-09 07:07:39

标签: unix head tail

我有一个60GB左右的大文件。

我需要获得该文件的n个中间行。 我正在使用像头尾一样的通信

tail -m file |head -n >output.txt
where m,n are numbers

文件的一般结构如下所示,带有记录集。(以逗号分隔的列。),每行可以有不同的长度(比如最多5000个字符)。

col1,col2,col3,col4...col10

有没有其他方法可以用更少的时间占用n条中间线,因为当前命令需要花费大量时间来执行。

提前致谢。

5 个答案:

答案 0 :(得分:10)

使用sed,您至少可以删除管道:

sed -n '600000,700000p' file > output.txt

将打印600000到700000行。

答案 1 :(得分:5)

awk'FNR> = n&& FNR< = M'

后跟文件名。

答案 2 :(得分:2)

使用split实用程序可能更有效,因为管道中的tailhead会扫描文件的某些部分两次。

实施例

split -l <k> <file> <prefix>

其中k是您希望在每个文件中包含的行数,并且(可选)prefix将添加到每个输出文件名中。

答案 3 :(得分:0)

我能想到的加速搜索的唯一可行解决方案是构建和索引你的行,例如:

 0 00000000
 1 00000013
 2 00000045
   ...
 N 48579344

然后,知道索引长度,您可以快速跳转到数据文件的中间(或者您喜欢的任何地方......)。当然,您应该在文件更改时保持索引更新...

显然,针对此类问题的规范解决方案是将数据保存在数据库中(例如参见SQLite),而不是在普通文件中......: - )

答案 4 :(得分:-1)

以二进制随机访问模式打开文件,向中间搜索,按顺序向前移动直至到达\ n或\ n \ r \ n,然后从下列字符转储N行到您的其余文件(一个\ n - 一条线)。完成工作。

如果您的文件已排序,并且您需要两个键之间的数据,则使用上述方法+二分法。