现在有个文件,1万行,替换2000-2999的数据。替换为testline1-999
题外话,最近我经常思考性能问题,为了测试某些写法的性能问题,你得有数据吧,怎么个造数据。
我最爱用seq这个命令
例如造1万行的数据怎么个造法,seq 10000就可以了
[myname@mypc python_study]$ seq 10000 > testfile
[myname@mypc python_study]$ cat testfile|wc -l
10000
shell
解题思路,循环,sed -i替换
效果如下
[vagrant@amainst perltest]$ time while [ $i -lt 1000 ];do oldline=`expr $i + 2000`;newline="testline"$i;sed -i "s/$oldline/$newline/g" testfile;i=`expr $i + 1`;done
real 0m17.481s#<-----------------请注意消耗的时间,以下会和其他方法做对比
user 0m7.529s
sys 0m9.932s
[vagrant@amainst perltest]$ sdiff -s testfile testfile.bak|head
testline0 | 2000
testline1 | 2001
testline2 | 2002
testline3 | 2003
testline4 | 2004
testline5 | 2005
testline6 | 2006
testline7 | 2007
testline8 | 2008
testline9 | 2009
[vagrant@amainst perltest]$ sdiff -s testfile testfile.bak|tail
testline990 | 2990
testline991 | 2991
testline992 | 2992
testline993 | 2993
testline994 | 2994
testline995 | 2995
testline996 | 2996
testline997 | 2997
testline998 | 2998
testline999 | 2999
在这里sed会执行1000次,每次只改一行,感觉会不会消耗了不必要的资源,至于sed的高阶用法,暂时琢磨不出来
perl
解题思路:perl -pe内循环,提供这种方法就是为了练习
[vagrant@amainst perltest]$ time perl -i.bak -pe 'for($i=2000;$i<3000;$i++){$num=$i-2000;s/$i/testline$num/}' testfile
real 0m9.815s#<------------这里时间减少了一半,但是对于用户层的消耗比较多,sys层几乎没有消耗。
user 0m9.808s
sys 0m0.001s
[vagrant@amainst perltest]$ sdiff -s testfile testfile.bak|head
testline0 | 2000
testline1 | 2001
testline2 | 2002
testline3 | 2003
testline4 | 2004
testline5 | 2005
testline6 | 2006
testline7 | 2007
testline8 | 2008
testline9 | 2009
[vagrant@amainst perltest]$ sdiff -s testfile testfile.bak|tail
testline990 | 2990
testline991 | 2991
testline992 | 2992
testline993 | 2993
testline994 | 2994
testline995 | 2995
testline996 | 2996
testline997 | 2997
testline998 | 2998
testline999 | 2999
这两种方法相比较下来perl的时间要快一倍,但是,还是那句话,perl的学习成本高。
更快的方法配合正则可能会有好的效果。