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