`

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处理二进制数据文件

    "巧用AWK处理二进制数据文件" AWK是Unix、Linux中处理文本的好工具,可以对复杂的文本文件进行整理,提取其中的全部或者部分数据,按照需要的格式予以显示。但是,AWK的强大功能只针对纯文本文件,对于带有很多不可...

    linuxawk将多个文件结果列合并到一个文件整理.pdf

    使用 awk 将多个文件结果列合并到一个文件 在 Linux 环境下,使用 awk 工具可以将多个文件的结果列合并到一个文件中。这篇文章将介绍如何使用 awk 实现该功能,并提供了一个示例 awk 脚本来合并多个文件的结果列。 ...

    用awk数组处理两个文件

    在Shell脚本编程中,`awk`是一种强大的文本分析工具,尤其在处理文件时非常有用。...通过构建适当的数组结构和条件判断,我们可以解决多种文件处理问题,尤其在需要关联多个文件数据的情况下,`awk`数组显得尤为重要。

    AWK文件处理总结

    ### AWK 文件处理总结 #### 一、AWK 入门篇 AWK 是一种强大的文本处理工具,常用于Linux/Unix环境下。它允许用户通过简单的脚本语言来进行复杂的文本处理任务。 **基本命令格式**: ```bash awk 'pattern { action...

    awk文本处理工具

    它按照默认的分隔符(空格或制表符)将每行的内容分解成多个字段(通常称为域),并将这些字段存储在编号的变量中,变量从$1开始编号。如果没有指定特定的模式,则所有行都会被处理;如果指定了模式,那么只有匹配该...

    awk基础篇学习文档

    在使用AWK处理文本时,它会根据内部变量FS(字段分隔符,默认为“空白字符”,包括空格、制表符等)来分解每一行记录成多个字段,并将它们存储在编号变量中(如$1、$2等)。AWK还使用内部变量OFS(输出字段分隔符,...

    AWK详细文档 使用手册

    AWK基于行处理,每一行被视为一个记录,每个记录可以被分割成多个字段。默认情况下,字段是由空格或制表符分隔的。AWK程序由一系列规则和动作组成,规则定义了何时执行特定的动作。 ### 2. **AWK的语法** - **模式...

    awk知识文档学习

    Awk按照记录和字段的方式来查看文本文件,每个记录通常对应文件的一行,而字段则是记录中的数据单元,例如一个单词或者一个数值。 ### 2. 基本概念 - **变量**: Awk中的变量用于存储数据,可以是数字或字符串。 - ...

    awk使用详解(官方文档翻译)

    - **字段划分**:每条记录可以被划分为多个字段(Field),字段之间通常通过空格或制表符分隔。例如,在员工薪资文件中,“A125Jenny100210”这条记录包含了四个字段:“A125”、“Jenny”、“100”、“210”。 ###...

    教你如何使用 awk 处理文本内容.doc

    - 替换多个字符串为同一个新字符串:`awk '{ gsub(/jayesh|hitesh|bhavesh/ , "mahesh"); print }' content.txt` 8. 配合其他命令,awk 可以增强其功能,例如与 `df` 命令结合,仅显示设备名、可用空间和使用率:`...

    awk学习awk学习awk学习awk学习

    “文件(s)”则指定了需要处理的一个或多个文件。 #### 二、awk命令详解 1. **模式匹配**: awk支持正则表达式来匹配特定的模式。例如: ```sh awk '/root/' test ``` 这条命令将打印出文件`test`中包含单词...

    AWK用法AWK用法AWK用法

    设定多个字符(冒号、制表符和竖线)作为分隔符,并打印前三个字段。这种方式在处理具有多种分隔符的数据集时非常有用。 #### awk -F '[:\t|]' ‘{print $1}’ file 同上,但只打印第一列。展示了如何指定复杂的...

    awk实例详解——Unix下awk的使用

    `awk`可以同时处理多个文件,如`awk 'ACTION' file1 file2 ...`。当处理多个文件时,`FNR`会跟踪每个文件的行数。 **9. 自定义函数** `awk`允许用户定义自己的函数,提高代码复用性和可读性。例如: ```awk ...

    awk入门级教材awk入门awk入门

    - **多文件处理**:awk可以处理多个文件,将结果合并输出。 - **环境变量**:通过环境变量 `FS` 和 `OFS` 控制字段和输出字段分隔符。 - **条件判断**:利用逻辑运算符 `&&`, `||` 等进行复杂的条件判断。 - **循环...

    unix shell awk 修改ini文件的脚本

    ### Unix Shell Awk 修改Ini 文件的脚本 在Unix环境下,对配置文件(尤其是INI格式的文件)进行处理是一项常见的需求。...虽然脚本相对简单,但它为理解和应用Unix Shell和Awk处理复杂文本文件提供了很好的示例。

    awk教程-awk教程.rar

    - **字段(Field)**:awk默认使用空格或制表符作为字段分隔符,将一行文本划分为多个字段。每个字段可以通过$1, $2, ... $NF引用,其中$NF表示最后一个字段。 - **模式(Pattern)**:模式可以是正则表达式或简单...

    awk详细用法小结awk awk

    在Linux/Unix环境中,awk是一个标准工具,其强大之处在于能够对输入文件的每一行进行模式匹配,并执行相应的操作。 awk最初由Alfred Aho、Brian Kernighan和Peter Weinberger在贝尔实验室开发,随后被GNU项目采用并...

Global site tag (gtag.js) - Google Analytics