我想知道是否有更有效的方法来完成这项任务。我正在处理文件的行数从几十万到几十万不等。假设我知道100,000 - 125,000行是包含我正在寻找的数据的行。我想知道是否有一种快速方法从文件中提取这些所需的行。现在我正在使用像这样的grep循环:
for ((i=$start_fid; i<=$end_fid; i++))
do
grep "^$i " fulldbdir_new >> new_dbdir${bscnt}
done
哪种方法很好,它的使用时间比我想要的要长。这些行包含的不仅仅是数字。基本上每行有大约10个字段,第一个是连续整数,每个文件只出现一次。
如果有必要,我很乐意用C语写作。
答案 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
你必须扔掉第一行,因为它可能只有半行。