我有一个60GB左右的大文件。
我需要获得该文件的n个中间行。 我正在使用像头尾一样的通信
tail -m file |head -n >output.txt
where m,n are numbers
文件的一般结构如下所示,带有记录集。(以逗号分隔的列。),每行可以有不同的长度(比如最多5000个字符)。
col1,col2,col3,col4...col10
有没有其他方法可以用更少的时间占用n条中间线,因为当前命令需要花费大量时间来执行。
提前致谢。
答案 0 :(得分:10)
使用sed,您至少可以删除管道:
sed -n '600000,700000p' file > output.txt
将打印600000到700000行。
答案 1 :(得分:5)
awk'FNR> = n&& FNR< = M'
后跟文件名。
答案 2 :(得分:2)
使用split
实用程序可能更有效,因为管道中的tail
和head
会扫描文件的某些部分两次。
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 - 一条线)。完成工作。
如果您的文件已排序,并且您需要两个键之间的数据,则使用上述方法+二分法。