已知文件1.txt和2.txt

cat 1.txt

1 a
2 a
3 a
4 b
5 c
6 c
7 d

cat 2.txt

a 10
b 20
c 30
d 40

要求:通过awk将以上两个文件合并成如下效果

1 a 10
2 a 10
3 a 10
4 b 20
5 c 30
6 c 30
7 d 40

解答:

awk 'NR==FNR{m[$1]=$2}NR>FNR{print $0,m[$2]}' 2.txt 1.txt

知识点:

NR为awk命令读取记录的数目

FNR为awk命令读取当前文件的记录的数目

在此例中,awk首先读取的是2.txt文件,然后读取的是1.txt文件,在awk命令读取完2.txt最后一条记录时,NR=FNR,都等于4,当awk命令开始读取1.txt的第一条记录时,NR=5,而FNR=1。这就是NR和FNR的区别。


解释:

m[$1]=$2是把第一个文件(2.txt)的第二列复制给以第一列为key的数组,当NR>FNR时,awk命令读到了第二个文件(1.txt),要取出数组m的值,就要找到相应的key值,key值对应第二个文件的第二列,就是m[$2]。