`

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
分享到:
评论

相关推荐

    自学shell脚本

    Shell脚本是Linux/Unix操作系统中的一种脚本语言,它基于命令行接口,允许用户编写自动化任务并执行一系列系统操作。在Linux世界里,Shell脚本扮演着重要的角色,能够大大提高工作效率,尤其对于系统管理员和程序员...

    在Shell命令行处理JSON数据的方法

    在Shell命令行环境中处理JSON数据是一项常见的任务,特别是在自动化脚本和数据分析中。本文将详细介绍如何使用`jq`工具来高效地操作JSON数据。 `jq`是一个轻量级且强大的命令行工具,专为处理JSON数据设计。它允许...

    用Shell扩展实现源代码统计程序,用Shell扩展实现源代码统计程序

    接下来,我们可以遍历这些文件,使用`wc -l`命令统计每份文件的行数,将结果输出到一个汇总文件中: ```bash for file in $files; do echo "$file: $(wc -l $file)" &gt;&gt; summary.txt done ``` 为了区分注释行和...

    一个监控LINUX目录和文件变化的Shell脚本分享

    脚本通过`find`命令遍历指定目录下的所有文件,然后使用`du -sb`命令获取每个文件的大小和路径,最后将这些信息写入临时文件`$TMP_A`。这样,我们就有了一个基准,可以用来比较后续的文件变化。 接下来,我们编写`...

    shell脚本学习

    在IT行业中,Linux Shell脚本是系统管理员和开发者日常工作中不可或缺的工具,它允许用户通过命令行接口自动化执行一系列操作。本压缩包“shell脚本学习”提供了丰富的资源,帮助你深入理解并掌握Linux Shell脚本...

    Shell编程脚本例子集合

    - **读取文件内容**:Shell脚本可以使用如`while`循环和`read`命令结合读取文件中的每行内容,并进行处理,例如去除行尾的回车符或空格。 ### 6. 特殊字符识别 由于OCR扫描技术的限制,文档中可能存在识别错误或漏...

    shell自研基础学习笔记

    函数库文件允许将函数保存在外部文件中,便于管理和共享。 七、正则表达式 正则表达式用于模式匹配和文本查找,包括普通字符、非打印字符、特殊字符和限定字符。常用的正则表达式可以用来校验数字、字符等格式。 ...

    shell命令编写

    在C语言中实现这个功能,我们需要调用`sys/stat.h`头文件中的`stat()`函数来获取文件信息,以及`dirent.h`中的`opendir()`、`readdir()`和`closedir()`函数来遍历目录。通过这些函数,我们可以获取到每个文件的名称...

    Python遍历目录的4种方法实例介绍

    在Python编程中,遍历目录是一项常见的任务,用于查找、操作或者管理文件系统中的文件和子目录。本篇文章将详细讲解四种不同的方法来遍历Python目录,并通过实例演示每种方法的用法。 1. **os.popen运行shell列表...

    ListVie查看C盘文件的不同效果 c#

    在这个特定的项目"ListVie查看C盘文件的不同效果"中,我们可能涉及到如何模拟Windows资源管理器的界面和功能,使用户能够浏览C盘中的文件和目录,并体验不同的显示效果。 `ListView`控件提供了多种视图模式,如大...

    shell中常见命令与awk,sed的等价命令

    ### shell中常见命令与awk, sed的等价命令详解 #### 一、基本概念与工具简介 在Linux或Unix环境中,shell脚本是自动化任务处理的重要手段之一。shell提供了丰富的命令来实现各种功能,而`awk`和`sede`则是其中两个...

    WPF做的电脑资源管理器双击打开文本格式的文件

    此外,为了实现文件的图标显示,我们需要使用Shell32库获取文件的图标信息。这可以通过创建一个ComImport类型来实现,并使用GetIconLocation方法来获取图标路径。然后,我们可以将图标路径转换为ImageSource,显示在...

    linux shell常用规则

    圆括号可以用来创建子 Shell,这样可以在子 Shell 中执行一系列命令,并且这些命令的效果不会影响父 Shell 的环境。 ```bash ( cd /tmp ls -l ) ``` 上面的命令会进入 `/tmp` 目录并在其中列出文件详情,但不会...

    一个将目录转为html文件显示的程序

    1. **目录转换**:程序的核心功能是将文件系统的目录结构转换成HTML,这涉及到文件和目录的遍历,以及HTML元素的创建。在处理过程中,程序会为每个文件创建一个HTML链接,并在链接下方可能提供文件的基本信息,如...

    解决php接收shell返回的结果中文乱码问题

    在处理PHP脚本中调用shell...在实际应用中,我们可能需要根据具体的编码差异和乱码情况进一步调整这些转换逻辑,以达到最佳效果。同时,也要注意根据不同的系统环境和PHP配置,对乱码处理函数进行必要的调整和优化。

    文件管理器源码,文件拖曳,list弹性,root ,zip压缩解.zip

    文件管理器源码是整个项目的核心,它通常包括文件的读写、目录遍历、文件操作(如复制、移动、删除)等模块。开发者需要对Android的`java.io`和`java.nio`包有深入理解,以便有效地处理文件和流。此外,熟悉`SQLite...

    Windows资源管理器文件拖拽

    在Drop方法中,你通常会使用DragQueryFile来遍历所有拖放的文件,获取每个文件的完整路径,然后根据需要对这些文件进行操作。DragQueryFile返回文件名的字符串,可以通过增加索引来获取多个文件。 5. **数据对象...

    帆软报表绕过各种限制getshell.pdf

    - 使用目录遍历漏洞检查Shell文件是否确实存在于Web目录下。 - 如果Shell存在但无法直接访问,则需进一步分析系统对于URL请求的过滤规则。 - 通过构造特定格式的URL(如:`/xxx/ReportServer/..;/test/1.jsp`)来...

    Sketch2PPT:使用Shell脚本从Sketch文件生成PowerPoint文件

    例如,某些自定义图形、动画效果或特定的文本样式可能无法完美地在PowerPoint中呈现。因此,尽管大部分工作可以通过脚本自动化,但在发布最终的PowerPoint演示文稿之前,可能还需要进行一些人工调整。 总的来说,...

    VB用Treeview做成的类似资源管理器,带有系统图标

    在VB6中,获取这些图标通常需要使用SHGetFileInfo函数或者Shell32库,将文件类型的句柄传递给该函数,以获取对应类型的系统图标。 4. **自动匹配系统图标**:为了使TreeView中的每个节点显示正确的图标,程序需要...

Global site tag (gtag.js) - Google Analytics