一、关于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