当我们使用awk整合文件的时候,如果是两个文件,我们经常会用NR==FNR和NR!=FNR两个来指定读取第一个或者是第二个文件,但是如果涉及到三个及以上文件这种方式就不适用,除非我们使用前面两个文件的方式,生成第三者,在用第三者进行整合,也是可以实现,但是这样子多了个第三者,而且显得比较笨拙。我们可以使用如下三种通用方式来实现awk多文件的读取和处理:

第一种: awk 'ARGIND==1{...}ARGIND==2{...}ARGIND==3{...} ...' file1 file2 file3 ...

第二种:awk 'FILENAME==ARGV[1]{...}FILENAME==ARGV[2]{...}FILENAME==ARGV[3]{...}...' file1 file2 file3 ...

第三种:awk 'FILENAME=="file1"{...}FILENAME=="file2"{...}FILENAME=="file3"{...}...' file1 file2 file3 ...

以上方式可以用来处理两个及以上文件。如下是针对以上的一个示例:

本例共使用三个文件,分别是hh、zz、xx

hh文件内容:

1234 huang
456 zhi

789 xiong

zz文件内容:

13141234 zhang
1314456 dong

1314789 hua

xx文件内容:

1234 || 13141234
456 Love 1314456

789 || 1314789

例一:将xx文件当中的第一列和hh第一列一样的用hh的第二列替换

命令:awk 'NR==FNR{a[$1]=$2}NR!=FNR{print a[$1],$2,$3}' hh xx

执行结果如下

NR==FNR代表读第一个文件

a[$1]=$2代表将第一个文件即(hh)当中第一列作为a数组的键,$2作为a[$1]的值

NR!=FNR代表读第二个文件

print a[$1],$2,$3 代表将第二个文件(即xx)当中的第一个列作为a数组的键,即a[$1],此时得到的值就是在第一个文件给a[$1]赋予的值

例二:将xx文件当中的第一列以及第三列分别和hh以及zz第一列对应起来,分别取对应hh和zz第二列的值替换到xx文件当中

命令:awk 'ARGIND==1{a[$1]=$2}ARGIND==2{b[$1]=$2}ARGIND==3{print a[$1],$2,b[$3]}' hh zz xx 或者采用其他两种方式

执行结果如下:

ARGIND==1代表处理第一个文件

ARGIND==2代表处理第二个文件

ARGIND==3代表处理第三个文件.........类似

数组键值对处理逻辑与例一当中一致

 

posted on 2020-04-29 21:35  知识天地  阅读(1270)  评论(0编辑  收藏  举报