天天看點

Linux Shell中使用awk完成兩個檔案的關聯Join

Shell中的awk指令是非常強大的,有很多書籍專門介紹awk的。本文介紹的隻是其中很小的一個點,使用awk指令完成兩個檔案的關聯join。

先看看awk中的兩個自身變量,NR和FNR。 awk可以指定同時讀取多個檔案,按照指定的先後順序,逐個讀取。

NR指的是awk所讀取到所有記錄(包括多個檔案)的行數索引号,大概是Number Of Record的意思。

FNR隻的是awk所讀取到的每個檔案中的行數索引号,當檔案發生切換時候,FNR重新從1開始,大概是File Number Of Record的意思。

有兩個簡單的檔案:

上面第一個指令中,awk隻讀取一個檔案,是以NR和FNR是一樣的;

第二個指令有兩個檔案,從NR=5開始讀取第二個檔案b.txt。

由這點可以得出一個規則:當NR==FNR時候,讀取到的内容為第一個檔案的内容,當NR!=FNR時候,讀取到的内容是第二個檔案的。

看下面的指令:

從輸出的結果來看,已經将兩個檔案通過第一列的值join起來,準确的說是a.txt left outer join b.txt.

解釋一下這個指令:

第一部分:

a是一個數組;當NR==FNR,也就是讀取第一個檔案的内容(第一個檔案就是後面的b.txt),以b.txt中的$1作為數組索引号,以b.txt中的$2作為數組的值;

是以,第一部分過後,有了一個數組a,具體的值為 a[2]=”b-2″, a[4]=”b-4″, a[5]=”b-5″

再看第二部分:

當NR!=FNR時候,也就是讀取第二個檔案的内容(a.txt),print $0(列印a.txt中的内容),以及a[$1],這裡的含義是以a.txt中的$1為索引号,去數組a中擷取值,因為之前數組a中的索引号有2,4,5;是以a.txt中第一列為2和4的記錄從數組a中擷取到了值,1,3,5在數組a中不存在。

如果是将兩個檔案做内關聯:

變了一個條件:NR!=FNR && a[$1]

讀取第二個檔案的内容,并且第二個檔案的$1在數組中存在,也可以寫成 $1 in a

本文轉自 SoulMio 51CTO部落格,原文連結:http://blog.51cto.com/bovin/1873090,如需轉載請自行聯系原作者

繼續閱讀