Linux Shell: awk利用索引合併檔案
找到兩個檔案含有共同索引的行, 併合並行
示例檔案
a.txt
1 a 2 b 3 c 4 d
b.txt
2 x 3 y 1 z
檔案特徵: 第一列為共同索引, 期望根據a.txt
的第一列的值找到b.txt
相同的值並拼接成一行
上程式碼
$ awk 'NR==FNR{a[$1]=$2;next} NR>FNR{if($1 in a)print $0, a[$1]; else print $0}' b.txt a.txt 1 a z 2 b x 3 c y 4 d
原理解析
先看一下文件man awk
NRThe total number of input records seen so far. # 從最開始執行到現在處理的記錄總行數 FNRThe input record number in the current input file. # 當前檔案的當前處理行數
第一段程式碼:NR==FNR
代表當前讀取的是第一個檔案. 然後把第一個檔案的需要的列內容記錄在數組裡面, 並定義好資料索引
NR==FNR{a[$1]=$2;next}
第二段程式碼:NR>FNR
代表當前讀取的是第二個檔案. 通過第一列索引從陣列a[]
裡面拉取之前已快取的記錄. 如果數組裡面找不到就直接輸出當前內容
NR>FNR{if($1 in a)print $0, a[$1]; else print $0}
這條命令類似於mysql的left join查詢
SELECT a.id, a.v, b.v FROM a LEFT JOIN b ON (a.id = b.id);
文章來源:ofollow,noindex">https://www.derror.com/log/linux-shell-awk-combine-files