在日常工作中, 经常需要处理多个输入文件.例如,提取多个文件中相同的行.等等. 用awk处理此种情形有时非常有效. 下面先介绍awk处理多个输入文件的一般方法: 当awk读取的文件只有两个的时候,比较常用的有两种方法: awk 'NR==FNR{...}NR>FNR{...}' file1 file2 或 awk 'NR==FNR{...}NR!=FNR{...}' file1 file2 awk 'NR==FNR{...;next}{...}' file1 file2 当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 ... 下面举个我用到的例子, 抽取两个文件相同的行: awk 'NR==FNR{a[$1]=$0;next} NR>FNR{if($1 in a)print $0"\n"a[$1]}' ./dedup_pattern/shard2/1/top2000 ./dedup_pattern/shard3/1/top2000 > common_part awk 'ARGIND == 1{a[$1]=$0;next} ARGIND == 2{if($1 in a)print $0"\n"a[$1]}' ./dedup_pattern/shard2/1/top2000 ./dedup_pattern/shard3/1/top2000 > common_part 其它用法也类似. (责任编辑:IT) |