美文网首页
多行循环替换(shell,perl)

多行循环替换(shell,perl)

作者: 六十三63 | 来源:发表于2018-03-21 19:48 被阅读0次

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

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

    相关文章

      网友评论

          本文标题:多行循环替换(shell,perl)

          本文链接:https://www.haomeiwen.com/subject/daigqftx.html