使用awk比較兩個檔案的內容
阿新 • • 發佈:2021-11-20
乾貨記錄
[Linux] 使用awk比較兩個檔案的內容
當需要比較A , B兩個檔案 , A檔案中存在 , 並且把也在B檔案中存在的行去除掉 , 可以使用這個awk的用法來
awk '{if(ARGIND==1) {val[$0]}else{if($0 in val) delete val[$0]}}END{for(i in val) print i}' A B
使用awk的同時處理多檔案功能,配合陣列變數來進行處理
先掃描檔案A,把檔案A中的每行作為陣列的key放入陣列
再掃描檔案B,判斷B中的每行是否存在於陣列中,如果存在就刪除這個陣列元素
最後統一列印陣列中的key
檔案準備
建立兩個檔案,分別為a.txt和b.txt,它們所含內容分別為:
a.txt | b.txt |
---|---|
1-wfhune2-chdamnsbchj3-uyr92fiubkqw5-cgvdnsb | 2-djyv4-dvcahsgdb5-wvchdfyt |
普通用法,整行對比
命令 | diff a.txt b.txt | grep -f a.txt b.txt | grep -vf a.txt b.txt |
---|---|---|---|
解釋 | 比較兩個檔案 | 取兩個檔案中都有的行 | 取b檔案中有,但a檔案中沒有的行 |
結果 | 1,4c1,3< 1-wfhune< 2-chdamnsbchj< 3-uyr92fiubkqw< 5-cgvdnsb---> 2-djyv> 4-dvcahsgdb | 空 | 2-djyv4-dvcahsgdb5-wvchdfyt |
高階用法,每行關鍵部分對比
回顧一下兩個檔案中的內容,格式都是 x-yyyy這種格式,我們認為x為鍵,yyyy為值。現在我們只想比較x,而不關心yyyy。
該怎麼辦呢?
命令 | grep -vf <(cut -d - -f 1 a.txt) <(cat b.txt) | grep -vf <(awk -F"-" '{print $1}' a.txt) <(cat b.txt) |
---|---|---|
解釋 | <() 用於命令巢狀。cut -d - -f 1 a.txt,其中引數-d 用於定義分隔符,引數-f 用於定義分割後要提取第幾段文字。比如這裡定義分隔符為"-",並提取分割後的第一段文字。 | 這裡只是用awk命令替換了cut命令,作用相同。awk 的 -F引數用於定義分隔符,printf $X 提取分割後的第X段文字。 |
結果 | 4-dvcahsgdb | 4-dvcahsgdb |