Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 从一个非常大的文件中获取n个中间行的有效方法_Unix_Head_Tail - Fatal编程技术网

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

Unix 从一个非常大的文件中获取n个中间行的有效方法,unix,head,tail,Unix,Head,Tail,我有一个大约60GB的大文件 我需要得到文件的n个中间行。 我使用的是一个像头和尾巴一样的命令 tail -m file |head -n >output.txt where m,n are numbers 文件的一般结构如下所示,包含一组记录(逗号分隔的列)。每行可以有不同的长度(比如最多5000个字符) 有没有其他方法可以用更少的时间获取n个中间行,因为当前命令的执行时间很长 我能想到的加快搜索速度的唯一可能解决方案是建立和索引您的行,例如: 0 00000000 1 00000

我有一个大约60GB的大文件

我需要得到文件的n个中间行。 我使用的是一个像头和尾巴一样的命令

tail -m file |head -n >output.txt
where m,n are numbers
文件的一般结构如下所示,包含一组记录(逗号分隔的列)。每行可以有不同的长度(比如最多5000个字符)


有没有其他方法可以用更少的时间获取n个中间行,因为当前命令的执行时间很长

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

 0 00000000
 1 00000013
 2 00000045
   ...
 N 48579344

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


显然,这种问题的规范解决方案是将数据保存在数据库中(例如,请参阅),而不是保存在普通文件中…:-)

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

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

将打印行600000到700000。

使用
拆分
实用程序可能更有效,因为在管道中使用
尾部
头部
可以扫描文件的某些部分两次

例子
split-l

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

以二进制随机访问模式打开文件,查找中间,按顺序向前移动,直到达到\n或\r ascii,从以下字符开始,将N行转储到rest文件(一行\N-一行)。工作完成了


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

awk'FNR>=n&&FNR您可以告诉我们有关文件中数据的更多信息,如文件的一般结构。这些线是如何分开的?每条线的最大尺寸?这样我们就可以尝试直接遍历内存到所需的行?如果您的行长度不相等,我们将不得不逐个字符对其进行分析。在这种情况下,您已经在使用尽可能好的方法。将记录的一般结构添加到问题中。我的意图是将此数据移动到DB。由于很少有记录的结构不正确,并且由于其他一些问题,我将它们分块移动到DB。是的,我想过使用此命令,但我的机器没有太多空间来存储拆分的文件:(如果在最后请求的行之后有很多行,也可以添加一个'q'命令:
sed-n'60000070000p;700000q'文件
。否则,sed将继续运行,直到读取文件的最后一行(即使没有打印任何内容)。
sed -n '600000,700000p' file > output.txt
split -l <k> <file> <prefix>