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その値が配列に存在するか、カウンタがゼロでないかをテストします。この場合、カウンタを減らして次の行に進みます。

それ以外の場合は、現在の行を印刷します。

答え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

関連情報