zoukankan      html  css  js  c++  java
  • linux 循环读取文件的每一行

    在Linux中有很多方法逐行读取一个文件的方法,其中最常用的就是下面的脚本里的方法,而且是效率最高,使用最多的方法。为了给大家一个直观的感受,我们将通过生成一个大的文件的方式来检验各种方法的执行效率。

    方法1:while循环中执行效率最高,最常用的方法。

    复制代码 代码如下:

    function while_read_LINE_bottm(){
    While read LINE
    do
    echo $LINE
    done  < $FILENAME
    }

    注释:我习惯把这种方式叫做read釜底抽薪,因为这种方式在结束的时候需要执行文件,就好像是执行完的时候再把文件读进去一样。

    方法2 : 重定向法;管道法: cat $FILENAME | while read LINE

    复制代码 代码如下:

    Function While_read_LINE(){
    cat $FILENAME | while read LINE
    do
    echo $LINE
    done
    }

    注释:我只所有把这种方式叫做管道法,相比大家应该可以看出来了吧。当遇见管道的时候管道左边的命令的输出会作为管道右边命令的输入然后被输入出来。

    方法3: 文件描述符法


    复制代码 代码如下:

    Function while_read_line_fd(){
    Exec 3<&0
    Exec 0<$FILENAME
    While read LINE
    Do
    Echo $LINE
    Exec 0<&<3
    }


    注释: 这种方法分2步骤,第一,通过将所有内容重定向到文件描述符3来关闭文件描述符0.为此我们用了语法Exec 3<&0 。第二部将输入文件放送到文件描述符0,即标准输入。

    方法4    for  循环。


    复制代码 代码如下:

    function  for_in_file(){
    For  i  in  `cat $FILENAME`
    do
    echo $i
    done
    }

    注释:这种方式是通过for循环的方式来读取文件的内容相比大家很熟悉了,这里不多说。对各个方法进行测试,看那方法的执行效率最高。

    首先我们用脚本(脚本见附件)生成一个70000行的文件,文件位置在/scripts/bigfile。然后通过下面的脚本来测试各个方法的执行效率,脚本很简单,不再解释。

    复制代码 代码如下:

    #!/bin/bash
    FILENAME="$1"
    TIMEFILE="/tmp/loopfile.out" > $TIMEFILE
    SCRIPT=$(basename $0)
    function usage(){
    echo -e " USAGE: $SCRIPT file "
    exit 1
    }
    function while_read_bottm(){
    while read LINE
    do
    echo $LINE
    done < $FILENAME
    }
    function while_read_line(){
    cat $FILENAME | while read LINE
    do
    echo $LINE
    done
    }
    function while_read_line_fd(){
    exec 3<&0
    exec 0< $FILENAME
    while read LINE
    do
    echo $LINE
    done
    exec 0<&3
    }
    function for_in_file(){
    for i in  `cat $FILENAME`
    do
    echo $i
    done
    }
    if [ $# -lt 1 ] ; then
    usage
    fi
    echo -e " starting file processing of each method "
    echo -e "method 1:"
    echo -e "function while_read_bottm"
    time while_read_bottm >> $TIMEFILE
    echo -e " "
    echo -e "method 2:"
    echo -e "function while_read_line "
    time while_read_line >> $TIMEFILE
    echo -e " "
    echo -e "method 3:"
    echo "function while_read_line_fd"
    time while_read_line_fd >>$TIMEFILE
    echo -e " "
    echo -e "method 4:"
    echo -e "function  for_in_file"
    time  for_in_file >> $TIMEFILE

    执行脚本后: [root@localhost shell]# ./while /scripts/bigfile
    脚本输出内容:

    复制代码 代码如下:

    method 1:
    function while_read_bottm
    real    0m5.689s
    user    0m3.399s
    sys    0m1.588s
    method 2:
    function while_read_line
    real    0m11.612s
    user    0m4.031s
    sys    0m4.956s
    method 3:
    function while_read_line_fd
    real    0m5.853s
    user    0m3.536s
    sys    0m1.469s
    method 4:
    function  for_in_file
    real    0m5.153s
    user    0m3.335s
    sys    0m1.593s


    下面我们对各个方法按照速度进行排序。

    复制代码 代码如下:

    real    0m5.153s    method 4 (for 循环法)
    real    0m5.689s    method 1  (while 釜底抽薪法)
    real    0m5.853s    method 3    (标识符法)
    real    0m11.612s  method 2    (管道法)


    由此可见在各个方法中,for语句效率最高,而在while循环中读写文件时,

    复制代码 代码如下:


    while read LINE
    do
    echo $LINE
    done < $FILENAME

  • 相关阅读:
    java基础部分的一些有意思的东西。
    antdvue按需加载插件babelpluginimport报错
    阿超的烦恼 javaScript篇
    .NET E F(Entity Framework)框架 DataBase First 和 Code First 简单用法。
    JQuery获得input ID相同但是type不同的方法
    gridview的删除,修改,数据绑定处理
    jgGrid数据格式
    Cannot read configuration file due to insufficient permissions
    Invoke action which type of result is JsonResult on controller from view using Ajax or geJSon
    Entity model数据库连接
  • 原文地址:https://www.cnblogs.com/demonxian3/p/7886177.html
Copyright © 2011-2022 走看看