我正在编写一个必须循环的脚本,每个循环不同的脚本从外部文件中提取变量,最后一步编译它们。我试图最大化这个循环可以运行的速度,从而试图找到最适合这项工作的程序。
目前,速率限制步骤是搜索具有2列和450万行的文件。第一列是键,第二列是我提取的值。
我正在评估的两个程序是awk和grep。我已经将两个脚本及其运行时间放在下面找到最后一个值。
time awk -v a=15 'BEGIN{B=10000000}$1==a{print $2;B=NR}NR>B{exit}' infile
T
real 0m2.255s
user 0m2.237s
sys 0m0.018s
time grep "^15 " infile |cut -d " " -f 2
T
real 0m0.164s
user 0m0.127s
sys 0m0.037s
这让我想到了我的问题...... grep是如何搜索的。我理解awk逐行和逐字段运行,这就是为什么它需要更长的时间,因为文件变得更长,我必须进一步搜索它。
grep如何搜索?显然不是一行一行,或者它是否与awk明显不同,考虑到差不多20倍的时差。
(我注意到awk比短文件的grep运行得更快,而且我还没有尝试找到它们发散的地方,但对于那些尺寸,它实际上并不重要!)。
我想了解这一点,以便我可以为将来的程序使用做出正确的决定。
答案 0 :(得分:1)
你发布的awk命令远远超过grep + cut:
awk -v a=15 'BEGIN{B=10000000}$1==a{print $2;B=NR}NR>B{exit}' infile
grep "^15 " infile |cut -d " " -f 2
所以时间差异是可以理解的。试试这个awk命令,它等同于grep + cut,看看你得到了什么结果,这样我们可以比较苹果和苹果:
awk '/^15 /{print $2}' infile
甚至:
awk '$1==15{print $2}' infile