当前位置: > shell编程 >

awk处理多个输入文件

时间:2016-06-01 19:04来源:linux.it.net.cn 作者:IT
  在日常工作中, 经常需要处理多个输入文件.例如,提取多个文件中相同的行.等等.

用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)
------分隔线----------------------------
栏目列表
推荐内容