一、关于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目前读的是哪个文件,而依次做对应的操作呢?
1、当awk读取的文件只有两个的时候,比较常用的有三种方法
awk 'NR==FNR{...}NR>FNR{...}'  file1 file2
awk 'NR==FNR{...}NR!=FNR{...}' file1 file2
awk 'NR==FNR{...;next}{...}' file1 file2
注:
FNR :The input record number in the current input file.  #已读入当前文件的记录数
NR  :The total number of input records seen so far.  #已读入的总记录数
对于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,前一个命令块{..}不会执行,只执行后一个命令块{...}
2、当awk处理的文件超过两个时,显然上面那种方法就不适用了。因为读第3个文件或以上时,也满足NR>FNR (NR!=FNR),显然无法区分开来。
所以就要用到更通用的方法了:
A、ARGIND 当前被处理参数标志: awk 'ARGIND==1{...}ARGIND==2{...}ARGIND==3{...}... ' file1 file2 file3 ...
B、ARGV 命令行参数数组:   awk 'FILENAME==ARGV[1]{...}FILENAME==ARGV[2]{...}FILENAME==ARGV[3]{...}...' file1 file2 file3 ...   
C、把文件名直接加入判断: awk 'FILENAME=="file1"{...}FILENAME=="file2"{...}FILENAME=="file3"{...}...' file1 file2 file3 ...
例子:
把shadow文件中的第二个字段替换passwd文件中的第二个字段。  
[root@159 shell]# cat passwd
vibramsprints.com:x:512:512::/home/vibramsprints.com:/sbin/nologin
caofei:x:513:513::/home/caofei:/bin/bash
hxj:x:514:514::/hxj:/bin/bash
[root@159 shell]# cat shadow
vibramsprints.com:$1$HgJKpzoI$JjbaY5qyYSmRqY7HOhy3p.:15117:0:99999:7:::
caofei:!!:15134:0:99999:7:::
hxj:$1$LGQD7tjb$zVdNlKRbTVInkUVZMAyCK/:15197:0:99999:7:::
要输出的结果是:
vibramsprints.com:$1$HgJKpzoI$JjbaY5qyYSmRqY7HOhy3p.:15117:0:99999:7:::
caofei:!!:15134:0:99999:7:::
hxj:$1$LGQD7tjb$zVdNlKRbTVInkUVZMAyCK/:15197:0:99999:7:::
[root@159 shell]# awk 'BEGIN{FS=OFS=":"}NR==FNR{a[$1]=$2}NR>FNR{$2=a[$1];print}' shadow passwd
vibramsprints.com:$1$HgJKpzoI$JjbaY5qyYSmRqY7HOhy3p.:512:512::/home/vibramsprints.com:/sbin/nologin
caofei:!!:513:513::/home/caofei:/bin/bash
hxj:$1$LGQD7tjb$zVdNlKRbTVInkUVZMAyCK/:514:514::/hxj:/bin/bash