次の 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
ベストアンサー1
そして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
。
- {...}このブロックは、2番目のファイルのすべての行に適用されます
head_file
。つまり、次のようになります。print ...
この値は、以前に作成された配列の対応する値とともに印刷されます。値が[$2]*1
空の場合、ANDの乗算は*1
0で終わります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