使用分隔符根据第二列比较 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文件内容现在存储在一个a用索引$2和值调用的数组中$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

相关内容