区切り文字を使用して、2番目の列に基づいて2つのファイルの最初の列を比較します。

区切り文字を使用して、2番目の列に基づいて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

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

おすすめ記事