구분 기호를 사용하여 두 번째 열을 기준으로 두 파일의 첫 번째 열을 비교합니다.

구분 기호를 사용하여 두 번째 열을 기준으로 두 파일의 첫 번째 열을 비교합니다.

다음 두 파일을 비교해야 합니다.

이것 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.
  • {...} 이 블록은 두 번째 파일의 모든 줄에 적용됩니다 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

관련 정보