Linux Shell中使用awk完成兩個文件的關聯Join

Shell中的awk命令是很是強大的,有不少書籍專門介紹awk的。本文介紹的只是其中很小的一個點,使用awk命令完成兩個文件的關聯join。數組

先看看awk中的兩個自身變量,NR和FNR。 awk能夠指定同時讀取多個文件,按照指定的前後順序,逐個讀取。ide

NR指的是awk所讀取到全部記錄(包括多個文件)的行數索引號,大概是Number Of Record的意思。spa

FNR只的是awk所讀取到的每一個文件中的行數索引號,當文件發生切換時候,FNR從新從1開始,大概是File Number Of Record的意思。orm

有兩個簡單的文件:索引

[liuxiaowen@getway tmp]$ cat a.txt 1,a-12,a-23,a-34,a-4[liuxiaowen@getway tmp]$ cat b.txt 2,b-24,b-45,b-5

上面第一個命令中,awk只讀取一個文件,所以NR和FNR是同樣的;get

第二個命令有兩個文件,從NR=5開始讀取第二個文件b.txt。it

由這點能夠得出一個規則:當NR==FNR時候,讀取到的內容爲第一個文件的內容,當NR!=FNR時候,讀取到的內容是第二個文件的。class

看下面的命令:awk

[liuxiaowen@getway tmp]$ awk -F',' 'NR==FNR{a[$1]=$2;}NR!=FNR{print $0,a[$1]}' b.txt a.txt 1,a-1 2,a-2 b-23,a-3 4,a-4 b-4

從輸出的結果來看,已經將兩個文件經過第一列的值join起來,準確的說是a.txt left outer join b.txt.stream

解釋一下這個命令:

第一部分:

NR==FNR{a[$1]=$2;}

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{print $0,a[$1]}

當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中不存在。

若是是將兩個文件作內關聯:

[liuxiaowen@getway tmp]$ awk -F',' 'NR==FNR{a[$1]=$2;}NR!=FNR && a[$1] {print $0,a[$1]}' b.txt a.txt  2,a-2 b-24,a-4 b-4

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

讀取第二個文件的內容,而且第二個文件的$1在數組中存在,也能夠寫成 $1 in a

[liuxiaowen@getway tmp]$ awk -F',' 'NR==FNR{a[$1]=$2;}NR!=FNR && $1 in a {print $0,a[$1]}' b.txt a.txt      2,a-2 b-24,a-4 b-4
相關文章
相關標籤/搜索