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
这两种方法其实是一样的。