多行循环替换(shell,perl)

现在有个文件,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的学习成本高。

更快的方法配合正则可能会有好的效果。

    原文作者:六十三63
    原文地址: https://www.jianshu.com/p/8325746100a3
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞