當我們使用awk整合文件的時候,如果是兩個文件,我們經常會用NR==FNR和NR!=FNR兩個來指定讀取第一個或者是第二個文件,但是如果涉及到三個及以上文件這種方式就不適用,除非我們使用前面兩個文件的方式,生成第三者,在用第三者進行整合,也是可以實現,但是這樣子多了個第三者,而且顯得比較笨拙。我們可以使用如下三種通用方式來實現awk多文件的讀取和處理:
第一種: awk 'ARGIND==1{...}ARGIND==2{...}ARGIND==3{...} ...' file1 file2 file3 ...
第二種:awk 'FILENAME==ARGV[1]{...}FILENAME==ARGV[2]{...}FILENAME==ARGV[3]{...}...' file1 file2 file3 ...
第三種:awk 'FILENAME=="file1"{...}FILENAME=="file2"{...}FILENAME=="file3"{...}...' file1 file2 file3 ...
以上方式可以用來處理兩個及以上文件。如下是針對以上的一個示例:
本例共使用三個文件,分別是hh、zz、xx
hh文件內容:
1234 huang
456 zhi
789 xiong
zz文件內容:
13141234 zhang
1314456 dong
1314789 hua
xx文件內容:
1234 || 13141234
456 Love 1314456
789 || 1314789
例一:將xx文件當中的第一列和hh第一列一樣的用hh的第二列替換
命令:awk 'NR==FNR{a[$1]=$2}NR!=FNR{print a[$1],$2,$3}' hh xx
執行結果如下
NR==FNR代表讀第一個文件
a[$1]=$2代表將第一個文件即(hh)當中第一列作為a數組的鍵,$2作為a[$1]的值
NR!=FNR代表讀第二個文件
print a[$1],$2,$3 代表將第二個文件(即xx)當中的第一個列作為a數組的鍵,即a[$1],此時得到的值就是在第一個文件給a[$1]賦予的值
例二:將xx文件當中的第一列以及第三列分別和hh以及zz第一列對應起來,分別取對應hh和zz第二列的值替換到xx文件當中
命令:awk 'ARGIND==1{a[$1]=$2}ARGIND==2{b[$1]=$2}ARGIND==3{print a[$1],$2,b[$3]}' hh zz xx 或者采用其他兩種方式
執行結果如下:
ARGIND==1代表處理第一個文件
ARGIND==2代表處理第二個文件
ARGIND==3代表處理第三個文件.........類似
數組鍵值對處理邏輯與例一當中一致