bash从文件中提取某些行

bash从文件中提取某些行,bash,file-io,Bash,File Io,我想知道是否有更有效的方法来完成这项任务。我正在处理的文件行数从几十万到几百万不等。假设我知道100000-125000行是包含我要查找的数据的行。我想知道是否有一个快速的方法从文件中提取这些所需的行。现在我正在使用grep的循环,如下所示: for ((i=$start_fid; i<=$end_fid; i++)) do grep "^$i " fulldbdir_new >> new_dbdir${bscnt} done dd if=the_file

我想知道是否有更有效的方法来完成这项任务。我正在处理的文件行数从几十万到几百万不等。假设我知道100000-125000行是包含我要查找的数据的行。我想知道是否有一个快速的方法从文件中提取这些所需的行。现在我正在使用grep的循环,如下所示:

 for ((i=$start_fid; i<=$end_fid; i++))
  do
    grep "^$i " fulldbdir_new >> new_dbdir${bscnt}
  done
 dd if=the_file skip=130 bs=100000 | head -n 25000
for((i=$start\u fid;i>new\u dbdir${bscnt}
完成
它工作得很好,只是比我想要的时间要长。而且这些行包含的不仅仅是数字。基本上每行有10个字段,第一个是一个顺序整数,每个文件只显示一次


如果需要的话,我可以用C写。

你可以尝试用尾和头的组合来获得正确的行

head -n 125000 file_name | tail -n 25001 | grep "^$i "
也不要忘记perl

perl -ne 'print if $. >= 100000 && $. <= 125000' file_name | grep "^$i "
perl-ne'print if$.>=100000&&&$.=100000;exit()if$.>=100000&&&$.我会使用awk:

awk 'NR >= 100000; NR == 125000 {exit}' file
对于大数字,您也可以使用E表示法:


编辑:@glenn jackman的建议(参见评论)

sed
可以完成这项工作

sed-n'1000012500p'输入

编辑:根据格伦·杰克曼的建议,可以进行调整以提高效率


sed-n'10000125000p;125001q'输入

到目前为止,答案读取前100000行并丢弃它们。由于磁盘I/O通常是这些天的限制因素,因此有一个不必读取不需要的行的解决方案可能会很好

如果前100000行的总长度总是相同的(大约),那么您可能会计算搜索文件到大约100000行的距离,然后读取接下来的25000行。可能会在前后多读一点,以确保您拥有所有25000行

不过,你可能不知道自己在哪一行,哪一行对你来说可能重要,也可能不重要

假设前100000条线的平均线长度为130,则会得到如下结果:

 for ((i=$start_fid; i<=$end_fid; i++))
  do
    grep "^$i " fulldbdir_new >> new_dbdir${bscnt}
  done
 dd if=the_file skip=130 bs=100000 | head -n 25000

您必须扔掉第一行,因为它可能只有半行。

使用
NR>125000{exit}节省时间
sed-n'1000012500p;1250001q'
我想这个答案对我有用,125000和125001之后p和q分别代表什么?字母是告诉sed
sed
如何处理所引用的图案空间的方式。在这种情况下,“1000012500p”部分表示打印图案ern空间10000125000(即行号100000到125000),并且“125001q”部分告诉它在第125001行退出,因为您已经获得了所需的内容。