awk 多文件处理
时间:2010-09-15 来源:h_xin8211
########################
#
# 关于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 |
awk 'NR==FNR{...}NR>FNR{...}' file1 file2 |
# 读入file2的时候,已读入的总记录数NR一定>读入file2的记录数FNR,故读入file2时执行后一个命令块{...}
awk 'NR==FNR{...;next}{...}' file1 file2 |
# 读入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 |
文件file2 有6列,部分有空格,内容如下:
name1 data1 dada2 data3 data4 dada5 |
如果file1的第2列跟file2的第1列匹配,则将两条数据合并成一条,合并后的数据应该是这样的:
no1 name1 data1 dada2 data3 data4 dada5 |
程序:
awk 'NR==FNR{a[$1]=$0}NR>FNR{print $1" "a[$2]}' file2 file1 |
########################
#
# 例子 2
#
########################
file1:
sina.com 52.5 |
file 2:
www.news.sina.com sina.com 80 |
合并的结果:
www.news.sina.com sina.com 80 52.5 |
程序:
awk 'NR==FNR{a[$1]=$2;next}{print $0,a[$2]}' file1 file2 |