bash从文件中拉出某些行

时间:2011-07-25 19:38:30

标签: bash file-io

我想知道是否有更有效的方法来完成这项任务。我正在处理文件的行数从几十万到几十万不等。假设我知道100,000 - 125,000行是包含我正在寻找的数据的行。我想知道是否有一种快速方法从文件中提取这些所需的行。现在我正在使用像这样的grep循环:

 for ((i=$start_fid; i<=$end_fid; i++))
  do
    grep "^$i " fulldbdir_new >> new_dbdir${bscnt}
  done

哪种方法很好,它的使用时间比我想要的要长。这些行包含的不仅仅是数字。基本上每行有大约10个字段,第一个是连续整数,每个文件只出现一次。

如果有必要,我很乐意用C语写作。

4 个答案:

答案 0 :(得分:22)

sed可以胜任......

sed -n '100000,125000p' input

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

sed -n '100000,125000p; 125001q' input

答案 1 :(得分:5)

我使用awk:

awk 'NR >= 100000; NR == 125000 {exit}' file

对于大数字,您还可以使用 E表示法

awk 'NR >= 1e5; NR == 1.25e5 {exit}' file

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

答案 2 :(得分:2)

您可以尝试使用尾部和头部的组合来获得正确的线条。

head -n 125000 file_name | tail -n 25001 | grep "^$i "

不要忘记perl。

perl -ne 'print if $. >= 100000 && $. <= 125000' file_name | grep "^$i "

或更快的perl:

perl -ne 'print if $. >= 100000; exit() if $. >= 100000 && $. <= 125000' | grep "^$i "

此外,您可能希望使用GNU parallel来代替for循环。

答案 3 :(得分:0)

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

如果前100000行的总长度(大约)总是相同,那么您可以计算到文件中寻找大约100000行然后读取下一行25000行的距离。也许在前后阅读一下以确保你拥有所有25000行。

你不会确切地知道你在哪一行,这可能对你很重要,也可能不重要。

假设前100000行的平均行长为130,那么你会得到这样的结果:

 dd if=the_file skip=130 bs=100000 | head -n 25000

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