Text-Processing
使用分隔符根據第二列比較 2 個文件的第一列;
我需要比較以下 2 個文件。
head_file
: _2345;int builder( 1000;char type::edit::display <test>( 250;void unamed_string_tree*
ref_file
: _2000;int builder( 500;char type::edit::display <test>( 3000;fillTest*(
期望的輸出:
FUNCTION,HEAD,REF,DIFF int builder(,2345,2000,-345 char type::edit::display <test>(,1000,500,-500 void unamed_string_tree*,250,0,-250 fillTest*(,0,3000,3000
與
awk
:awk -F";" 'BEGIN{OFS=","; print "FUNCTION,HEAD,REF,DIFF"} FNR==NR{a[$2]=$1;next} {print $2,$1,a[$2]*1,a[$2]-$1; delete a[$2]} END{for (i in a){print i,0,a[i],a[i]}}' ref_file head_file
解釋:
-F";"
指定分號;
作為分隔符。在讀取第一個輸入記錄之前,該
BEGIN{...}
規則只執行一次。在該規則中,OFS
(輸出欄位分隔符)設置為逗號,
並列印標題行:FUNCTION,HEAD,REF,DIFF
.
FNR==NR
適用於正在處理的第一個文件:ref_file
.
a[$2]=$1;next
文件內容現在儲存在一個a
使用 index$2
和 value呼叫的數組中$1
。{…} 該塊適用於第二個文件的每一行,即
head_file
:
print ...
這些值與先前創建的數組中的相應值一起列印。通知[$2]*1
;當值為空時,與*1
以零結束的乘法0
。delete a[$2]
:完成後刪除數組元素。在讀取最後一個輸入記錄之後,該
END{...}
規則只執行一次。
for (i in a)``a
:循環遍歷尚未刪除的數組的其餘部分。print ...
: 列印它的索引和值。輸出:
FUNCTION,HEAD,REF,DIFF int builder(,2345,2000,-345 char type::edit::display <test>(,1000,500,-500 void unamed_string_tree*,250,0,-250 fillTest*(,0,3000,3000