`

awk 处理多个文件

阅读更多
转自:http://hi.baidu.com/beibeiboo/item/c0cb1856ba4344474eff20ab
########################
#   关于awk的多文件处理
########################

awk的数据输入有两个来源,标准输入和文件,后一种方式支持多个文件。

如:
1. shell的Pathname Expansion方式:

awk '{...}'  *.txt
#  *.txt先被shell解释,替换成当前目录下的所有*.txt,
#  如当前目录有1.txt和2.txt,则命令最终为awk '{...}' 1.txt 2.txt

2. 直接指定多个文件:

awk '{...}' a.txt b.txt c.txt ...
# awk对多文件的处理流程是,依次读取各个文件内容,如上例,先读a.txt,再读b.txt....


那么,在多文件处理的时候,如何判断awk目前读的是哪个文件,而依次做对应的操作呢?

########################
#     处理 2 个文件
########################

当awk读取的文件只有两个的时候,比较常用的有两种方法:

(1) 一种是
awk 'NR==FNR{...}NR>FNR{...}'  file1 file2

awk 'NR==FNR{...}NR!=FNR{...}' file1 file2

(2) 另一种是 awk 'NR==FNR{...;next}{...}' file1 file2

当awk读取的文件只有两个的时候,比较常用的有两种方法:

(1)一种是

awk 'NR==FNR{...}NR>FNR{...}' file1 file2

awk 'NR==FNR{...}NR!=FNR{...}' file1 file2


(2) 另一种是

awk 'NR==FNR{...;next}{...}' file1 file2

了解了FNR和NR这两个awk内置变量的意义就很容易知道这两种方法是如何运作的
FNR     The input record number in the current input file.  #已读入当前文件的记录数

NR      The total number of input records seen so far.      #已读入的总记录数

next    Stop processing the current input record. The next input record is
        read and processing starts over with the first pattern in the AWK
        program. If the end of the input data is reached, the END block(s),
        if any, are executed.
awk 'NR==FNR{...}NR>FNR{...}' file1 file2
# 读入file1的时候,已读入file1的记录数FNR一定等于awk已读入的总记录数NR,因为file1是awk读入的首个文件,故读入file1时执行前一个命令块{...}
# 读入file2的时候,已读入的总记录数NR一定>读入file2的记录数FNR,故读入file2时执行后一个命令块{...}


awk 'NR==FNR{...;next}{...}' file1 file2
# 读入file1时,满足NR==FNR,先执行前一个命令块,但因为其中有next命令,故后一个命令块{...}是不会执行的
# 读入file2时,不满足NR==FNR,前一个命令块{..}不会执行,只执行后一个命令块{...}

########################
#     处理 多个 文件
########################

当awk处理的文件超过两个时,显然上面那种方法就不适用了。因为读第3个文件或以上时,也满足NR>FNR (NR!=FNR),显然无法区分开来,所以就要用到更通用的方法了:

1. ARGIND        # 当前被处理参数标志

awk 'ARGIND==1{...}ARGIND==2{...}ARGIND==3{...}... ' file1 file2 file3 ...复制代码

2. ARGV            # 命令行参数数组

awk 'FILENAME==ARGV[1]{...}FILENAME==ARGV[2]{...}FILENAME==ARGV[3]{...}...' file1 file2 file3 ...复制代码

3. 把文件名直接加入判断

awk 'FILENAME=="file1"{...}FILENAME=="file2"{...}FILENAME=="file3"{...}...' file1 file2 file3 ...复制代码


########################
#        例子 1
########################

现有file1,file2 两个文件。文件file1有2列,内容如:

no1 name1
no2 name2
no3 name2
no4 name3
no5 name4
no6 name4
no7 name4
no8 name5
no9 name6
no10 name6

文件file2 有6列,部分有空格,内容如下:

name1 data1 dada2 data3 data4 dada5
name2 dada6 data7 dada8
name3 data9 dada10 data11 dada12
name4 data13 dada14
name5 data15 dada16
name6 data17 data18

如果file1的第2列跟file2的第1列匹配,则将两条数据合并成一条,合并后的数据应该是这样的:

no1 name1 data1 dada2 data3 data4 dada5
no2 name2 dada6 data7 dada8
no3 name2 dada6 data7 dada8
no4 name3 data9 dada10 data11 dada12
no5 name4 data13 dada14
no6 name4 data13 dada14
no7 name4
no8 name5 data15 dada16
no9 name6 data17 data18
no10 name6 data17 data18

程序:

awk 'NR==FNR{a[$1]=$0}NR>FNR{print $1" "a[$2]}' file2 file1


########################
#        例子 2
########################

file1:

sina.com 52.5
sohu.com 42.5
baidu.com 35

file 2:

www.news.sina.com sina.com 80
www.over.sohu.com baidu.com 20
www.fa.baidu.com sohu.com 50
www.open.sina.com sina.com 60
www.sport.sohu.com sohu.com 70
www.xxx.sohu.com sohu.com 30
www.abc.sina.com sina.com 10
www.fa.baidu.com baidu.com 50
www.open.sina.com sina.com 60
www.over.sohu.com sohu.com 20

合并的结果:

www.news.sina.com sina.com 80 52.5
www.over.sohu.com baidu.com 20 42.5
www.fa.baidu.com sohu.com 50 35
www.open.sina.com sina.com 60 52.5
www.sport.sohu.com sohu.com 70 42.5
www.xxx.sohu.com sohu.com 30 42.5
www.abc.sina.com sina.com 10 52.5
www.fa.baidu.com baidu.com 50 35
www.open.sina.com sina.com 60 52.5
www.over.sohu.com sohu.com 20 42.5

程序:

awk 'NR==FNR{a[$1]=$2;next}{print $0,a[$2]}' file1 file2
分享到:
评论

相关推荐

    awk入门到精通.pdf

    此外, awk内建有pipe的功能, 可将处理中的数据传送给外部 的 Shell命令加以处理, 再将Shell命令处理后的数据传回awk程序, 这个特点也使得awk程序很 容易使用系统资源. 由于awk具有上述特色, 在问题处理的过程中, 可...

    awk用法小结--有关awk的材料

    1. awk非常适合于结构化的文本文件(行、列数据)复杂处理。相对于sed而言,它可进行复杂的编程处理,并且可以产生复杂的报表输出。 2. awk通常有三个版本,旧awk、nawk(新)、gawk。Solaris下建议用nawk,因为旧...

    Awk学习笔记和指南

    数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和 动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk的处理文本和数据...

    AWK_样式扫描和处理语言

    第一章 UNIX AWK使用手册(第二版)......................................................................................5 1.1 什么是AWK?...................................................................

    JSON.awk:用AWK编写的实用JSON解析器

    特征没有外部依赖性的单个文件可以在一次调用中解析多个输入文件(每个文件一个JSON文本) (awk)挂接到解析器并输出事件实用回调(可选) 捕获无效的JSON输入以进行进一步处理选择MIT或Apache 2许可证兼容JSON.sh...

    linux匹配命令awk、grep、sed简介

    表达式、同时处理多个输入文件等功能 awk目前有多个版本,包括旧版awk,新版awk(nawk),GNU awk(gawk),POSIX awk等 grep是在文件中全局查找指定的正则表达式,并打印所有包含该表达式的行 grep由Ken Thompson ...

    AWK教程文档

    数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk的处理文本和数据...

    AWK是一种优良的文本处理工具

    AWK 在很多方面类似于 shell 编程语言,尽管 AWK 具有完全属于其本身的语法。它的设计思想来源于 SNOBOL4 、sed 、Marc Rochkind设计的有效性语言、语言工具 yacc 和 lex ,当然还从 C 语言中获取了一些优秀的思想。...

    Sed And Awk 2nd edition

    sed的名字来源于其功能, 它是一个字符流编辑器(streamceditor),可以很好地完成对多个文件的一系列编辑工作. awk的名字来源于它的开发人Aho.cWeinberger和Kernighan, 它是一种程序设计语言, 非常适合结构化数据的...

    awk学习笔记

    数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和 动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk的处理文本和数据...

    帮助你排序文本文件的 Awk 命令行或脚本(推荐)

    Awk 是个普遍存在的 Unix 命令,用于扫描和处理包含可预测模式的文本。但是,由于它具有函数功能,因此也可以合理地称之为编程语言。 令人困惑的是,有不止一个 awk。(或者,如果你认为只有一个,那么其它几个就是...

    sed and awk 101 hacks.pdf (中文版带书签)

    sed全称(stream editor)流式编辑器,Sed主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等 awk的强大之处在于能生成强大的格式化报告。 数据可以来自标准输入、一个或多个文件,或其它命令的...

    Awk学习笔记

    数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户 自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk的处理文 本和...

    Zeb-D#my-review#awk-入门指南1

    背景awk是处理文本文件的一个应用程序,几乎所有 Linux 系统都自带这个程序。它依次处理文件的每一行,并读取里面的每一个字段。对于日志、CSV 那样的每行格

    Shell高级培训

    4.用awk处理数据流 4.1.工作原理 4.2.补充内容 4.2.1.特殊变量 4.2.2.将外部变量值传递给awk 4.2.3.用getline读取行 4.2.4.用样式对awk的行进行过滤 4.2.5.设置字段定界符 4.2.6.从awk中读取命令输出 4.2.7...

    gawk官方手册

    AWK 在很多方面类似于 shell 编程语言,尽管 AWK 具有完全属于其本身的语法。它的设计思想来源于 SNOBOL4 、sed 、Marc Rochkind设计的有效性语言、语言工具 yacc 和 lex ,当然还从 C 语言中获取了一些优秀的思想。...

    busybox最新版-安卓设备直接可直接执行

    这些工具涵盖了文件操作、文本处理、系统管理和网络配置等多个方面。 自定义功能:BusyBox允许您根据需要自定义构建,只包含您实际需要的工具。这有助于减小可执行文件的大小,并确保系统只包含必要的功能。 开源...

    利用python如何处理百万条数据(适用java新手)

    因为负责基础服务,经常需要处理一些数据,但是大多时候采用awk以及java程序即可,但是这次突然有百万级数据需要处理,通过awk无法进行匹配,然后我又采用java来处理,文件一分为8同时开启8个线程并发处理,但是依然处理很...

    使用sed grep工具过滤实例

    在处理庞大数据量时,善用Linux三剑客sed grep awk能省下不少劲。文档例子仅供参考学习!

    git_hooks:在多个项目中与git-hooks和git子模块一起使用的通用git钩子

    git_hooks 在多个项目中与git-hooks和git子模块一起使用的通用git钩子它有什么作用? 提供的git钩子是预提交的钩子。 他们目前正在处理各种文件类型的LINT检查。 这意味着,如果文件语法无效,则git不会让您将其提交...

Global site tag (gtag.js) - Google Analytics