# 关于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 # 当前被处理参数标志
- 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 ...
- awk 'FILENAME=="file1"{...}FILENAME=="file2"{...}FILENAME=="file3"{...}...' file1 file2 file3 ...