我需要比较以下两个文件。
这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