awk处理多个文件

参考:

http://cwind.blog.51cto.com/62582/685253

 

cat file1:
0011AAA 200.00 20050321
0012BBB 300.00 20050621
0013DDD 400.00 20050622
0014FFF 500.00 20050401
cat file2:
I0011  11111
I0012  22222
I0014  55555
I0013  66666
规则:比较 file1的1-4字符 和 file2的2-5 字符,如果相同,将file2 的第二列 与 file1 合并 file3
0011AAA 200.00 20050321 11111
0012BBB 300.00 20050621 22222
0013DDD 400.00 20050622 66666
0014FFF 500.00 20050401 55555

 

 

note:

【1】

文件1的3、4行:

I0014  55555
I0013  66666

文件2的3、4行:

I0014  55555
I0013  66666

可见,顺序并不是按每一行对应的。如果对应,可以用行号为索引,如下操作:

awk处理多个文件_第1张图片

 

可惜不是,那么,难道要取第一个文件的每一行,在第二个文件中遍历一遍进行查找吗?不是的,可以用哈希。采用字段做下标,就行了!

x[sub($1,2,4)]=$2

很妙!

采用行号做下标的话:

x[FNR]=substr($1,2,4);

【2】$4=x[substr($1,2,4)];

$4之前并不存在,这里就直接赋值了,于是产生了新的字段。试了一下,用$5=x[substr($1,2,4)];也是一样的。

 

【3】

如果取哈希数组时,传入了不存在的下标,会发生什么》如果文件2为:

0011AAA 200.00 20050321
0012BBB 300.00 20050621
0013DDD 400.00 20050622
0014FFF 500.00 20050401
0015FFF 500.00 20050401

 

那么返回值$4将会是空字符串。

 

 

 

 

另外,两个文件一起处理,也可以不用NR来判断的,可以使用getline:

 

 awk处理多个文件_第2张图片

你可能感兴趣的:(awk)