文档章节

Linux shell逐行读取文件的方法

wulei163
 wulei163
发布于 2013/12/30 16:24
字数 794
阅读 668
收藏 0

方法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 "\nUSAGE: $SCRIPT file \n"
 
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 " \n starting file processing of each method\n"
 echo -e "method 1:"
 echo -e "function while_read_bottm"
 time while_read_bottm >> $TIMEFILE
 
echo -e "\n"
 
echo -e "method 2:"
echo -e "function while_read_line "
time while_read_line >> $TIMEFILE
 
echo -e "\n"
echo -e "method 3:"
echo "function while_read_line_fd"
time while_read_line_fd >>$TIMEFILE
 
echo -e "\n"
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


方式执行效率最高。



本文转载自:http://www.linuxidc.com/Linux/2012-11/73518.htm

共有 人打赏支持
wulei163
粉丝 8
博文 48
码字总数 8231
作品 0
郑州
程序员
私信 提问
Shell脚本:使用rsync备份文件/目录

本文我们介绍一个shell脚本,用来使用rsync命令将你本地Linux机器上的文件/目录备份到远程Linux服务器上。使用该脚本会以交互的方式实施备份,你需要提供远程备份服务器的主机名/ip地址和文件...

酱醋茶丶
2015/10/28
0
0
linux shell编程-逐行处理文本文件

  前言      在Linux shell编程中,我们经常需要以行为处理单位进行数据处理。   使用while read处理   read命令接收标准输入,或其他文件描述符的输入,得到输入后,read命令将数...

linux运维菜
2018/08/10
0
0
oracle 11.2.0.3 设置启动脚本使ORACLE自动启动

Linux下安装完后每次都得通过下面命令来启动对应的服务: 启动服务 dbstart 启动监视器 lsnrctl start 启动控制台 emctl start dbconsole 本文以Red Hat Enterprise Linux 6.4 (x86_64)+oracl...

sfih
2016/01/29
0
0
没有#!的bash脚本的执行

有些bash脚本写的不规范,没有在文件开头写#!,但是却能直接执行,可是如果看内核代码,shell脚本的加载函数中的开头就会判断,如果没有#!的话就会返回错误: static int load_script(struc...

晨曦之光
2012/04/10
559
0
shell:读取文件的每一行内容并输出

本文原创于:http://www.cnblogs.com/iloveyoucc/archive/2012/07/10/2585529.html shell:读取文件的每一行内容并输出 写法一: --------------------------------------------------------......

love8023icando
2016/09/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何在NEO区块链上实现信息加密

你或许已经知道,区块链上的交易大多都是透明公开的,用户既可以直接通过RPC查询NEO节点,也可以使用NEOTracker或NEOScan等方便好用的区块链浏览器浏览交易记录、余额、智能合约或区块链上的...

NEO-FANS
8分钟前
1
0
web.xml is missing and is set to true一步解决

次报错说的是在WebContent/WEB-INF下面没有web.xml,而默认web.xml不在此路径,需要重新指定路径,操作如下: 先取消Dynamic Web Module勾选,点击apply,然后再勾上Dynamic Web Module,此时...

宇昕
16分钟前
0
0
ios 让navigationItem的UIBarButtonItem的背景色不为蓝色,现实图片本身颜色

ios 让navigationItem的UIBarButtonItem的背景色不为蓝色,现实图片本身颜色 UIImage *rightImage = [[UIImage imageNamed:@"add"] imageWithRenderingMode:UIImageRenderingModeAlwaysOrig......

壹峰
24分钟前
0
0
spring session 1.x与2.x 兼容性问题

spring session 1.x与2.x 同时在项目中使用时,导致session不一致原因是1.x useBase64Encoding=false 而 2.0 为useBase64Encoding=true. 因此解决只需保证两边 useBase64Encoding 一致就行。...

welkin_k
24分钟前
0
0
Hadoop环境中管理大数据存储八大技巧

在现如今,随着IT互联网信息技术的飞速发展和进步。目前大数据行业也越来越火爆,从而导致国内大数据人才也极度缺乏,下面科多数据介绍一下关于Hadoop环境中管理大数据存储技巧。 1、分布式存...

董黎明
27分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部