`

shell 中遍历文件的效果比较

 
阅读更多

假设我们有一个数据文件形如下:

A,B

A,C

A,D

B,E

B,F

D,A

D,B

E,G

....

 

需求是要将其转变为如下形式:

A:B,C,D

B:E,F

D:A,B

E,G

......

 

 

需求很简单,循环遍历文件,然后trace第一列即可。

在这里,我们讨论用Shell脚本如何实现这个简单的需求。

 

 

在shell中面对这样的需求,最好的办法莫过于使用awk了,不过除了awk之外,linux也有其他命令能遍历文件内容,比如说cat以及输入重定向等,下面我们就对这几种文件遍历方法做下比较。

 

首先申明一点,关于文件遍历过程中,如果得到目标结果的逻辑是一样的,说白了就是每读入一行,检查第一列而已。

 

1. awk方法:

 

BEGIN{
    FS=","
    curmember="";
}
{
    if(curmember==""){
        curmember=$1;
        offer=$2;
    }
    else if(curmember != $1){
        print curmember":"offer
        curmember=$1;
        offer=$2;
    }
    else{
        offer=offer","$2;
    }
}
END{
    print curmember":"offer;
}

 

 

2. forIn+cat方法:

 

#!/bin/bash
curmember="";
offer="";
#cat orderinfo | while read line
for line in `cat orderinfo`
do
    tmpmember=${line%%,*};
    if [  "$curmember" == ""  ]; then
        curmember=$tmpmember
        offer=${line##*,}
    elif [ "$tmpmember" != "$curmember" ]; then
        echo ${curmember}:${offer}
        curmember=${tmpmember}
        offer=${line##*,}
    else
        offer=${offer},${line##*,}
    fi
done
echo ${curmember}:${offer}

 

 

3. 文件描述符打开文件

 

#!/bin/bash
curmember="";
offer="";
exec 4<orderinfo
while read line<&4
do
    tmpmember=${line%%,*};
    if [  "$curmember" == ""  ]; then
        curmember=$tmpmember
        offer=${line##*,}
    elif [ "$tmpmember" != "$curmember" ]; then
        echo ${curmember}:${offer}
        curmember=${tmpmember}
        offer=${line##*,}
    else
        offer=${offer},${line##*,}
    fi
done
exec 4<&-
echo ${curmember}:${offer}

 

 

4. while循环中直接输入重定向

 

#!/bin/bash
curmember="";
offer="";
while read line
do
    tmpmember=${line%%,*};
    if [  "$curmember" == ""  ]; then
        curmember=$tmpmember
        offer=${line##*,}
    elif [ "$tmpmember" != "$curmember" ]; then
        echo ${curmember}:${offer}
        curmember=${tmpmember}
        offer=${line##*,}
    else
        offer=${offer},${line##*,}
    fi
done<orderinfo
echo ${curmember}:${offer}

 

 

四种方法的执行效率如下,文件行数69000+

 

 

awk   : 185 ms

forIn : 7187 ms

exec  : 7931 ms

while : 7708 ms

 

上述结果中awk速度是最快的,其他三个虽然各有快慢,但都差不多,而且都比awk要慢很多。

 

这也印证了awk在流式处理文件中的先天优势,同时其代码也是最简单的,屏蔽了文件操作的相关内容。

1
0
分享到:
评论

相关推荐

    delphi 开发经验技巧宝典源码

    0020 如何在程序中调用帮助文件 12 第2章 语言基础 17 2.1 基础语言 18 0021 如何对代码进行注释 18 0022 Exit语句的使用 18 0023 有效地使用Self对象 19 0024 声明局部变量、类变量和全局变量 19 ...

    delphi 开发经验技巧宝典源码06

    0020 如何在程序中调用帮助文件 12 第2章 语言基础 17 2.1 基础语言 18 0021 如何对代码进行注释 18 0022 Exit语句的使用 18 0023 有效地使用Self对象 19 0024 声明局部变量、类变量和全局变量 19 ...

    JAVA上百实例源码以及开源项目

     数字证书:从文件中读取数字证书,生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录  一个Java+ajax写...

    JAVA上百实例源码以及开源项目源代码

     数字证书:从文件中读取数字证书,生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录  一个Java+ajax写...

    vc++ 应用源码包_1

    演示了在树控件中来回拖动文件的操作 MyPlayer 音乐播放器 内含歌词显示实现源码 ActiveXDemo 演示了装载以及卸载atl控件的操作以及注册操作 ado 登录模块的制作 ado,dao,odbc数据库连接vc代码 演示了不同的...

    vc++ 应用源码包_2

    演示了在树控件中来回拖动文件的操作 MyPlayer 音乐播放器 内含歌词显示实现源码 ActiveXDemo 演示了装载以及卸载atl控件的操作以及注册操作 ado 登录模块的制作 ado,dao,odbc数据库连接vc代码 演示了不同的...

    vc++ 应用源码包_6

    演示了在树控件中来回拖动文件的操作 MyPlayer 音乐播放器 内含歌词显示实现源码 ActiveXDemo 演示了装载以及卸载atl控件的操作以及注册操作 ado 登录模块的制作 ado,dao,odbc数据库连接vc代码 演示了不同的...

    vc++ 应用源码包_5

    演示了在树控件中来回拖动文件的操作 MyPlayer 音乐播放器 内含歌词显示实现源码 ActiveXDemo 演示了装载以及卸载atl控件的操作以及注册操作 ado 登录模块的制作 ado,dao,odbc数据库连接vc代码 演示了不同的...

    vc++ 应用源码包_3

    演示了在树控件中来回拖动文件的操作 MyPlayer 音乐播放器 内含歌词显示实现源码 ActiveXDemo 演示了装载以及卸载atl控件的操作以及注册操作 ado 登录模块的制作 ado,dao,odbc数据库连接vc代码 演示了不同的...

    写给大忙人看的JAVA SE 8

    4.9 动画和特殊效果 97 4.10 不寻常的控件 100 练习 103 第5章新的日期和时间API 106 5.1 时间线 108 5.2 本地日期 110 5.3 日期校正器 113 5.4 本地时间 114 5.5 带时区的时间 115 5.6 格式化和解析 119 5.7 与遗留...

    vc++ 开发实例源码包

    DOM应用---遍历网页中的元素 如题。 dshowplayer 媒体播放器的实现,实现了VMR7、VMR9、EVR方式。 DSoundManager 实现了声音管理。 Excel文件的导入和导出操作 如题。主要的实现在CMyExcel类中。 expclass_src ...

    C 开发金典

    ∷相关函数:ShellSort函数 1.5.7 冒泡排序 243 范例1-83 冒泡排序 243 ∷相关函数:bubble_sort函数 1.5.8 一趟快速排序 246 范例1-84 一趟快速排序 246 ∷相关函数:QSort函数 1.5.9 一趟快速排序的改进...

    C语言通用范例开发金典.part2.rar

    ∷相关函数:ShellSort函数 1.5.7 冒泡排序 243 范例1-83 冒泡排序 243 ∷相关函数:bubble_sort函数 1.5.8 一趟快速排序 246 范例1-84 一趟快速排序 246 ∷相关函数:QSort函数 1.5.9 一趟快速排序的改进...

    C语言通用范例开发金典.part1.rar

    ∷相关函数:ShellSort函数 1.5.7 冒泡排序 243 范例1-83 冒泡排序 243 ∷相关函数:bubble_sort函数 1.5.8 一趟快速排序 246 范例1-84 一趟快速排序 246 ∷相关函数:QSort函数 1.5.9 一趟快速排序的改进...

    Tcl_TK编程权威指南pdf

    这是因为Tcl/Tk的shell程序wish提供了对其他程序、文件系统和网络套接字的存取功能,同时还能够创建图形用户界面。不管怎样,现在发现包含几千行Tcl脚本的应用程序并不稀奇。 我编写这本书的原因就是,虽然自己...

    自己动手写操作系统(含源代码).part2

    书中讲解了大量在开发操作系统中需注意的细节问题,这些细节不仅能使读者更深刻地认识操作系统的核心原理,而且使整个开发过程少走弯路。本书分上下两篇,共11章。其中每一章都以前一章的工作成果为基础,实现一项新...

    自己动手写操作系统(含源代码).part1

    书中讲解了大量在开发操作系统中需注意的细节问题,这些细节不仅能使读者更深刻地认识操作系统的核心原理,而且使整个开发过程少走弯路。本书分上下两篇,共11章。其中每一章都以前一章的工作成果为基础,实现一项新...

    as3比较详尽的工具类

    some.as ---------------------- 遍历并调用对象集属性 move: BasicMove.as ---------------------- 简单的运动方式 mouse: Menu.as ---------------------- 右键菜单 MouseCheck.as --------------------...

Global site tag (gtag.js) - Google Analytics