다음 두 파일을 비교해야 합니다.
이것 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
.
- {...} 이 블록은 두 번째 파일의 모든 줄에 적용됩니다
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