#   关于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.      #已读入的总记录数


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        # 当前被处理参数标志

 

  1. awk 'ARGIND==1{...}ARGIND==2{...}ARGIND==3{...}... ' file1 file2 file3 ...
复制代码
2. ARGV            # 命令行参数数组

 
  1. awk 'FILENAME==ARGV[1]{...}FILENAME==ARGV[2]{...}FILENAME==ARGV[3]{...}...' file1 file2 file3 ...
3. 把文件名直接加入判断

 
  1. awk 'FILENAME=="file1"{...}FILENAME=="file2"{...}FILENAME=="file3"{...}...' file1 file2 file3 ...