awk 有时确实比较省事,做些简单的文本处理,还是很方便的,在这介绍下两个文件的join的操作。

原始文本

bb.txt

a 10
b 12

cc.txt

a 11
b 13
c 15

awk join主要是用到连个内置的变量 NR,FNR,先看这的区别

awk '{print NR,FNR,$0}' bb.txt cc.txt
1 1 a 10
2 2 b 12
3 1 a 11
4 2 b 13
5 3 c 15

NR是读取所有的行号

FNR读取每个文件的行号索引号,当文件发生变化时,FNR从1开始计算

当NR=FNR时读的是第一个文本,当NR=FNR时读的是第二个文本,那么跟awk读取文件关键的思路就是先读第一个文件,然后匹配第二个文件中是否存在。

awk 'NR==FNR{s[$1]=$2}NR!=FNR{print $0,s[$1]}' bb.txt cc.txt 
a 11 10
b 13 12
c 15 

这个其实是ccl eft outer join bb,稍微解读一下。

当NR==FNR,其实就是s[a]=10 s[b]=12

当NR!=FNR时,就是$1 也就是a,b为索引,去cc.txt中查找

做全关联时,也就是join时可以用下列方法

awk 'NR==FNR{s[$1]=$2}NR!=FNR && s[$1]{print $0,s[$1]}' bb.txt cc.txt 
a 11 10
b 13 12
awk 'NR==FNR{s[$1]=$2}NR!=FNR && $1 in s {print $0,s[$1]}' bb.txt cc.txt 
a 11 10
b 13 12

这两种方法其实是一样的。

 

posted on 2016-11-30 14:06  无尽的缥缈  阅读(1499)  评论(0编辑  收藏  举报