Text-Processing

使用分隔符根據第二列比較 2 個文件的第一列;

  • September 27, 2015

我需要比較以下 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

引用自:https://unix.stackexchange.com/questions/232079