awk를 사용하여 일치하는 행 없이 file2 대신 file1에서 행을 찾습니다.

awk를 사용하여 일치하는 행 없이 file2 대신 file1에서 행을 찾습니다.

file1에는 내 신용카드 청구 내역 목록이 포함되어 있습니다.

A            B
1/1/2020     $12.50
1/3/2020     $10.00
1/5/2020     $99.15
1/6/2020     $35.50
1/8/2020     $99.00

file2에는 합법적인 구매 목록이 포함되어 있으며 날짜가 반드시 일치할 필요는 없지만 B열의 금액은 일치해야 합니다.

A            B
12/31/2020   $12.50
1/4/2020     $99.15
1/6/2020     $99.00

일치를 위해 열 B를 사용하면 file2에 일치하는 레코드가 없는 file1의 레코드를 어떻게 찾을 수 있습니까?

A            B
1/3/2020     $10.00
1/6/2020     $35.50

미리 감사드립니다!

답변1

$ awk 'NR==FNR{cnt[$2]++; next} (FNR==1) || (--cnt[$2] < 0)' file2 file1
A            B
1/3/2020     $10.00
1/6/2020     $35.50

답변2

awk -F'$' '
  FNR==NR{ if (FNR>1){ a[$2]++} next }
  $2 in a && a[$2]{ a[$2]--; next }
  1
' file2 file1

값을 file2배열에 저장하고 카운터를 증가시켜 헤더 행을 건너뜁니다. 다음 줄로 계속 진행하세요.

처리하는 동안 file1해당 값이 배열에 존재하는지, 카운터가 0이 아닌지 테스트합니다. 이 경우 카운터를 감소시키고 다음 줄로 계속 진행합니다.

그렇지 않으면 현재 줄을 인쇄합니다.

답변3

글쎄요, 그렇지는 않습니다 awk. 조금 지저분하지만 경기에 대한 더 많은 정보를 제공합니다.

join -a 2 -j 2 <(sort -k 2 legit) <(sort -k 2 charged)

그리고 awk위의 다른 변형

awk 'NR==FNR{legit[$2]++; next}{legit[$2]--}legit[$2]<0{legit[$2]=0; print}' legit charged

답변4

주문하다

awk 'NR==FNR{a[$2];next}!($2 in a){print $0}' file2 file1

산출

1/3/2020     $10.00
1/6/2020     $35.50

관련 정보